Имя: Пароль:
1C
1С v8
Почему не используется индекс по номенклатуре?
0 Sun_Storm
 
03.02.16
09:01
Доброго времени суток.

1С 8.2.19.106
В базу добавил индекс по номенклатуре для регистра ПартииТоваровНаСкладах

Есть такой запрос:

ВЫБРАТЬ
    ПартииТоваровНаСкладах.Номенклатура КАК Номенклатура,
    ПартииТоваровНаСкладах.Количество
ИЗ
    РегистрНакопления.ПартииТоваровНаСкладах КАК ПартииТоваровНаСкладах
ГДЕ
    ПартииТоваровНаСкладах.Номенклатура = &Номенклатура

В плане запроса используется Clustered Index Scan.

Кто-нибудь может сказать, почему не используется индекс по номенклатуре?
1 Лефмихалыч
 
03.02.16
09:02
потому, что номенклатура - не первое измерение, видимо
2 NcSteel
 
03.02.16
09:06
(0)

[ОРРХ | ОРНР1 +] Измерение + Период + Регистратор + НомерСтроки

Измерению "Измерение" задано свойство "Индексировать".

Есть ли разделители?
3 Лефмихалыч
 
03.02.16
09:06
+(1) это ответ на вопрос, "Почему scan, а не seek".
А ответ на вопрос, почему скнируется кластерный индекс, а не индекс по измерению, - потому, что у тебя в выборке номенклатура и ее выгоднее сразу получить из кластера, чем сначала найти на нее указатель и потом получить ао указателю.
4 Лефмихалыч
 
03.02.16
09:07
(2) да нормально все - тут кластерный и надо было использовать. Оптимизатор, который в sql, в данном случае оказался умнее оптимизатора, который за клавиатурой
5 NcSteel
 
03.02.16
09:07
(3) + если в таблице небольшое количество записей и эти записи в большинстве своем "уникальны".
6 NcSteel
 
03.02.16
09:08
(4) Согласен, что оптимизатор решает все сам... надо смотреть статистику.
7 los_hooliganos
 
03.02.16
09:10
(3) в (2) не указано что индекс кластерный.
8 los_hooliganos
 
03.02.16
09:11
(0) Я призываю вообще отказаться от кластерного индекса.
Удали его и посмотри как быстрее начнет работать запрос.
9 NcSteel
 
03.02.16
09:13
(9) Экстрим ))))

может надо просто обновить статистику или еще чего... Либо есть объективные предпосылки.
10 Cyberhawk
 
03.02.16
09:20
Потому что селективность (номенклатура часто встречается у тебя в регистре и оптимизатор решает, что неразумно искать по индексу и выбирает сканирование всей таблицы)
11 Sun_Storm
 
03.02.16
09:23
Разделителей нет.
Поле проиндексировано.
Не важно, какое это измерение, это же не таблица итогов, нету автоиндекса по измерениям (но оно таки первое).

Результат запроса - 26 000 записей
Всего записей в регистре - 819 000

Статистику обновлял перед тестом, делал
UPDATE STATISTICS dbo._AccumRg26165 WITH FULLSCAN
потом
DBCC FLUSHPROCINDB(14)
12 Cyberhawk
 
03.02.16
09:24
(11) См. (10) и узбагойся
13 Sun_Storm
 
03.02.16
09:34
Может, действительно оптимизатору выгоднее здесь сканировать кластерный индекс.

А вообще эта задача выросла из другой: если ограничить ещё в запросе по периоду, то будет Clustered Index Seek по периоду, хотя можно было бы сделать Index Seek по индексу с номенклатурой (там первое поле номенклатура, второе период).

Если такой запрос выполнится в транзакции, то он заблокирует весь месяц, хотя мог бы заблокировать только по конкретной номенклатуре в пределах месяца.
Думаю, может чего-то у меня с индексом не так или есть пути обхода.

Ну раз нет, то придётся смириться...
14 Лефмихалыч
 
03.02.16
09:35
(7) и чо теперь?
15 Лефмихалыч
 
03.02.16
09:38
(13) ты рассуждаешь о материях, которых не понимаешь
16 Sun_Storm
 
03.02.16
09:41
(15) Чего же я не понимаю?
17 Лефмихалыч
 
03.02.16
09:43
(16) ты не понимаешь, почему оптимизатор выбрал кластерный индекс и не понимаешь, почему это было правильное решение.
18 Sun_Storm
 
03.02.16
09:53
(17) Я могу это понять. Но чтобы лучше это понимать я об этом тут и рассуждаю. Вот ты мне на вопрос ответил и я стал ближе к пониманию. Спасибо тебе.

Когда буду изучать работу оптимизатора обязательно обращу внимание на то, в каких случаях и насколько кластерный индекс предпочтительнее некластерного (насколько тяжело искать данные по указателям)
19 Лефмихалыч
 
03.02.16
09:54
(18) рекомендую к курению настольную книгу эксперта по технологическим вопросам
20 Sun_Storm
 
03.02.16
10:00
(19) Я её уже 2 раза скурил, но что-то по данному вопросу ответ пропустил.

Может там это надо между строк читать? Это в теме про индексы или планы запросов? Обязательно перечитаю.
21 Карупян
 
03.02.16
10:03
(13) вроде в режиме снэпшот чтение ничего не блокирует
22 Лефмихалыч
 
03.02.16
10:09
Чой-та я устал намекать. Автор, попробуй номенклатуру из выборки уже убрать - ее из базы бестолку выбирать, ты ее до выполнения запроса и так знаешь
23 Sun_Storm
 
03.02.16
10:09
(21) 1С 8.2.19.106

В режиме снэпшот действительно блокировать не будет.
Но у меня не режим снэпшот. А переводить SQL в другой режим в обход механизмов платформы - слишком радикальное решение для моей проблемы.
24 Лефмихалыч
 
03.02.16
10:12
хотя нет, все равно будет Clustered Index Scan потому, что отборов по предыдущим измерениям нет
25 Sun_Storm
 
03.02.16
10:19
(22) Ну это тестовый пример. На самом деле там всё несколько сложнее, я просто разбираюсь поэтапно. Данный момент мне был не понятен, поэтому я сюда и написал.

Убрал количество - теперь нужный индекс используется.
Действительно, стоило протестировать вариант, когда индекс покрывающий.