Не получается оптимизировать работу отчета

1. Letos 267 14.12.16 16:21 Сейчас в теме
День добры! Ситуация в следующем.
Попался мне отчет написанный в СКД, который долго формировался. решил его оптимизировать. Начал с переписывания запроса. В результате получилась следующая оптимизация:

(проверял по стандартному "Замер производительности")
Мой запрос срабатывает : за 1 секунду
Старый запрос срабатывает: за 26 секунд

В запросе есть один параметр, при замере заполнял этот параметр вручную.
Вставляю свой запрос в СКД, проверяю время выполнения 5 секунд. Проверяю отчет с старым запрос (чьё время срабатывания 26 секунд) время выполнения те же 5 секунд.

Слышал, что если указан какой-то параметр в отборе (настройки пользователя), то если этот отбор заполнен, то СКД подставит проверку реквизита на самый "верх" запроса.

Это объясняет почему запрос который выполняется 26 секунд, в СКД выполняется за 5.
Но почему тогда мой запрос, выполняется в СКД те же 5 секунд?
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. alex-l19041 8 14.12.16 16:34 Сейчас в теме
3. Letos 267 14.12.16 16:36 Сейчас в теме
7. Xershi 1555 14.12.16 16:54 Сейчас в теме
(1) если идет речь о срезе последних, то без параметра должно работать быстрее. Это особенность платформы 8.3 с какого-то релиза!
8. Letos 267 14.12.16 16:55 Сейчас в теме
(7) Там обрабатывается много регистров, но все они Регистры Накопления.
10. Xershi 1555 14.12.16 16:57 Сейчас в теме
(8) делайте план запроса и смотрите где не оптимально. Гилевы рекламируют свой сервис попробуй через него прогнать, но 5 секунд я думаю этого не стоят!
4. Letos 267 14.12.16 16:42 Сейчас в теме
Но мне кажется. тут все же, какая-то особенность работы самого СКД
Прикрепленные файлы:
Запрос.txt
14. igel9780 173 14.12.16 18:13 Сейчас в теме
(4) Это уже оптимизированный запрос? Что же раньше-то было?
16. Letos 267 14.12.16 18:27 Сейчас в теме
(14) Первое объединение состояло из 40 строк и выполнялось 3.9 секунды. После оптимизации оно стало 120 строк и стало выполняться 0,06 секунды
18. igel9780 173 14.12.16 20:23 Сейчас в теме
(16) Первые три временные таблицы избыточные. Дальше анализировать не стал, так как проблема у разработчика явно системная. Когда разработчик избавится от этой ошибки в запросе и запрос станет втрое меньше, можно будет анализировать дальше.

Объясню, в чем ошибка. Четвертый и пятый запрос гораздо легче собирается без первых трех. Более того, вы лишили оптимизатор возможности выбора. Со временем, без индексов на первых трех временных таблицах 4 и 5 подзапросы деградируют. Но и при наличии индексов первые три временные таблицы не нужны. В пятом подзапросе надо загонять отбор по документам в параметры виртуальной таблицы (соединение избыточно).

И вот эта избыточность, которую не может оптимизировать ни СКД, ни оптимизатор SQL, она так и сквозит в ваших запросах. Дальше шестого запроса не смотрю, слишком много букв.
19. Letos 267 14.12.16 22:24 Сейчас в теме
(18)
Правильно ли я вас понял, что вы предлагаете сделать следующим образом? (Выкинул перечень что тянуть для визуального уменьшения)

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ

	СИТ_СтроительнаяСпецификацияЭлементыСтроительныхСмет.ЭлементСметы,
	СИТ_СтроительнаяСпецификацияСтроительнаяСпецификация.СтроительнаяНоменклатура,
	
ПОМЕСТИТЬ втСС
ИЗ
	Документ.СИТ_СтроительнаяСпецификация.СтроительнаяСпецификация КАК СИТ_СтроительнаяСпецификацияСтроительнаяСпецификация
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.СИТ_СтроительнаяСпецификация.ЭлементыСтроительныхСмет КАК СИТ_СтроительнаяСпецификацияЭлементыСтроительныхСмет
		ПО СИТ_СтроительнаяСпецификацияСтроительнаяСпецификация.КлючЗаписиЭлементСметы = СИТ_СтроительнаяСпецификацияЭлементыСтроительныхСмет.КлючЗаписиЭлементСметы
			И СИТ_СтроительнаяСпецификацияСтроительнаяСпецификация.Ссылка = СИТ_СтроительнаяСпецификацияЭлементыСтроительныхСмет.Ссылка
ГДЕ
	НЕ СИТ_СтроительнаяСпецификацияСтроительнаяСпецификация.Ссылка.ПометкаУдаления
ИНДЕКСИРОВАТЬ ПО
	                |	ЭлементСтроительнойСпецификации
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	СИТ_ЗаказыПоСтроительнымСпецификациямВСЗСОбороты.Регистратор КАК Регистратор
ПОМЕСТИТЬ втЭлСЗС
ИЗ
	втСС КАК втСС
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.СИТ_ЗаказыПоСтроительнымСпецификациямВСЗС.Обороты(, , Регистратор, ) КАК СИТ_ЗаказыПоСтроительнымСпецификациямВСЗСОбороты
		ПО втСС.ЭлементСтроительнойСпецификации = СИТ_ЗаказыПоСтроительнымСпецификациямВСЗСОбороты.ЭлементСпецификации

ИНДЕКСИРОВАТЬ ПО
	ЭлементСводноЗаказнойСпецификации,
	Регистратор,
	ЭлементСтроительнойСпецификации
;
Показать


Если нет, то не могли бы вы внести корректировки связанные с вашим предложением?
22. igel9780 173 15.12.16 07:33 Сейчас в теме
(19) По-хорошему, стоит перепоставить задачу, и собрать запрос с нуля.
24. Letos 267 15.12.16 09:57 Сейчас в теме
(22) Попробовал ваш вариант. Хотя ещё на сообщении (18) уже отнесся к нему скептически, но подумал мало ли я чего-то не знаю. Ваш вариант (замены 1-5 пакета в 2) (не всего кода) срабатывает за 4 секунды (после кэширования 3,9), мой, как вы выразились "с избыточными соединениями" за 0,06 секунды, (после кэширования за 0,02 секунды). Весь код при вашем варианте срабатывает за 26,39 секунды, мой за 1. Что как бы показывает, что ваш вариант не является оптимальным.

"Но я подозреваю, что и этот и следующий запрос оба являются ошибкой проектирования. " - там вся база ошибка проектирования. Базу спроектировали так успешно, что при работе 20 человек за 2 года, база имеет размер 100 гигабайт.

А это чужой запрос, решил его оптимизировать. Что в принципе получилось, Но СКД все портит =(
Arkhan-Land; +1 Ответить
26. igel9780 173 15.12.16 10:07 Сейчас в теме
(24) Поймите, прямое указание к действию я могу дать, только если сам отлажу запрос. Я вам дал общее направление, у вас запрос перенасыщен. Скорее всего, по всему телу запроса. Попробуйте понять, что должно получиться в результате запроса, а потом построить его с нуля, а не оптимизировать эту портянку.

Вот посмотрите тему. Это, конечно, не ваш случай, но он очень нагляден по тому, как люди наворачивают лишнего, и получают бред.
http://forum.infostart.ru/forum9/topic163846/
корум; Letos; +2 Ответить
27. igel9780 173 15.12.16 10:09 Сейчас в теме
(24) И да. Покажите, как вы преобразовали ваш запрос в типа "мой". (;Ж
28. Fox-trot 163 15.12.16 10:12 Сейчас в теме
(27) Паша, расслабься. ТС уже давно в отпуск свалил :)
Ганс; igel9780; +2 Ответить
29. Ганс 15.12.16 10:17 Сейчас в теме
(24)СКД не портит, а как раз оптимизирует!
СКД в виртуальных таблицах остатков и оборотов вставляет свои параметры(если вы добавите в запросе таблицу, например ОстаткиТоваровНаСкладах и не добавите к ней ни одного параметра, на вкладке СКД "параметры" вы всё равно увидите стандартный параметр(по моему "период", но не уверен), он может быть не заполнен!)

По оптимизации: после обработки СКД старого запроса, количество таблиц так и осталось или их стало меньше?)
23. MakcTLT63 5 15.12.16 08:01 Сейчас в теме
Посмотрел текст запроса. Согласен с (18) - первые три временные таблицы явно лишние. Это текст уже после оптимизации?
5. herfis 513 14.12.16 16:48 Сейчас в теме
Если используются пользовательские отборы, то умная СКД догадывается их впиндюрить в параметры виртуальных таблиц. Это если мы говорим о режиме автозаполения настроек СКД и стандартных названиях полей.
6. Letos 267 14.12.16 16:53 Сейчас в теме
(5) Сан Саныч, Это объясняет как Старый запрос вместо 26 секунд выполняется 5. Так почему мой запрос выполняется дольше?
9. Xershi 1555 14.12.16 16:55 Сейчас в теме
(6) есть еще ситуация с кэшированием. 1 раз выполнили запрос, затем если его повторно вызвать, то будет уже быстрее. Посмотрите курс по запросам, возможно вам этого не хватает для разработки!
11. Letos 267 14.12.16 17:01 Сейчас в теме
(9) Про кэширвоание я знаю, Спасибо.

(10) Да не стоят. Но тут уже вопрос принципа. Я день убил ускоряя работу запроса, добился эффективности в 26 раз. А в итоге все в пустую, хочу понять перво причину. С тем что исходный запрос срабатывает быстрее, думаю разобрался, все из-за того, что "умного СКД которая впендюривает параметры отбора во временные таблицы".

Но почему мой запрос работает дольше? Мне это не понятно.
13. herfis 513 14.12.16 17:37 Сейчас в теме
(11) Ты не говорил про дольше. Ты говорил про "те же 5 секунд". Просто отборы сводят размер обрабатываемых данных до таких, на которых оптимизация еще не дает эффекта. Там ведь зависимость может еще и нелинейная быть.
12. Ганс 14.12.16 17:28 Сейчас в теме
Закинь свою схему компоновки в консоль КД и посмотри какой запрос на самом деле выполняет твой отчёт при настроенном отборе! Думаю что по факту вы получите ваш же оптимизированный запрос(ну или примерно его)!

СКД меняет запрос в зависимости от отборов, выходных полей итд!
15. Letos 267 14.12.16 18:18 Сейчас в теме
В разных местах запроса стоит такой текст



Как это расшифровать или где понять как это интерпретировать?

ПРИМЕР ТЕКСТА:

РегистрНакопления.СИТ_ЗаказыПоСЗС.Обороты(&П, , Регистратор, )

Я так понимаю, это и есть изменения которые внес СКД, но они стоят там где указывается период в РН.Обороты. Но я указываю только один параметр отбора с типом Справочник. Так что же это за П ?
17. vadim1011985 101 14.12.16 18:30 Сейчас в теме
&П - явно передается период в данном случае это Дата начала периода
20. MakcTLT63 5 14.12.16 22:34 Сейчас в теме
Работал себе запрос. Всех устраивало. Нет надо залезть все сломать и потом на форуме удивляться почему не стало лучше. мне бы такую работ. Сидишь ничего не делаешь, код оптимизируешь...
Да еще и предыдущего программиста обложили нехорошими словами наверное..
21. igel9780 173 15.12.16 07:32 Сейчас в теме
Да, по первому подзапросу начнет работать оптимизатор SQL уже. Теперь он сможет предложить эффективный план запроса, если на нужных полях окажутся индексы. Но я подозреваю, что и этот и следующий запрос оба являются ошибкой проектирования.

База 1С должна быть спроектирована так, что бы все запросы шли исключительно по регистрам. Естественно, возможны исключения. Но не там, где у вас запросы выполняются 5 и 26 секунд.

По второму подзапросу:
1. РегистрНакопления.СИТ_ЗаказыПоСтроительнымСпецификациямВСЗС.Обороты(, , Регистратор, ЭлементСпецификации В (ВЫБРАТЬ ЭлементСтроительнойСпецификации ИЗ втСС КАК втСС)) - надо это или нет, зависит от специфики таблиц.
2. Выборка из любого периодического регистра должна в первую очередь ограничиваться периодом. Поэтому параметры периодов делаем обязательными, а в особо тяжёлых случаях, ограничиваем у пользователя возможность формировать данные за 15 лет.
3. А там точно необходимо левое соединение? А оно не обрезается нигде позже?
25. igel9780 173 15.12.16 10:02 Сейчас в теме
Не СКД портит, а запрос такой. Я прикопался к первым 5 пакетам просто потому что разбирать дальше у меня нет времени и возможности. А вообще, не исключено, что 1-5 пакет вообще не нужен, так же как не нужен 1-3. Ну разве что, у вас SQL-Server 2000 и ниже.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот