Вход | Регистрация

  1  2
1С:Предприятие :: 1С:Предприятие 8 общая

Спецам SQL. Тормоза в списке документов (обычные формы, 8.2, SQL)

Спецам SQL. Тормоза в списке документов (обычные формы, 8.2, SQL)
Я
   ptiz
 
30.10.17 - 10:38
Вводные данные:
Платформа 8.2.18.109, SQL 2008 standard
SQL-ю выделено 320 Гб ОЗУ, база на SSD, с проведением документов проблем нет.

Простая форма списка документов (Реализация товаров) и журнала (Реализации и возвраты).
При листании списка иногда возникают тормоза по 1.5-2 секунды на страницу (PgUp/PgDown).

Размеры таблиц:
_Document240 (шапка реализаций) - 40Гб (8 млн. документов, всё лишнее удалено)
_DocumentJournal7838 - смешные 8Гб.


Профайлер показывает большой Duration на запросе:

SELECT TOP 51
_Document240_R._Date_Time AS _A1,
_Document240_R._Number AS _A2,
_Document240_R._Fld6451 AS _A3,
_Document240_R._IDRRef AS _A4RRef,
_Document240_R._Marked AS _A5,
_Document240_R._Posted AS _A6,
_Document240_R._Fld6439RRef AS _A7RRef
FROM
_Document240 _Document240_R WITH(NOLOCK)
WHERE
_Document240_R._IDRRef > P1 AND _Document240_R._Date_Time = @P2 AND _Document240_R._Date_Time >= @P3 AND _Document240_R._Date_Time <= @P4 OR
_Document240_R._Date_Time > @P5 AND _Document240_R._Date_Time >= @P6 AND _Document240_R._Date_Time <= @P7
ORDER BY
_Document240_R._Date_Time,
_Document240_R._IDRRef

план запроса
https://yadi.sk/i/dR_S9q0z3PDPuL




Аналогичная картина с журналом документов (реализации и возвраты вместе):

SELECT TOP 48
_DocumentJournal7838_R._Date_Time AS _A1,
_DocumentJournal7838_R._Number AS _A2,
_DocumentJournal7838_R._Fld7841 AS _A3,
_DocumentJournal7838_R._DocumentTRef AS _A4TRef,
_DocumentJournal7838_R._DocumentRRef AS _A4RRef,
_DocumentJournal7838_R._Marked AS _A5,
_DocumentJournal7838_R._Posted AS _A6
FROM
_DocumentJournal7838 _DocumentJournal7838_R WITH(NOLOCK)
WHERE
_DocumentJournal7838_R._DocumentRRef > P1 AND _DocumentJournal7838_R._Date_Time = @P2 AND _DocumentJournal7838_R._DocumentTRef = @P3 AND _DocumentJournal7838_R._Date_Time >= @P4 AND _DocumentJournal7838_R._Date_Time <= @P5 OR
_DocumentJournal7838_R._DocumentTRef > @P6 AND _DocumentJournal7838_R._Date_Time = @P7 AND _DocumentJournal7838_R._Date_Time >= @P8 AND _DocumentJournal7838_R._Date_Time <= @P9 OR
_DocumentJournal7838_R._Date_Time > P10 AND _DocumentJournal7838_R._Date_Time >= P11 AND _DocumentJournal7838_R._Date_Time <= P12
ORDER BY
_DocumentJournal7838_R._Date_Time,
_DocumentJournal7838_R._DocumentTRef,
_DocumentJournal7838_R._DocumentRRef

план запроса
https://yadi.sk/i/hvoQh2RU3PDPrH



Что можно подкрутить в SQL, чтоб он листал быстрее?
 
 
   Sasha_H
 
101 - 03.11.17 - 23:44
а поиск ключа если я не ошибаюсь происходит в случае, когда выводятся колонки которые вне индекса.
   Sasha_H
 
102 - 03.11.17 - 23:52
В этом запросе я непонял зачем дважды выводиться одна и таже ссылка?

_DocumentJournal7838_R._DocumentTRef AS _A4TRef,
_DocumentJournal7838_R._DocumentRRef AS _A4RRef,

И вот:
ORDER BY
_DocumentJournal7838_R._Date_Time,
_DocumentJournal7838_R._DocumentTRef,
_DocumentJournal7838_R._DocumentRRef
   Sasha_H
 
103 - 03.11.17 - 23:53
у вас, что там соединения с ТЧ какие-то?
   mistеr
 
104 - 03.11.17 - 23:56
(100) "Поиск ключа" это key lookup что ли? Некорректный перевод, это "поиск по ключу".

У автора статьи ситуация другая. У него запрос к таблице документа, там индекс по дате некластерный, а данные тянутся из кластерного, из-за этого большая трудоемкость. Тут же индекс на журнале кластерный, поэтому никаких key lookup, ничего лишнего, Index scan + top. Но почему-то медленно. Нужно смотреть статистику.
   mistеr
 
105 - 03.11.17 - 23:57
(102) Это тип + ссылка (TRef + RRef)
   Sasha_H
 
106 - 03.11.17 - 23:57
(78) Т.е. Clustered Index Scan - и всё. И это медленно.

Скан это плохо. Это значит, что он проходит таблицу сканируя. А вдолжен быть SEEK

Явно говорит о том, что нет покрытия полей в индексе
   Sasha_H
 
107 - 04.11.17 - 00:02
   Sasha_H
 
108 - 04.11.17 - 00:03
Ссылка - кластерный индекс всегда
   Sasha_H
 
109 - 04.11.17 - 00:03
[ОРРХ | ОРНР1 +] Дата + Ссылка
   Sasha_H
 
110 - 04.11.17 - 00:04
ДС и делает сортировку по дати и ссылке поскольку полагается, что это кластерный индекс
 
 Рекламное место пустует
   Borteg
 
111 - 04.11.17 - 00:06
(106) в выборе первых записей будет всегда скан, и он не сканирует всю таблицу он выбирает только первые 50 записей
   Sasha_H
 
112 - 04.11.17 - 00:08
(111) в данном случае согласен поскольку испльзуется ключевое ТОР
   youalex
 
113 - 04.11.17 - 00:08
(98) >>Просто задумайся над условием "_Date_Time = @P3"

Задумывался)) 
Сейчас вижу, что два запроса выполняется, один с "AND T3._Date_Time > @P3" (если листать вверх, то < @P3, что логично).
Второй уже, видимо, строится по результатам первого, с "_Date_Time = @P3 AND T2._DocumentTRef < @P4"

В обоих случаях - Index Seek,  ничего похожего на монструозное условие ТС нет.
   Sasha_H
 
114 - 04.11.17 - 00:10
(113) ввобще-то ДС при первом открытии имеет один вид запроса. А поотм другой. Это сделано для того-чтобы поймать курсор.

Но автору я бы настоятельно рекомендовал обновить платформу.
   Sasha_H
 
115 - 04.11.17 - 00:11
(0) Автор почитай что сделали в платформе 8.3.10 там большой уклон пошол на оптимизацию и ускорения работы и очень много работы на ДС припало.
   Borteg
 
116 - 04.11.17 - 00:16
кстати это микросекунды же, у меня в профайлере в микросекундах указывается. 1400 это вообще мизер тогда и проблема не в запросах.
   Borteg
 
117 - 04.11.17 - 00:17
ну и нету здесь decription как тогда ссылочной тип на форму попадает? в sql должно быть много доп запросов на вывод строк. этого не видно в том что дали.
   Sasha_H
 
118 - 04.11.17 - 00:17
Забили - автора давно нет тут!
   mistеr
 
119 - 04.11.17 - 00:30
(113) Показывай запросы и планы. Только текстом, пожалуйста. На pastebin очень удобно. И версии платформы и скуля.
   youalex
 
120 - 04.11.17 - 00:37
(116) не факт, это настраиваемый параметр (милли или микро)
   youalex
 
121 - 04.11.17 - 00:38
(119) Зачем? У меня все нормально))
   mistеr
 
122 - 04.11.17 - 00:48
(121) Интересно сравнить с ТС
   youalex
 
123 - 04.11.17 - 01:29
   youalex
 
124 - 04.11.17 - 01:33
(123) +
8.2.19.106
Microsoft SQL Server 2016 (SP1) (KB3182545) - 13.0.4001.0 (X64)
   mistеr
 
125 - 04.11.17 - 02:01
(123) Сейчас уточнил в BOL. INDEX SCAN это полный просмотр индекса, а INDEX SEEK - поиск по ключу. (Я привык к оракловой терминологии, где scan обозначает и то и другое.)

https://technet.microsoft.com/en-us/library/ms175184(v=sql.105).aspx
https://technet.microsoft.com/en-us/library/ms190400(v=sql.105).aspx

Так что почти все стало ясно у ТС. Скуль выбирает scan, скорее всего из-за двух OR в условии. Вместо того, чтобы сделать три раза seek и сортировку. Может, и кривая статистика вносит свой вклад.

Откуда там взялись эти OR, остается интересным.
   mexanik_96
 
126 - 04.11.17 - 06:41
про покрывающий индекс уже было?
   mexanik_96
 
127 - 04.11.17 - 06:41
вообще у автора ожидание page latch, поднятие страниц с диска есть?
   mexanik_96
 
128 - 04.11.17 - 06:44
(125) ну да с чего бы? он скан делает потому что индекса покрывающего нет по предикату
   rphosts
 
129 - 04.11.17 - 07:45
(78) всё-же сделайте как написано в (79) и ещё кроме того, попробуйте  кликнуть по колонке Дата что-бы отсортировались документы по дате и посмотрите что после этого будет со скоростью.
   Borteg
 
130 - 04.11.17 - 09:40
(125) он не сканирует всю таблицы, у него есть TOP в запросе. Он просто отбирает 50 записей сканом  и все...
   H A D G E H O G s
 
131 - 04.11.17 - 09:48
(130) Ага. Это так, если нет условия в запросе.
   Borteg
 
132 - 04.11.17 - 09:53
(131) это всегда так. В первом запросе вложенные циклы выполнялись только 51 раз, а не скан с поиском ключа и  потом выбор 51 строки. В планах нету  sort. Значит он попал в индекс по сортировки.
   ptiz
 
133 - 04.11.17 - 10:30
(93) Это не так просто. Пока 8.2 в режиме совместимости 8.1. Переходить на 8.3 (даже только смена платформы) - к тому времени или ишак, или эмир :)
(95) Всё обычное (см.заголовок).
Уточню: при листании последнего месяца - по 10 страниц в секунду пролетает.
При листании января - на каждый PgDown уходит больше секунды.

(129) После праздников попробую сортировать туда-сюда. А права и так полные.
 
 
   Злопчинский
 
134 - 04.11.17 - 10:53
Наблюдаю.
Особенно тех кто заявляет "вы не умеете её готовить"
Посмотрим...
Интересно.
   mistеr
 
135 - 04.11.17 - 11:06
(128) Все поля из предикатов есть в индексе. Индекс кластерный, так что все остальное там тоже есть, по определению.

(130) >Он просто отбирает 50 записей сканом  и все...
А какие именно 50 записей, из какого места? Ты физическую структуру индекса немного представляешь себе?
   rphosts
 
136 - 04.11.17 - 13:15
(133)  главеое сделай пустую форму чтоб ни строчки кода
   Sasha_H
 
137 - 04.11.17 - 14:27
(0) Какой период в списке? Попробуйте установить минимальный период например Текущий день.

Возможно у вас в спике используется такие понятия как ПриАктивизацииЯчейки, приПолученииДанных и т.д. Есть ли в списке вообще другие обработчики, этот список Чист без разных обработчиков?
   Sasha_H
 
138 - 04.11.17 - 14:31
сделать ТиИ - одна из рекомендаций ИТС. Но мне не нравиться, что конфа вообще в совместимости 8.1
   Sasha_H
 
139 - 04.11.17 - 14:34
(133) Я думаю многие оптимизаторы со мною согласятся - вот все работало прекрасно и замечательно и бах...

Это все проблемы так начинаются. И тут проблематика в данном случае если у Вас вообще "Чистый список" без лишнего кода при обработке данных например на лету. И Вы начинаете вот так висеть. Индексы перестроены, статистика не помогает, ТиИ тоже, диски крутые и все точка.

В данном контексте у вас 8.2 да еще на совместимости с 8.1 тоже не айс. Я уже молчу о взаимоблокировках.
   ptiz
 
140 - 04.11.17 - 18:06
(136) В форме закомментирован весь код.
Вот видео, где листаю страницами: видно, что тормозит январь, а октябрь - летает.
https://youtu.be/iju8hUr95FY
(139) Про взаимоблокировки я бы поспорил. Правильные управляемые блокировки уже в 8.1 рулят и педалят в самописках.
"вот все работало прекрасно и замечательно и бах... " - такого не было. Просто количество документов перешло в качество.
   youalex
 
141 - 04.11.17 - 19:58
(140) Попробуй, ради интереса, еще сделать обработку, в ней УФ, в УФ - дин. список с этим журналом. Какой там запрос будет генериться.
Вроде бы УФ открывается даже в режиме совместимости 81, если не внешняя.
   Злопчинский
 
142 - 04.11.17 - 20:38
Продолжаю с интересом наблюдать. Где же все специалисты, которые умеют её готовить?
   ptiz
 
143 - 07.11.17 - 12:17
Как и ожидалось, дело оказалось в платформе 1С.
Убрал режим совместимости 8.1 (платформу не менял, та же 8.2, обычные формы): сразу поменялся текст запроса к СУБД, и план запроса превратился в Clustered Index Seek.

Запрос стал такой:
SELECT TOP 43
T2._Date_Time,
T2._Fld7841,
T2._DocumentTRef,
T2._DocumentRRef,
T2._Marked,
T2._Posted
FROM _DocumentJournal7838 T2 WITH(NOLOCK)
WHERE ((T2._Date_Time >= P1) AND (T2._Date_Time <= @P2)) AND T2._Date_Time = @P3 AND T2._DocumentTRef > @P4
ORDER BY (T2._Date_Time) ASC, (T2._DocumentTRef) ASC, (T2._DocumentRRef) ASC
OPTION (FAST 1)
   ptiz
 
144 - 07.11.17 - 12:30
Кстати, модный "динамический список" в управляемой форме - тормоз страшный. До "ЖурналДокументовСписок" - ему не дотянуться.
   Sasha_H
 
145 - 14.11.17 - 21:10
(144) Кстати иметь овно конфигурацию в режиме совместимости 8.1 при этом платформа даже не 8.3 умозаключение МЕЛКОЕ!
   H A D G E H O G s
 
146 - 14.11.17 - 21:12
(144) Модный динамический список иногда незаменим.
   g00d
 
147 - 15.11.17 - 01:57
(144) идея дин.списка что вы возвращаете только то что вам нужно, начните с того что - уберите лищние колонки
  1  2

Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует