Имя: Пароль:
1C
 
Индексирование измерения в РН и план выполнения в Profiler
0 brznzglwgn
 
30.09.15
11:03
Здравствуйте,

Описание:
Допустим есть РегистрНакопления ОстаткиТоваров с измерениями:
Склад
Характеристика
Товар

Выполняется запрос
ВЫБРАТЬ
    ОстаткиТоваровОстатки.Склад,
    ОстаткиТоваровОстатки.Товар,
    ОстаткиТоваровОстатки.КоличествоОстаток
ИЗ
    РегистрНакопления.ОстаткиТоваров.Остатки(
            ,
            Склад = &Склад
                И Товар = &Товар) КАК ОстаткиТоваровОстатки

Как известно в плане будет Clustered Index Seek по Складу и дальнейшее сканирование по Товару. Для исправления этой "неоптимальности" можно подвинуть Товар наверх выше Характеристики, пропусков в индексе не будет. Будет только поиск. Все хорошо, все понятно.

Теперь - а что будет, если проиндексировать Товар? Создастся индекс по Период+Товар. В теории в плане (при должной селективности Товара) должен бы быть IndexSek по товару и далее ClusteredIndexSeek уже по складу.

Однако, в плане по факту вижу IndexSeek с последующим KeyLookup. Никаких сканов, то есть в картинке IndexSeek'a (по товару!) как будто выбирается склад. В текстовом плане также никаки[ WHERE.

На мой взгляд это не логично, ведь в индексе по товару нет никаких данных по складу.

А что Вы думаете?
1 spock
 
30.09.15
11:14
(0) "..ведь в индексе по товару нет никаких данных по складу..." - вот именно, движок с помощью операции KeyLookup по идентификатору строки спускается из индекса к таблице данных.
2 brznzglwgn
 
30.09.15
11:17
(1) Вроде так должно быть, но в картинке при наведении на IndexSeek в области Seek Predicates сидят и Товар и Склад. Тогда как по картинке из KeyLookup вытягивается только Количество.
2 + 2 = 3.9999999999999999999999999999999...