|
Долгий запрос по журналу документов. Расшифруйте, пожалуйста, план запроса. | ☑ | ||
---|---|---|---|---|
0
ptiz
09.08.21
✎
13:25
|
Долгий запрос по журналу документов.
Вот такой план запроса: https://disk.yandex.ru/i/N2MUCRsS0gZzTw Текст тут: https://disk.yandex.ru/d/yhYQKslhFK7rRQ Выполняется почти минуту, документов в журнале более 10 млн., отбор по двум проиндексированным полям. Можно ускорить? Статистику обновлял (но без fullscan). |
|||
1
ptiz
09.08.21
✎
13:26
|
Сам запрос формируется платформой при листании в списке журнала (ОФ).
|
|||
2
Волшебник
модератор
09.08.21
✎
13:27
|
Текста нет
|
|||
3
Вафель
09.08.21
✎
14:08
|
скорее всего что-то есть в привыводе
|
|||
4
ptiz
09.08.21
✎
14:17
|
(2) Текст самого запроса?
Думал, плана достаточно. Вот: SELECT TOP 44 T1._Date_Time, T1._Number, T1._Fld7839RRef, T1._Fld7849RRef, T1._Fld10451, T1._Fld17794, T1._Fld7848RRef, T1._Fld17793, T1._Fld7841, T1._Fld7850RRef, T1._Fld7840RRef, T1._Fld17792, T1._Fld10524, T1._DocumentTRef, T1._DocumentRRef, T1._Marked, T1._Posted, T2._Description, T3._Description, T4._Description, T5._Description FROM _DocumentJournal7838 T1 WITH(NOLOCK) LEFT OUTER JOIN _Reference31 T2 WITH(NOLOCK) ON T1._Fld7839RRef = T2._IDRRef LEFT OUTER JOIN _Reference59 T3 WITH(NOLOCK) ON T1._Fld7849RRef = T3._IDRRef LEFT OUTER JOIN _Reference21 T4 WITH(NOLOCK) ON T1._Fld7850RRef = T4._IDRRef LEFT OUTER JOIN _Reference101 T5 WITH(NOLOCK) ON T1._Fld7840RRef = T5._IDRRef WHERE (T1._Fld7851RRef = P1 AND T1._Fld7848RRef = @P2) ORDER BY (T1._Date_Time) ASC, (T1._DocumentTRef) ASC, (T1._DocumentRRef) ASC |
|||
5
ptiz
09.08.21
✎
14:19
|
Меня в плане запроса смущает 13301189 раз вызываемый |--Clustered Index Seek(OBJECT:([ts].[dbo].[_DocumentJournal7838]....
Правильно смущает? |
|||
6
Fragster
гуру
09.08.21
✎
14:29
|
ну он думал, что строк с отбором по складу будет сильно меньше
|
|||
7
Fragster
гуру
09.08.21
✎
14:29
|
вывод - кривая статистик
|
|||
8
Fragster
гуру
09.08.21
✎
14:31
|
"13301189 раз вызываемый" - это он отобрал по складу вместо 1 133... строк и прилеплял к нему данные из кластерного индекса для вывода. по идее нужно ударить пользователя по рукам и установить сортировку по дате вместо той, которая у него стоит.
|
|||
9
Вафель
09.08.21
✎
14:32
|
(8) разве сортировка по дате не по умолчанию?
|
|||
10
Вафель
09.08.21
✎
14:33
|
(5) что может быть лучше чем индекс сик? Ничего
|
|||
11
Fragster
гуру
09.08.21
✎
14:33
|
(9) по умолчанию. но пользователи любят потыкать в другие поля. а если там накладывается отбор - то возникают спецэффекты
|
|||
12
Fragster
гуру
09.08.21
✎
14:33
|
(10) только для случая автора там явно будет лучше скан всей таблицы
|
|||
13
Fragster
гуру
09.08.21
✎
14:34
|
без нестедлупса
|
|||
14
Fragster
гуру
09.08.21
✎
14:34
|
а, у автора и так по дате, см ORDER BY (T1._Date_Time) ASC, (T1._DocumentTRef) ASC, (T1._DocumentRRef) ASC
|
|||
15
Fragster
гуру
09.08.21
✎
14:35
|
тогда ладно, линейку можно убрать... на этот раз
|
|||
16
H A D G E H O G s
09.08.21
✎
14:37
|
Для выкладывающих планы запроса в тексте - отдельный котел.
|
|||
17
ptiz
09.08.21
✎
14:41
|
(16) План в XML
https://disk.yandex.ru/d/mqsXIKbGZ4SpLg |
|||
18
H A D G E H O G s
09.08.21
✎
15:40
|
(17) Все нормально. Лучше не получится.
Это фактический или расчетный план? Смущает расхождение ожидаемого и фактического количества данных. Попробуй Склад индексировать с доп.упорядочиванием. |
|||
19
Fragster
гуру
09.08.21
✎
15:45
|
(18) мне кажется, должно получиться, если оно не будет отбирать все документы по складу, потом прилеплять к ним дату, сортировать и выводить 44 из них. что-то со статистикой. ну, или руками подкрутить индекс по складу, чтоы в него (T1._Date_Time) ASC, (T1._DocumentTRef) ASC, (T1._DocumentRRef) добавились
|
|||
20
Fragster
гуру
09.08.21
✎
15:46
|
как работает индексирование с допупорядочиванием в журналах - я хз. вероятно как раз таким образом.
|
|||
21
Fragster
гуру
09.08.21
✎
15:46
|
надо итс открывать, но мне лень.
|
|||
22
H A D G E H O G s
09.08.21
✎
15:47
|
(19) доп упорядочение как раз и добавит
|
|||
23
ptiz
09.08.21
✎
15:53
|
(18) Событие Showplan Statistics Profile - это фактический?
Попробую доп упорядочивание. |
|||
24
Вафель
09.08.21
✎
15:54
|
так по плану соединение каждого справочника в 3 раза дороже чем чем отбора по складу и поиска полей
|
|||
25
H A D G E H O G s
09.08.21
✎
15:55
|
(23) Оно. Но если это то, что ты выложил - у тебя статистика неактуальна.
|
|||
26
H A D G E H O G s
09.08.21
✎
15:56
|
(24) Не разочаровывайте меня, Анатолий.
|
|||
27
Вафель
09.08.21
✎
15:56
|
а нет, там же нарстающим итогом цена
|
|||
28
ptiz
09.08.21
✎
15:59
|
(25) Неактуальна по каким таблицам?
|
|||
29
Fragster
гуру
09.08.21
✎
16:00
|
(28) журнала доков
|
|||
30
ptiz
09.08.21
✎
16:01
|
(29) Сделал UPDATE STATISTICS _DocumentJournal7838 with fullscan - быстрее не стало
|
|||
31
Fragster
гуру
09.08.21
✎
16:02
|
(30) так надо кэш планов сбросить
|
|||
32
Fragster
гуру
09.08.21
✎
16:02
|
после жтого
|
|||
33
H A D G E H O G s
09.08.21
✎
16:13
|
(31) Да бесполезно.
Сейчас у SQL 2 пути - найти в некластерном все записи склада, многомилионов keylook-upпом поглядеть в кластерном дату, время, ссылку и по ней сортировать эту йобу и затем вытащить 44 записи из этого. Это сейчас мы видим в плане. - Пройтись по кластерному многомиллионов записей, выбирая записи со складами, и дождаться 44 накопленных записи. Но SQL не знает, как быстро найдутся эти записи и делать так не будет, так как читать кластерный тяжело. Когда мы добавим до упорядочивание, возможно, SQL удовлетворится выборкой 44 записей результата поиска по некластерному, не подглядывая в кластерный. |
|||
34
ptiz
09.08.21
✎
16:15
|
Спасибо. Вечером запущу реструктуризацию, потом доложусь.
|
|||
35
Fragster
гуру
09.08.21
✎
16:17
|
(33) не, ну там, вроде, есть статистика по равномерности значений. и тогда он может понять, что для получения 44 записей ему достаточно будет отсканить 1000 записей кластерного...
|
|||
36
H A D G E H O G s
09.08.21
✎
16:21
|
(35) Инфу в студию. В статистику по кластерному индексу только ссылка и входит.
Но если ты покажешь гистограмму с расшифровкой, вопрос будет снят :-) |
|||
37
Fragster
гуру
09.08.21
✎
16:23
|
(36) https://docs.microsoft.com/ru-ru/sql/relational-databases/statistics/statistics?view=sql-server-ver15
во, "вектор плотностей". |
|||
38
Fragster
гуру
09.08.21
✎
16:25
|
вообще уже давно надо нейросетку туда пихнуть, чтобы она подправляла планы
|
|||
39
Fragster
гуру
09.08.21
✎
16:25
|
при сильном различии ожидаемого и реального
|
|||
40
ptiz
09.08.21
✎
21:00
|
После индексирования с доп.упорядочиванием - летает!
https://disk.yandex.ru/i/iGw0OM6Pvlgn8g |
|||
41
H A D G E H O G s
09.08.21
✎
22:46
|
(40) А скинь xml-ку
|
|||
42
Ёпрст
09.08.21
✎
22:48
|
(41) всё забываю спросить, китайщину то внедрили ?
Тоскливо, но думаю, как-ить тоже придётся архив лепить. |
|||
43
H A D G E H O G s
09.08.21
✎
23:01
|
(42) Внедрили. Работает.
|
|||
44
Ёпрст
09.08.21
✎
23:32
|
(43) я пробовал подменять на-ходу обычную марку на китайщину во всех реквизитах. Красиво не получилось. Как вы реализовали, если сканят марку в реквизит, и надо быстро найти ее значение, если она уже в базе как китайщина ?
|
|||
45
H A D G E H O G s
09.08.21
✎
23:39
|
(44) В элементе справочника Марки храню md5-хеш кода марки.
Если не нашли по коду марки - ищем по md-5 хешу марки. md-5 получаю в виде строки так: Функция ПолучитьХешМарки(КодМарки) Экспорт Хеширование=Новый ХешированиеДанных(ХешФункция.MD5); Хеширование.Добавить(КодМарки); ДвоичныеДанныеХеша=Хеширование.ХешСумма; Возврат ПолучитьСтрокуИзДвоичныхДанных(ДвоичныеДанныеХеша, "UTF-16LE"); КонецФункции |
|||
46
H A D G E H O G s
09.08.21
✎
23:39
|
(44) Ну и код марки восстанавливаю, делая ее обычной маркой.
|
|||
47
Ёпрст
10.08.21
✎
08:08
|
(45) ага, спасибо
|
|||
48
ptiz
10.08.21
✎
09:01
|
(41) https://disk.yandex.ru/d/0s2KT22BGSzjhw
А каким инструментом её смотришь? |
|||
49
H A D G E H O G s
10.08.21
✎
10:58
|
(48) MS SQL Enterprise manager
|
|||
50
Ёпрст
10.08.21
✎
13:14
|
(48)SentryOne PlanExplorer неплох
|
|||
51
Роспотребнадзор
10.08.21
✎
14:05
|
(40) а текст запроса не изменился?
|
|||
52
Роспотребнадзор
10.08.21
✎
14:31
|
Всё-таки не понятно, почему изначально начал искать в индексе _Docume7838_ByField16028_RR по полю _Fld7848RRef - это точно склад а не статус?
Потому что после добавления индекса по складу с доп. упорядочиванием условие по складу устанавливается по полю _Fld7851RRef Оч странно что такая ошибка была изначально в оценке строк... |
|||
53
Роспотребнадзор
10.08.21
✎
14:36
|
(40) куда пропало условие по второму полю?
|
|||
54
Конструктор1С
10.08.21
✎
14:47
|
(0) WHERE (T1._Fld7851RRef = P1 AND T1._Fld7848RRef = @P2)
что за поля? |
|||
55
ptiz
10.08.21
✎
15:00
|
(51) Не менялся. Всё так же ставится отбор в журнале.
(53) Да вроде не пропал. Проверил еще раз - запрос такой же. (54) Справочник и перечисление. В общем, на ИТС всё написано, просто не знал: "В варианте "Индексировать с доп. упорядочиванием" в динамическом списке может быть обеспечен эффективный просмотр больших объемов информации с отбором по значению данного реквизита и с упорядочиванием, соответствующим основному упорядочиванию для данного объекта. В этом случае наличие индекса включающего реквизит, по которому выполняется отбор, и поля основного упорядочивания позволит системе использовать индекс при просмотре списка." https://its.1c.ru/db/metod8dev/content/2742/hdoc |
|||
56
Роспотребнадзор
10.08.21
✎
15:08
|
(55)
>>Справочник и перечисление. Тогда у тебя в первом запросе сначала шел поиск по перечислению, а не по складу (55) во втором плане где у тебя поиск по _Fld7848RRef? |
|||
57
ptiz
10.08.21
✎
15:32
|
(56) Еще раз проверил.
Запрос: SELECT TOP 44 T1._Date_Time, T1._Number, T1._Fld7839RRef, T1._Fld7849RRef, T1._Fld10451, T1._Fld17794, T1._Fld7848RRef, T1._Fld17793, T1._Fld7841, T1._Fld7850RRef, T1._Fld7840RRef, T1._Fld17792, T1._Fld10524, T1._DocumentTRef, T1._DocumentRRef, T1._Marked, T1._Posted, T2._Description, T3._Description, T4._Description, T5._Description FROM _DocumentJournal7838 T1 WITH(NOLOCK) LEFT OUTER JOIN _Reference31 T2 WITH(NOLOCK) ON T1._Fld7839RRef = T2._IDRRef LEFT OUTER JOIN _Reference59 T3 WITH(NOLOCK) ON T1._Fld7849RRef = T3._IDRRef LEFT OUTER JOIN _Reference21 T4 WITH(NOLOCK) ON T1._Fld7850RRef = T4._IDRRef LEFT OUTER JOIN _Reference101 T5 WITH(NOLOCK) ON T1._Fld7840RRef = T5._IDRRef WHERE (T1._Fld7851RRef = P1 AND T1._Fld7848RRef = @P2) ORDER BY (T1._Date_Time) ASC, (T1._DocumentTRef) ASC, (T1._DocumentRRef) ASC План к нему: https://disk.yandex.ru/d/fT1bqqXiWncsgw |
|||
58
Роспотребнадзор
10.08.21
✎
16:18
|
(57) Сейчас да, поиск идет по двум полям. Но кажется что созданный индекс (кот. с доп. упорядочиванием) не при чем, т.к. в плане он не используется. Точнее его создание помогло в том плане что произошла реструктуризация, обновились индексы и старый кривой план был удален из кэша и и для этой таблицы был сформирован новый план. Почему был изначально кривой план сложно сказать, как вариант - для журнала был установлен отбор по какому-то очень редкому значению статуса, этот план закэшировался и потом из-за parameter sniffing стал использоваться для всех других значений перечисления.
|
|||
59
ptiz
10.08.21
✎
18:43
|
(58) Убрал индексирование с доп.упорядочиванием - снова список умирает.
|
|||
60
ДенисЧ
10.08.21
✎
18:51
|
(59) Теперь ты знаешь, как убить динсписок ))
|
|||
61
H A D G E H O G s
10.08.21
✎
18:51
|
(59) Базу выложить нет возможности?
|
|||
62
Роспотребнадзор
10.08.21
✎
18:53
|
(60) Это же не динсписок, у него ОФ.
|
|||
63
ptiz
10.08.21
✎
18:55
|
(61) Нет.
Погоняю еще. |
|||
64
H A D G E H O G s
10.08.21
✎
18:55
|
(62) Это форма списка журнала документов, Михаил. Там запрос то почти такой же, как в динсписке.
|
|||
65
ДенисЧ
10.08.21
✎
18:55
|
(62) А какая разница, если можно убить? )))
|
|||
66
Роспотребнадзор
10.08.21
✎
19:02
|
(59) А покажи плиз состав индекса _Docume7838_ByDocDate_TR
а) до индексирования реквизита с доп. упорядочиванием б) после включения индексирования реквизита с доп. упорядочиванием |
|||
67
Конструктор1С
10.08.21
✎
19:07
|
(56) мало инфы. Опиши подробнее, покажи структуру хранения (с индексами)
|
|||
68
ptiz
10.08.21
✎
21:30
|
Итого:
- включаю индексирование с доп.упорядочиванием только по статусу - летает - включаю индексирование с доп.упорядочиванием только по складу - тормозит Наверное так звезды сошлись для этой базы. (в тексте запроса выше: _Fld7851RRef - склад (справочник), _Fld7848RRef - статус документа (перечисление)) (66) _Docume7838_ByDocDate_TR - там _Date_Time, _DocumentTRef, _DocumentRRef. Индекс стандартный для всех журналов. Большое спасибо H A D G E H O G s за просвещение! |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |