Очень сильные тормоза

1. kot26rus 07.12.12 14:59 Сейчас в теме
Коллеги, проясните ситуацию. Имеем УТ 10.3 на 8.2.16.352. Включен партионный учет. Замером производительности определил, что при проведении расходных документов 98% времени висим на исполнении запроса к регистру партий по товарам.
ВЫБРАТЬ
	СписанныеТовары.НомерСтрокиДокумента КАК НомерСтрокиДокумента,
	ПартииТоваровНаСкладах.Номенклатура,
	ПартииТоваровНаСкладах.ДокументОприходования КАК ДокументОприходования,
	ПартииТоваровНаСкладах.ДокументОприходования.Дата КАК ДокументОприходованияДата,
	ПартииТоваровНаСкладах.Склад,
	ПартииТоваровНаСкладах.ХарактеристикаНоменклатуры,
	ПартииТоваровНаСкладах.СерияНоменклатуры,
	ПартииТоваровНаСкладах.Качество,
	ПартииТоваровНаСкладах.Заказ,
	ПартииТоваровНаСкладах.КоличествоОстаток КАК Количество,
	ПартииТоваровНаСкладах.СтоимостьОстаток КАК Стоимость,
	ПартииТоваровНаСкладах.СтатусПартии,
	ВЫБОР
		КОГДА СписанныеТовары.СерияНоменклатуры = ПартииТоваровНаСкладах.СерияНоменклатуры
			ТОГДА 0
		ИНАЧЕ 1
	КОНЕЦ КАК ЧислоСерияНоменклатуры,
	ВЫБОР
		КОГДА СписанныеТовары.ДокументПартии = НЕОПРЕДЕЛЕНО
			ТОГДА 0
		ИНАЧЕ ВЫБОР
				КОГДА СписанныеТовары.ДокументПартии = ПартииТоваровНаСкладах.ДокументОприходования
					ТОГДА 0
				ИНАЧЕ 1
			КОНЕЦ
	КОНЕЦ КАК ЧислоДокументОприходования,
	ВЫБОР
		КОГДА СписанныеТовары.ЗаказПартии = НЕОПРЕДЕЛЕНО
			ТОГДА 0
		ИНАЧЕ ВЫБОР
				КОГДА ПартииТоваровНаСкладах.Заказ = &ПустойЗаказ
					ТОГДА 1
				ИНАЧЕ 0
			КОНЕЦ
	КОНЕЦ КАК ЧислоЗаказ,
	ВЫБОР
		КОГДА ПартииТоваровНаСкладах.СтатусПартии = &НаКомиссию
			ТОГДА 1
		ИНАЧЕ 0
	КОНЕЦ КАК ЧислоСтатусПартии
ИЗ
	РегистрСведений.СписанныеТовары КАК СписанныеТовары
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.ПартииТоваровНаСкладах.Остатки(
		&Дат,
		Номенклатура В
		    (ВЫБРАТЬ
		        РегистрСведений.СписанныеТовары.Номенклатура
		    ИЗ
		        РегистрСведений.СписанныеТовары
		    ГДЕ
		        РегистрСведений.СписанныеТовары.Регистратор = &Ссылка)
		И (Склад В 
		    (ВЫБРАТЬ
		        РегистрСведений.СписанныеТовары.Склад
		    ИЗ
		        РегистрСведений.СписанныеТовары
		    ГДЕ
		        РегистрСведений.СписанныеТовары.Регистратор = &Ссылка) ИЛИ Склад = &ПустойСклад)) КАК ПартииТоваровНаСкладах
		ПО СписанныеТовары.Номенклатура = ПартииТоваровНаСкладах.Номенклатура
			И СписанныеТовары.ХарактеристикаНоменклатуры = ПартииТоваровНаСкладах.ХарактеристикаНоменклатуры
			И (ВЫБОР
				КОГДА ПартииТоваровНаСкладах.Качество = &ПустоеКачество
					ТОГДА ИСТИНА
				ИНАЧЕ ВЫБОР
						КОГДА СписанныеТовары.Качество = &ПустоеКачество
							ТОГДА ПартииТоваровНаСкладах.Качество = &КачествоНовый
						ИНАЧЕ ПартииТоваровНаСкладах.Качество = СписанныеТовары.Качество
					КОНЕЦ
			КОНЕЦ)
			И (ПартииТоваровНаСкладах.Склад = СписанныеТовары.Склад ИЛИ ПартииТоваровНаСкладах.Склад = &ПустойСклад)
			И (ВЫБОР
				КОГДА СписанныеТовары.ДопустимыйСтатус1 <> &ПустойСтатус
						ИЛИ СписанныеТовары.ДопустимыйСтатус2 <> &ПустойСтатус
						ИЛИ СписанныеТовары.ДопустимыйСтатус3 <> &ПустойСтатус
						ИЛИ СписанныеТовары.ДопустимыйСтатус4 <> &ПустойСтатус
					ТОГДА ПартииТоваровНаСкладах.СтатусПартии = &ПустойСтатус
							ИЛИ ПартииТоваровНаСкладах.СтатусПартии = &СтатусПартииПоОрдеру
							ИЛИ ПартииТоваровНаСкладах.СтатусПартии = СписанныеТовары.ДопустимыйСтатус1
							ИЛИ ПартииТоваровНаСкладах.СтатусПартии = СписанныеТовары.ДопустимыйСтатус2
							ИЛИ ПартииТоваровНаСкладах.СтатусПартии = СписанныеТовары.ДопустимыйСтатус3
							ИЛИ ПартииТоваровНаСкладах.СтатусПартии = СписанныеТовары.ДопустимыйСтатус4
				ИНАЧЕ ИСТИНА
			КОНЕЦ)
	
		И (ВЫБОР
			КОГДА СписанныеТовары.СписыватьТолькоПоЗаказу = ИСТИНА
				ТОГДА ВЫБОР
						КОГДА ПартииТоваровНаСкладах.Заказ <> СписанныеТовары.ЗаказПартии
							ТОГДА ВЫБОР
									КОГДА (НЕ СписанныеТовары.ЗаказПартии = НЕОПРЕДЕЛЕНО)
										ТОГДА ЛОЖЬ
									ИНАЧЕ ПартииТоваровНаСкладах.Заказ = &ПустойЗаказ
								КОНЕЦ
						ИНАЧЕ ИСТИНА
					КОНЕЦ
			ИНАЧЕ ВЫБОР
					КОГДА ПартииТоваровНаСкладах.Заказ <> СписанныеТовары.ЗаказПартии
						ТОГДА ПартииТоваровНаСкладах.Заказ = &ПустойЗаказ
					ИНАЧЕ ИСТИНА
				КОНЕЦ
		КОНЕЦ)
		И (СписанныеТовары.СерияНоменклатуры = ПартииТоваровНаСкладах.СерияНоменклатуры
			ИЛИ ПартииТоваровНаСкладах.СерияНоменклатуры = &ПустаяСерияНоменклатуры
ИЛИ СписанныеТовары.КодОперацииПартииТоваров = &КодРезервирование)
ГДЕ
	СписанныеТовары.Регистратор = &ОсновнойДокумент

УПОРЯДОЧИТЬ ПО
	ЧислоСерияНоменклатуры,
	ЧислоДокументОприходования,
	ЧислоЗаказ,
	ЧислоСтатусПартии,
	ДокументОприходованияДата,
	ДокументОприходования
ИТОГИ ПО
	НомерСтрокиДокумента
Показать

Согласно типовому алгоритму параметр &Дат - это момент времени, если вместо него использовать дату, то запрос выполняется на два порядка быстрее. Что именно влияет на скорость выполнения при использовании момента времени и каким образом?
По теме из базы знаний
Найденные решения
17. gallam99 237 07.12.12 15:46 Сейчас в теме
(1) kotloff,
Есть 3 варианта решения:
1. Часто обновляйте статистику по регистру накопления ПартииТоваров и регистру сведений СписанныеТовары
(гарантирует на 90% уменьшение времени). При условии, что вы нормально переиндексацию этих таблиц делаете хотя бы раз в неделю.
2. Переписать запрос (гарантирует на 99,9%).
3. Делать отложенное проведение по партиям (не для всех подходит).
Почему возникает проблема:
слишком интенсивно изменяются данные в таблице и портится статистика.
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
17. gallam99 237 07.12.12 15:46 Сейчас в теме
(1) kotloff,
Есть 3 варианта решения:
1. Часто обновляйте статистику по регистру накопления ПартииТоваров и регистру сведений СписанныеТовары
(гарантирует на 90% уменьшение времени). При условии, что вы нормально переиндексацию этих таблиц делаете хотя бы раз в неделю.
2. Переписать запрос (гарантирует на 99,9%).
3. Делать отложенное проведение по партиям (не для всех подходит).
Почему возникает проблема:
слишком интенсивно изменяются данные в таблице и портится статистика.
24. kot26rus 07.12.12 16:05 Сейчас в теме
(17) gallam99, по п.1 - если честно, переиндексация и обновление статистики не делались ни разу, если не считать нескольких ТиИ за последние 2 года.
26. gallam99 237 07.12.12 16:20 Сейчас в теме
(24) kotloff,
Возможно вы и сами нашли причину)))
27. kot26rus 07.12.12 20:55 Сейчас в теме
(26) gallam99, не сочтите за труд, подскажите, как это лучше сделать? какие скрипты и всё такое...
28. kot26rus 11.12.12 16:19 Сейчас в теме
(17) gallam99,
"переписал" запрос с использованием временных таблиц, помогло. Кстати, в последней УТ 10.3 запрос такой же, как у меня :( , пришлось взять из КА и немного доточить.
2. artemka 07.12.12 15:08 Сейчас в теме
На 2 порядка - это за 1 секунду вместо 100?
4. kot26rus 07.12.12 15:15 Сейчас в теме
3. artemka 07.12.12 15:12 Сейчас в теме
И попробуйте упростить запрос, чтобы получилось что-то типа
ВЫБРАТЬ * ИЗ РегистрНакопления.ПартииТоваровНаСкладах.Остатки(&Дат,
Номенклатура В
(ВЫБРАТЬ
РегистрСведений.СписанныеТовары.Номенклатура
ИЗ
РегистрСведений.СписанныеТовары
ГДЕ
РегистрСведений.СписанныеТовары.Регистратор = &Ссылка)
5. kot26rus 07.12.12 15:18 Сейчас в теме
(3) artemka, не очень хочется ковырять типовые механизмы, больше интересует природа этого долгого исполнения. есть подозрение, что дело в границе последовательности "Партионный учет", хотелось бы от знающих услышать вердикт.
6. Kom-off 07.12.12 15:31 Сейчас в теме
(5) Граница последовательности тут не при чем. Граница последовательности - это, всего на всего, информация о гарантированном последовательном проведении документов, т.е. корректном учете с точки зрения партионного учета.
8. kot26rus 07.12.12 15:35 Сейчас в теме
(6) Kom-off, в чём же причина сего странного явления?
10. artemka 07.12.12 15:36 Сейчас в теме
(5) kotloff, и ещё: там у вас внутреннее соединение. При смене МоментаВремени на дату - размер полученной таблицы не меняется случайно?
7. artemka 07.12.12 15:34 Сейчас в теме
Сколько в базе номенклатуры? База файловая или SQL? Есть сильное подозрение, что проседает где-то в другом месте, а не при срезе остатков из партий.
11. kot26rus 07.12.12 15:38 Сейчас в теме
(7) artemka, MSSQL2008R2 Standard, актуальных элементов номенклатуры около 20000.
проседает именно на этом запросе.
14. artemka 07.12.12 15:40 Сейчас в теме
(11) kotloff, а в документе сколько?
16. kot26rus 07.12.12 15:41 Сейчас в теме
(14) artemka, в документе не более 10-20 строк
20. amiralnar 9 07.12.12 15:59 Сейчас в теме
(16) kotloff, Чтобы это имело значение, надо в отборе виртуальной таблицы указывать только фильтр по номенклатуре документа, а не этого монстра из 100500 условий. Перенесите массивные условия в секцию ГДЕ, а в отборе витр. табл. оставьте только тривиальные условия.

(17) gallam99, Как интенсивно должны меняться партии, чтобы статистика стала неактуальной? У них там что 6000 приходов и отгрузок в сутки? Это не о том, тут может быть просто tablescan, условия же не оптимизируемые.
23. kot26rus 07.12.12 16:03 Сейчас в теме
(20) amiralnar, спасибо, попробую.
25. gallam99 237 07.12.12 16:14 Сейчас в теме
(20) Необходимо сделать следующую проверку: в трассе MS SQL выбрать тяжелый запрос (связанный с партионкой), дальше выполнить в Management Studio. Если будут тормоза такие же, то делаем обновление статистики и проверяем еще раз - запускаем запрос. Автор может это провести и скинуть информацию? По поводу интенсивности, насколько я помню интенсивно меняется регистр сведений - СписанныеТовары, в нем основная проблема. Поэтому (9) уже ответил - что запрос к этому регистру заменили на временные таблицы в следущих релизах и ситуация улучшилась. Учитывая, что обычно этот регистр сведений не маленький - из-за корявой статистики в момент выполнения запроса план неправильный, и длительность на несколько порядков больше (причем не факт что воспроизведется из MAnagement Studio).
P.S> Мной приведены не теоретические выводы, а реальное решение, которое подтверждено большим количеством проектов с проблемами запросов по партионке)))
9. Walker.pro 8 07.12.12 15:35 Сейчас в теме
В последней версии УТ этот запрос должен быть переделан на использование временных таблиц, попробуйте, может новая версия запроса будет работать быстрее...
12. artemka 07.12.12 15:39 Сейчас в теме
(9) Walker.pro, соглашусь. У меня была ситуация когда замена запроса типа

"Номенклатура В
(ВЫБРАТЬ
РегистрСведений.СписанныеТовары.Номенклатура
ИЗ
РегистрСведений.СписанныеТовары
ГДЕ
РегистрСведений.СписанныеТовары.Регистратор = &Ссылка)"

разительно ускоряла выполнение запроса.
15. kot26rus 07.12.12 15:40 Сейчас в теме
(12) artemka, не спорю, но почему именно параметр типа МоментВремени() так влияет на скорость?
19. artemka 07.12.12 15:56 Сейчас в теме
(15) kotloff, если всё именно так, как вы рассказываете (а было бы всё-таки неплохо выдернуть именно интересующую часть запроса и проверить именно на ней), то скорее всего при преобразовании запроса в SQL-запрос в 1-м случае используются индексы, а во-втором - нет.
Это легко можно проверить, если запустить профайлер в MSSQL.
Однако, как я уже писал Walker.pro проблема скорее всего в дургом участке запроса. А ваше изменение влияет лишь на то, сможет оптимизатор SQL оптимизировать запрос или нет.
22. kot26rus 07.12.12 16:03 Сейчас в теме
(19) artemka, понятно, попробую рыть в сторону изменения запроса.
13. kot26rus 07.12.12 15:39 Сейчас в теме
(9) Walker.pro, да, конфа очень старая, была мысль глянуть в новой, руки не дошли.
18. amiralnar 9 07.12.12 15:53 Сейчас в теме
А какая дата и какой момент?
Сдается мне, итоги отключаются.
21. kot26rus 07.12.12 16:02 Сейчас в теме
(18) amiralnar, момент времени этого документа, или его же дата. конкретный случай - 02.01.2012 г.
29. Vremin 12.12.12 13:26 Сейчас в теме
Раз запрос уже переписали.
Вдогонку советую посмотреть на какую дату рассчитаны итоги (Операции>Управление итогами), при необходимости пересчитать. Индексы добавить по измерениям, которые используются в условиях запроса.
30. kot26rus 12.12.12 14:26 Сейчас в теме
(29) Vremin, как дата итогов повлияет на неоперативное перепроведение документов в прошлых периодах?
31. Vremin 12.12.12 14:41 Сейчас в теме
Если дата получения остатков по регистру накопления больше даты рассчитанных итогов, то запрос будет выполняться дольше
32. kot26rus 12.12.12 14:43 Сейчас в теме
(31) Vremin, да, это я понимаю, а обратный случай?
33. Vremin 12.12.12 14:50 Сейчас в теме
Если дата получения остатков по регистру накопления меньше даты рассчитанных итогов, то все ок
34. kot26rus 12.12.12 14:57 Сейчас в теме
35. gallam99 237 12.12.12 15:10 Сейчас в теме
(33) Vremin,
Не совсем согласен в Вами.
Если простой запрос на остатки, то действительно проблем нет - если дата документа меньше даты расчета (но только с запросом). Но теряется (в большинстве ситуаций не критично) время на обновление итогов будущих периодов (при перепроведении документа, насколько я понял в этом контексте вопрос), это тоже надо учитывать. К слову, без разделения итогов, может приводить к избыточным блокировкам на итогах.
36. Vremin 12.12.12 15:21 Сейчас в теме
gallam99, я про запрос писал. Пересчет итогов при проведении документа - согласен занимает время.
37. gallam99 237 12.12.12 15:28 Сейчас в теме
(36) Я на (30) ориентировался. Ведь в длительность перепроведения входит как запрос, так и изменение данных.
Вывод: дату расчета итогов надо выбирать очень взвешенно!!!, так как она влияет и на скорость запросов при проведении оперативных документов (текущий период), и на затраты времени для обновления итогов (если неоперативный документ и много итогов рассчитанных с датой, большей чем в документе).
38. Vremin 12.12.12 15:44 Сейчас в теме
gallam99
пришли к:
при перепроведении палка о двух концах,
для работы пользователей лучше актуальные итоги

+ сталкивался с перепроведением базы за 3 года с сильно переписанной Торговлей, в итоге актуальные итоги ускоряли процесс проведения - возможно случай частный
39. gallam99 237 12.12.12 16:12 Сейчас в теме
(38) Vremin,
Частный и очень вырожденный)
Нелогично, наверняка влияли какие-то другие скрытые факторы.
40. mymyka 12.12.12 16:18 Сейчас в теме
Возможно есть куча документов, созданных при переносе и имеющие одинаковую дату(до секунды), при использовании Дата их последовательность не важна, при использовании МоментВремени они начинаются выстраиваться в логическую последовательность, что и несет доп.затраты серверного времени. Перепроведи такие кучи, если они есть и все пройдет.
46. kot26rus 12.12.12 19:50 Сейчас в теме
(40) mymyka, тоже к этой мысли склоняюсь. спасибо.
41. Vremin 12.12.12 16:18 Сейчас в теме
Все возможно, поэтому доверяю только фактам )
42. ПиН 12.12.12 16:20 Сейчас в теме
база большая? видимо таблица регистров по партиям сильно засорена...
44. kot26rus 12.12.12 19:48 Сейчас в теме
(42) ПиН, да не маленькая, гигов около 20. свёртка 2 года не делалась...
43. amiralnar 9 12.12.12 18:15 Сейчас в теме
Я тут попал в похожую ситуацию недавно. Мощный сервер, скуль. Простой запрос выполнялся два часа.
На партнерке ответили довольно сухо, ткнув носом в базу знаний, где первым пунктом настоятельно предлагалось исключить использование вложенных запросов.

Примечательно ,что этот-же запрос на файловой версии выполнялся мгонвенно, но завешивал скуль на два часа.
По факту переписывания на временные таблицы скорость возросла с 9000 секунд до 70. На два порядка.

Поэтому не стоит пологаться на статистику, итоги, и объем таблиц: скуль не всесильный, когда эска его раком ставит.

Все вложенные запросы должны быть переписаны через ВТ, без исключений.
Bukaska; kot26rus; +2 Ответить
45. kot26rus 12.12.12 19:49 Сейчас в теме
(43) amiralnar, да, надо это не забывать.
47. Bukaska 148 13.12.12 00:35 Сейчас в теме
(43) amiralnar, Спасибо большое! Я ещё пока только учусь. Мне и франч тоже что-то говорил про использование временных таблиц в связи с тем, что база УПП может быть гигов 25 и выше. Теперь ясно для чего, что Эска оказывается умееет ещё и что-то "Раком ставить")))
48. AlexO 136 13.12.12 09:46 Сейчас в теме
(43) amiralnar,
Все вложенные запросы должны быть переписаны через ВТ

не судьба студентам объяснить, что ВТ - это просто предварительная выборка, на порядки сокращающая объем обрабатываемых данных, чтобы не тянуть тысячу миллионов ненужных записей из SQL в противном разе, как у всех тут в первых случаях?!
(47) Bukaska,
Мне и франч тоже что-то говорил про использование временных таблиц в связи с тем, что база УПП может быть гигов 25 и выше.

поменьше верьте желтым книжкам и курсам, побольше думайте сами.
Оставьте свое сообщение

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