Переписываем запросы 1С для повышения производительности на SQL сервере

15.09.14

Разработка - Запросы

В идеальном мире не имело бы значение, какой мы используем синтаксис для формирования запроса. Любой логически идентичный запрос должен бы вызывать одинаковый план выполнения с одинаковыми характеристиками производительности.
Для достижения этой цели оптимизатор запросов SQL сервера должен знать различные варианты синтаксиса для конкретной логической конструкции и иметь ресурсы для исследования этих вариантов. В настоящее время такая ситуация просто невозможна.  
Можно предположить, что различные синтаксические вариации на тему одного логического запроса могут повлечь за собой разные планы выполнения с отличающимися характеристиками производительности.

По мотивам  Rewriting Queries to Improve Performance

Цель: изучить влияние синтаксиса запроса на генерируемые SQL планы запросов

Тестовая среда:

  • Windows Server 2008 R2 Enterprise
  • MS SQL server 2008 R2
  • 1С:Предприятие 8.2.19.90

SQL properties:

Инструменты:

  • SQL Server Profiler
  • Консоль запросов 1С

Подготовка:

Запускаем SQL Server Profiler, устанавливаем соединение, отмечаем события и колонки как показано на рисунке:

Устанавливаем отбор для нашей базы:

Примеры

Выполняем запрос:

Данный вид запроса сгенерировал следующий план исполнения:

Теперь попробуем упорядочить по полю «Код». В результате получаем следующий план:

Попробуем добавить еще упорядочивание и по полю «Код Улицы В Коде»:

Теперь появились элементы параллелизма.

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

Переписываем запрос

Как видно, вариант запроса с отбором "ИЛИ" вместо "В" вызывает тот же план выполнения, разве что работает дольше.

Если добавим упорядочивание по полю «КОД», то получим схожий результат с запросом с "В"

Добавление упорядочивания и по полю «Код Улицы В Коде» вызывает генерацию плана, схожего с запросом “В” при тех же условиях упорядочивания.

Теперь попробуем другой синтаксис:

Теперь мы наблюдаем в корне другой план исполнения, который, правда имеет худшие показатели, по сравнению с самым первым запросом. Если добавим упорядочивание по полю «Код»:

При добавлении упорядочивания по полю «Код Улицы В Коде», получим тот же план выполнения запроса.

Пример запроса с большим количеством таблиц

ВЫБРАТЬ  ПЕРВЫЕ 1000
	УчетЗатратРегл.АналитикаВидаУчета,
	УчетЗатратРегл.АналитикаУчетаЗатрат,
	УчетЗатратРегл.АналитикаУчетаПартий,
	УчетЗатратРегл.АналитикаРаспределенияЗатрат,
	УчетЗатратРегл.Количество,
	УчетЗатратРегл.КоличествоНУ,
	УчетЗатратРегл.Количество КАК КоличествоПолучатель,
	УчетЗатратРегл.КоличествоНУ КАК КоличествоНУПолучатель,
	УчетЗатратРегл.Стоимость,
	УчетЗатратРегл.Стоимость КАК СтоимостьПолучатель,
	УчетЗатратРегл.СтоимостьНУ,
	УчетЗатратРегл.СтоимостьНУ КАК СтоимостьНУПолучатель,
	УчетЗатратРегл.ПостояннаяРазница,
	УчетЗатратРегл.ПостояннаяРазница КАК ПостояннаяРазницаПолучатель,
	УчетЗатратРегл.КодОперации,
	УчетЗатратРегл.КорАналитикаВидаУчета,
	УчетЗатратРегл.КорАналитикаУчетаЗатрат,
	УчетЗатратРегл.КорАналитикаУчетаПартий,
	УчетЗатратРегл.КорАналитикаРаспределенияЗатрат,
	УчетЗатратРегл.НомерСтроки КАК НомерСтрокиВРегистре,
	РегАналитикаВидаУчета.РазделУчета,
	РегАналитикаВидаУчета.Организация,
	РегАналитикаВидаУчета.ПодразделениеОрганизации,
	РегАналитикаВидаУчета.Подразделение,
	РегАналитикаВидаУчета.СчетУчета,
	РегАналитикаВидаУчета.СчетУчетаНУ,
	РегАналитикаВидаУчета.Проект,
	РегАналитикаВидаУчета.Склад,
	РегАналитикаРаспределенияЗатрат.НоменклатурнаяГруппа,
	РегАналитикаРаспределенияЗатрат.Продукция,
	РегАналитикаРаспределенияЗатрат.ХарактеристикаПродукции,
	РегАналитикаРаспределенияЗатрат.СерияПродукции,
	РегАналитикаРаспределенияЗатрат.Спецификация,
	РегАналитикаУчетаЗатрат.СтатьяЗатрат,
	РегАналитикаУчетаЗатрат.Затрата,
	РегАналитикаУчетаЗатрат.ХарактеристикаЗатраты,
	РегАналитикаУчетаЗатрат.СерияЗатраты,
	РегАналитикаУчетаЗатрат.СпособРаспределенияЗатрат,
	РегАналитикаУчетаЗатрат.ХарактерЗатрат,
	РегАналитикаУчетаЗатрат.Качество,
	РегАналитикаУчетаПартий.СтатусПартии,
	РегАналитикаУчетаПартий.Заказ,
	РегАналитикаУчетаПартий.ДоговорКомитента,
	РегАналитикаУчетаПартий.ДоговорКомиссионера,
	РегАналитикаУчетаПартий.Комиссионер,
	КорРегАналитикаВидаУчета.РазделУчета КАК КорРазделУчета,
	КорРегАналитикаВидаУчета.Организация КАК КорОрганизация,
	КорРегАналитикаВидаУчета.ПодразделениеОрганизации КАК КорПодразделениеОрганизации,
	КорРегАналитикаВидаУчета.Подразделение КАК КорПодразделение,
	ЕСТЬNULL(КорРегАналитикаВидаУчета.СчетУчета, КорРегАналитикаУчетаПрочихЗатрат.СчетУчета) КАК КорСчетУчета,
	ЕСТЬNULL(КорРегАналитикаВидаУчета.СчетУчетаНУ, КорРегАналитикаУчетаПрочихЗатрат.СчетУчетаНУ) КАК КорСчетУчетаНУ,
	КорРегАналитикаВидаУчета.Проект КАК КорПроект,
	КорРегАналитикаВидаУчета.Склад КАК КорСклад,
	КорРегАналитикаВидаУчета.Склад КАК СкладПолучатель,
	КорРегАналитикаУчетаПрочихЗатрат.ОбъектСтроительства КАК КорОбъектСтроительства,
	КорРегАналитикаУчетаПрочихЗатрат.СпособСтроительства КАК КорСпособСтроительства,
	КорРегАналитикаУчетаПрочихЗатрат.Субконто1 КАК КорСубконто1,
	КорРегАналитикаУчетаПрочихЗатрат.Субконто2 КАК КорСубконто2,
	КорРегАналитикаУчетаПрочихЗатрат.Субконто3 КАК КорСубконто3,
	КорРегАналитикаУчетаПрочихЗатрат.СубконтоНУ1 КАК КорСубконтоНУ1,
	КорРегАналитикаУчетаПрочихЗатрат.СубконтоНУ2 КАК КорСубконтоНУ2,
	КорРегАналитикаУчетаПрочихЗатрат.СубконтоНУ3 КАК КорСубконтоНУ3,
	КорРегАналитикаУчетаПрочихЗатрат.ДатаИсправительнойЗаписи КАК ДатаИсправительнойЗаписи,
	КорРегАналитикаУчетаПрочихЗатрат.СчитатьРазницыПостоянными КАК СчитатьРазницыПостоянными,
	КорРегАналитикаРаспределенияЗатрат.НоменклатурнаяГруппа КАК КорНоменклатурнаяГруппа,
	КорРегАналитикаРаспределенияЗатрат.Продукция КАК КорПродукция,
	КорРегАналитикаРаспределенияЗатрат.ХарактеристикаПродукции КАК КорХарактеристикаПродукции,
	КорРегАналитикаРаспределенияЗатрат.СерияПродукции КАК КорСерияПродукции,
	КорРегАналитикаРаспределенияЗатрат.Спецификация КАК КорСпецификация,
	КорРегАналитикаУчетаЗатрат.СтатьяЗатрат КАК КорСтатьяЗатрат,
	КорРегАналитикаУчетаЗатрат.Затрата КАК КорЗатрата,
	КорРегАналитикаУчетаЗатрат.ХарактеристикаЗатраты КАК КорХарактеристикаЗатраты,
	КорРегАналитикаУчетаЗатрат.СерияЗатраты КАК КорСерияЗатраты,
	КорРегАналитикаУчетаЗатрат.СпособРаспределенияЗатрат КАК КорСпособРаспределенияЗатрат,
	КорРегАналитикаУчетаЗатрат.ХарактерЗатрат КАК КорХарактерЗатрат,
	КорРегАналитикаУчетаЗатрат.Качество КАК КорКачество,
	КорРегАналитикаУчетаПартий.СтатусПартии КАК КорСтатусПартии,
	КорРегАналитикаУчетаПартий.Заказ КАК КорЗаказ,
	КорРегАналитикаУчетаПартий.ДоговорКомитента КАК КорДоговорКомитента,
	КорРегАналитикаУчетаПартий.ДоговорКомиссионера КАК КорДоговорКомиссионера,
	КорРегАналитикаУчетаПартий.Комиссионер КАК КорКомиссионер,
	УчетЗатратРегл.Регистратор
ИЗ
	РегистрНакопления.УчетЗатратРегл КАК УчетЗатратРегл
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АналитикаВидаУчета КАК РегАналитикаВидаУчета
		ПО УчетЗатратРегл.АналитикаВидаУчета = РегАналитикаВидаУчета.Ссылка
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АналитикаУчетаЗатрат КАК РегАналитикаУчетаЗатрат
		ПО УчетЗатратРегл.АналитикаУчетаЗатрат = РегАналитикаУчетаЗатрат.Ссылка
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АналитикаУчетаПартий КАК РегАналитикаУчетаПартий
		ПО УчетЗатратРегл.АналитикаУчетаПартий = РегАналитикаУчетаПартий.Ссылка
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АналитикаРаспределенияЗатрат КАК РегАналитикаРаспределенияЗатрат
		ПО УчетЗатратРегл.АналитикаРаспределенияЗатрат = РегАналитикаРаспределенияЗатрат.Ссылка
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АналитикаВидаУчета КАК КорРегАналитикаВидаУчета
		ПО УчетЗатратРегл.КорАналитикаВидаУчета = КорРегАналитикаВидаУчета.Ссылка
			И (УчетЗатратРегл.КорАналитикаВидаУчета ССЫЛКА Справочник.КлючиАналитикиВидаУчета)
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АналитикаУчетаПрочихЗатрат КАК КорРегАналитикаУчетаПрочихЗатрат
		ПО УчетЗатратРегл.КорАналитикаВидаУчета = КорРегАналитикаУчетаПрочихЗатрат.Ссылка
			И (УчетЗатратРегл.КорАналитикаВидаУчета ССЫЛКА Справочник.КлючиАналитикиУчетаПрочихЗатрат)
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АналитикаУчетаЗатрат КАК КорРегАналитикаУчетаЗатрат
		ПО УчетЗатратРегл.КорАналитикаУчетаЗатрат = КорРегАналитикаУчетаЗатрат.Ссылка
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АналитикаУчетаПартий КАК КорРегАналитикаУчетаПартий
		ПО УчетЗатратРегл.КорАналитикаУчетаПартий = КорРегАналитикаУчетаПартий.Ссылка
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АналитикаРаспределенияЗатрат КАК КорРегАналитикаРаспределенияЗатрат
		ПО УчетЗатратРегл.КорАналитикаРаспределенияЗатрат = КорРегАналитикаРаспределенияЗатрат.Ссылка
ГДЕ
	УчетЗатратРегл.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Расход)
	И УчетЗатратРегл.НомерСтроки >= -1
	И УчетЗатратРегл.Регистратор = &Регистратор

УПОРЯДОЧИТЬ ПО
НомерСтрокиВРегистре	

Показана только часть плана. Видно, что оператор Key Lookup имеет стоимость 52% и весь запрос выполняется 0,415 сек.

Перепишем запрос:

ВЫБРАТЬ ПЕРВЫЕ 1000
	УчетЗатратРегл.Период,
	УчетЗатратРегл.Регистратор,
	УчетЗатратРегл.НомерСтроки,
	УчетЗатратРегл.Активность,
	УчетЗатратРегл.ВидДвижения,
	УчетЗатратРегл.АналитикаВидаУчета,
	УчетЗатратРегл.АналитикаУчетаЗатрат,
	УчетЗатратРегл.АналитикаУчетаПартий,
	УчетЗатратРегл.АналитикаРаспределенияЗатрат,
	УчетЗатратРегл.Количество,
	УчетЗатратРегл.КоличествоНУ,
	УчетЗатратРегл.Стоимость,
	УчетЗатратРегл.СтоимостьНУ,
	УчетЗатратРегл.ПостояннаяРазница,
	УчетЗатратРегл.КодОперации,
	УчетЗатратРегл.КорАналитикаВидаУчета,
	УчетЗатратРегл.КорАналитикаУчетаЗатрат,
	УчетЗатратРегл.КорАналитикаУчетаПартий,
	УчетЗатратРегл.КорАналитикаРаспределенияЗатрат,
	УчетЗатратРегл.МоментВремени
ПОМЕСТИТЬ врУчетЗатратРегл
ИЗ
	РегистрНакопления.УчетЗатратРегл КАК УчетЗатратРегл
ГДЕ
	УчетЗатратРегл.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Расход)
	И УчетЗатратРегл.НомерСтроки >= -1
	И УчетЗатратРегл.Регистратор = &Регистратор

УПОРЯДОЧИТЬ ПО
	НомерСтроки
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ 
	УчетЗатратРегл.АналитикаВидаУчета,
	УчетЗатратРегл.АналитикаУчетаЗатрат,
	УчетЗатратРегл.АналитикаУчетаПартий,
	УчетЗатратРегл.АналитикаРаспределенияЗатрат,
	УчетЗатратРегл.Количество,
	УчетЗатратРегл.КоличествоНУ,
	УчетЗатратРегл.Количество КАК КоличествоПолучатель,
	УчетЗатратРегл.КоличествоНУ КАК КоличествоНУПолучатель,
	УчетЗатратРегл.Стоимость,
	УчетЗатратРегл.Стоимость КАК СтоимостьПолучатель,
	УчетЗатратРегл.СтоимостьНУ,
	УчетЗатратРегл.СтоимостьНУ КАК СтоимостьНУПолучатель,
	УчетЗатратРегл.ПостояннаяРазница,
	УчетЗатратРегл.ПостояннаяРазница КАК ПостояннаяРазницаПолучатель,
	УчетЗатратРегл.КодОперации,
	УчетЗатратРегл.КорАналитикаВидаУчета,
	УчетЗатратРегл.КорАналитикаУчетаЗатрат,
	УчетЗатратРегл.КорАналитикаУчетаПартий,
	УчетЗатратРегл.КорАналитикаРаспределенияЗатрат,
	УчетЗатратРегл.НомерСтроки КАК НомерСтрокиВРегистре,
	РегАналитикаВидаУчета.РазделУчета,
	РегАналитикаВидаУчета.Организация,
	РегАналитикаВидаУчета.ПодразделениеОрганизации,
	РегАналитикаВидаУчета.Подразделение,
	РегАналитикаВидаУчета.СчетУчета,
	РегАналитикаВидаУчета.СчетУчетаНУ,
	РегАналитикаВидаУчета.Проект,
	РегАналитикаВидаУчета.Склад,
	РегАналитикаРаспределенияЗатрат.НоменклатурнаяГруппа,
	РегАналитикаРаспределенияЗатрат.Продукция,
	РегАналитикаРаспределенияЗатрат.ХарактеристикаПродукции,
	РегАналитикаРаспределенияЗатрат.СерияПродукции,
	РегАналитикаРаспределенияЗатрат.Спецификация,
	РегАналитикаУчетаЗатрат.СтатьяЗатрат,
	РегАналитикаУчетаЗатрат.Затрата,
	РегАналитикаУчетаЗатрат.ХарактеристикаЗатраты,
	РегАналитикаУчетаЗатрат.СерияЗатраты,
	РегАналитикаУчетаЗатрат.СпособРаспределенияЗатрат,
	РегАналитикаУчетаЗатрат.ХарактерЗатрат,
	РегАналитикаУчетаЗатрат.Качество,
	РегАналитикаУчетаПартий.СтатусПартии,
	РегАналитикаУчетаПартий.Заказ,
	РегАналитикаУчетаПартий.ДоговорКомитента,
	РегАналитикаУчетаПартий.ДоговорКомиссионера,
	РегАналитикаУчетаПартий.Комиссионер,
	КорРегАналитикаВидаУчета.РазделУчета КАК КорРазделУчета,
	КорРегАналитикаВидаУчета.Организация КАК КорОрганизация,
	КорРегАналитикаВидаУчета.ПодразделениеОрганизации КАК КорПодразделениеОрганизации,
	КорРегАналитикаВидаУчета.Подразделение КАК КорПодразделение,
	ЕСТЬNULL(КорРегАналитикаВидаУчета.СчетУчета, КорРегАналитикаУчетаПрочихЗатрат.СчетУчета) КАК КорСчетУчета,
	ЕСТЬNULL(КорРегАналитикаВидаУчета.СчетУчетаНУ, КорРегАналитикаУчетаПрочихЗатрат.СчетУчетаНУ) КАК КорСчетУчетаНУ,
	КорРегАналитикаВидаУчета.Проект КАК КорПроект,
	КорРегАналитикаВидаУчета.Склад КАК КорСклад,
	КорРегАналитикаВидаУчета.Склад КАК СкладПолучатель,
	КорРегАналитикаУчетаПрочихЗатрат.ОбъектСтроительства КАК КорОбъектСтроительства,
	КорРегАналитикаУчетаПрочихЗатрат.СпособСтроительства КАК КорСпособСтроительства,
	КорРегАналитикаУчетаПрочихЗатрат.Субконто1 КАК КорСубконто1,
	КорРегАналитикаУчетаПрочихЗатрат.Субконто2 КАК КорСубконто2,
	КорРегАналитикаУчетаПрочихЗатрат.Субконто3 КАК КорСубконто3,
	КорРегАналитикаУчетаПрочихЗатрат.СубконтоНУ1 КАК КорСубконтоНУ1,
	КорРегАналитикаУчетаПрочихЗатрат.СубконтоНУ2 КАК КорСубконтоНУ2,
	КорРегАналитикаУчетаПрочихЗатрат.СубконтоНУ3 КАК КорСубконтоНУ3,
	КорРегАналитикаУчетаПрочихЗатрат.ДатаИсправительнойЗаписи КАК ДатаИсправительнойЗаписи,
	КорРегАналитикаУчетаПрочихЗатрат.СчитатьРазницыПостоянными КАК СчитатьРазницыПостоянными,
	КорРегАналитикаРаспределенияЗатрат.НоменклатурнаяГруппа КАК КорНоменклатурнаяГруппа,
	КорРегАналитикаРаспределенияЗатрат.Продукция КАК КорПродукция,
	КорРегАналитикаРаспределенияЗатрат.ХарактеристикаПродукции КАК КорХарактеристикаПродукции,
	КорРегАналитикаРаспределенияЗатрат.СерияПродукции КАК КорСерияПродукции,
	КорРегАналитикаРаспределенияЗатрат.Спецификация КАК КорСпецификация,
	КорРегАналитикаУчетаЗатрат.СтатьяЗатрат КАК КорСтатьяЗатрат,
	КорРегАналитикаУчетаЗатрат.Затрата КАК КорЗатрата,
	КорРегАналитикаУчетаЗатрат.ХарактеристикаЗатраты КАК КорХарактеристикаЗатраты,
	КорРегАналитикаУчетаЗатрат.СерияЗатраты КАК КорСерияЗатраты,
	КорРегАналитикаУчетаЗатрат.СпособРаспределенияЗатрат КАК КорСпособРаспределенияЗатрат,
	КорРегАналитикаУчетаЗатрат.ХарактерЗатрат КАК КорХарактерЗатрат,
	КорРегАналитикаУчетаЗатрат.Качество КАК КорКачество,
	КорРегАналитикаУчетаПартий.СтатусПартии КАК КорСтатусПартии,
	КорРегАналитикаУчетаПартий.Заказ КАК КорЗаказ,
	КорРегАналитикаУчетаПартий.ДоговорКомитента КАК КорДоговорКомитента,
	КорРегАналитикаУчетаПартий.ДоговорКомиссионера КАК КорДоговорКомиссионера,
	КорРегАналитикаУчетаПартий.Комиссионер КАК КорКомиссионер,
	УчетЗатратРегл.Регистратор
ИЗ
	врУчетЗатратРегл КАК УчетЗатратРегл
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АналитикаВидаУчета КАК РегАналитикаВидаУчета
		ПО УчетЗатратРегл.АналитикаВидаУчета = РегАналитикаВидаУчета.Ссылка
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АналитикаУчетаЗатрат КАК РегАналитикаУчетаЗатрат
		ПО УчетЗатратРегл.АналитикаУчетаЗатрат = РегАналитикаУчетаЗатрат.Ссылка
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АналитикаУчетаПартий КАК РегАналитикаУчетаПартий
		ПО УчетЗатратРегл.АналитикаУчетаПартий = РегАналитикаУчетаПартий.Ссылка
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АналитикаРаспределенияЗатрат КАК РегАналитикаРаспределенияЗатрат
		ПО УчетЗатратРегл.АналитикаРаспределенияЗатрат = РегАналитикаРаспределенияЗатрат.Ссылка
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АналитикаВидаУчета КАК КорРегАналитикаВидаУчета
		ПО УчетЗатратРегл.КорАналитикаВидаУчета = КорРегАналитикаВидаУчета.Ссылка
			И (УчетЗатратРегл.КорАналитикаВидаУчета ССЫЛКА Справочник.КлючиАналитикиВидаУчета)
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АналитикаУчетаПрочихЗатрат КАК КорРегАналитикаУчетаПрочихЗатрат
		ПО УчетЗатратРегл.КорАналитикаВидаУчета = КорРегАналитикаУчетаПрочихЗатрат.Ссылка
			И (УчетЗатратРегл.КорАналитикаВидаУчета ССЫЛКА Справочник.КлючиАналитикиУчетаПрочихЗатрат)
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АналитикаУчетаЗатрат КАК КорРегАналитикаУчетаЗатрат
		ПО УчетЗатратРегл.КорАналитикаУчетаЗатрат = КорРегАналитикаУчетаЗатрат.Ссылка
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АналитикаУчетаПартий КАК КорРегАналитикаУчетаПартий
		ПО УчетЗатратРегл.КорАналитикаУчетаПартий = КорРегАналитикаУчетаПартий.Ссылка
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АналитикаРаспределенияЗатрат КАК КорРегАналитикаРаспределенияЗатрат
		ПО УчетЗатратРегл.КорАналитикаРаспределенияЗатрат = КорРегАналитикаРаспределенияЗатрат.Ссылка

Появился дополнительный план по созданию временной таблицы

Мы избавились от тяжелого оператора Key Lookup и добились значительных улучшений показателей производительности, несмотря на дополнительную операцию по созданию временной таблицы

Выводы

Мы отметили, что синтаксис запроса может влиять на выбор оптимизатором того или иного плана исполнения запроса, несмотря на то, что логически мы получаем один и тот же результат. Также можно отметить, что,например, синтаксис, содержащий «ОБЪЕДИНИТЬ ВСЕ» иногда может привести к выбору оптимизатором оптимального плана, иногда может ухудшить показатели. Использование временных таблиц также может улучшить показатели производительности.

Переписывание запросов и попытки использовать альтернативный синтаксис являются допустимой техникой «тюнинга» запросов, однако необходимо соблюдать некоторые меры предосторожности. Одним из рисков является то, что будущие изменения продукта (MS SQL Server) могут привести к тому, что конкретная форма запроса неожиданно перестанет генерировать лучший план, но это всегда риск и его можно уменьшить предварительным тестированием перед обновлением.

Существует также риск увлечься этой техникой и писать совсем уж необычные запросы и таким образом преступить черту. Граница между альтернативным синтаксисом и «необычным» очень размыта, можно лишь порекомендовать, чтобы запросы были максимально простыми. 

план запроса execution plan SQL performance производительность СКЛ

См. также

SALE! 20%

Infostart Toolkit: Инструменты разработчика 1С 8.3 на управляемых формах

Инструментарий разработчика Роли и права Запросы СКД Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Конфигурации 1cv8 Платные (руб)

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

10000 8000 руб.

02.09.2020    122425    673    389    

716

Для чего используют конструкцию запроса "ГДЕ ЛОЖЬ" в СКД на примере конфигурации 1С:ERP

Запросы СКД Платформа 1С v8.3 Запросы Система компоновки данных 1С:ERP Управление предприятием 2 Бесплатно (free)

В типовых конфигурациях разработчики компании 1С иногда используют в отчетах, построенных на СКД, такую конструкцию, как "ГДЕ ЛОЖЬ". Такая конструкция говорит о том, что данные в запросе не будут получены совсем. Для чего же нужен тогда запрос?

13.02.2024    5757    KawaNoNeko    23    

23

Набор-объект для СКД по тексту или запросу

Запросы СКД Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Абонемент ($m)

Есть список полей в виде текста, или запрос - закидываем в набор СКД.

1 стартмани

31.01.2024    2007    2    Yashazz    0    

29

Запрос 1С copilot

Инструментарий разработчика Запросы Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Абонемент ($m)

Пишем на человеческом языке, что нам надо, и получаем текст запроса на языке 1С. Используются большие языковые модели (LLM GPT) от OpenAI или Яндекс на выбор.

5 стартмани

15.01.2024    6301    31    mkalimulin    25    

50

PrintWizard: поддержка представлений ЗУП в конструкторе

Инструментарий разработчика Запросы Платформа 1С v8.3 Бесплатно (free)

Одной из интересных задач, стоящих в процессе разработки, была поддержка механизма представлений в ЗУП. Но не просто возможность исполнения запросов с ними. Основная проблема была в том, чтобы с ними было удобно работать, а именно: создавать, модифицировать и отлаживать. Кратко о том, что в итоге получилось...

14.12.2023    1750    vandalsvq    7    

29

Объектная модель запроса "Схема запроса" 2

Запросы Платформа 1С v8.3 Запросы Конфигурации 1cv8 Бесплатно (free)

Далеко уже не новый тип данных "Схема запроса". Статья о том, как использовать его "попроще". Примеры создания текста запроса с нуля и изменение имеющегося запроса.

06.12.2023    5399    user1923546    26    

43

Начните уже использовать хранилище запросов

HighLoad оптимизация Запросы

Очень немногие из тех, кто занимается поддержкой MS SQL, работают с хранилищем запросов. А ведь хранилище запросов – это очень удобный, мощный и, главное, бесплатный инструмент, позволяющий быстро найти и локализовать проблему производительности и потребления ресурсов запросами. В статье расскажем о том, как использовать хранилище запросов в MS SQL и какие плюсы и минусы у него есть.

11.10.2023    16206    skovpin_sa    14    

98
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. Йожкин Кот 1006 15.09.14 17:11 Сейчас в теме
2. AlX0id 15.09.14 23:17 Сейчас в теме
(1) Йожкин Кот,
Случай того, что "неоптимизированный" запрос выигрывает по всем статьям у "оптимизированного"? )
4. jan27 732 16.09.14 10:42 Сейчас в теме
(1) не могу посмотреть, что там?
10. BabySG 18.09.14 09:59 Сейчас в теме
(4) не следует использовать условие по ИЛИ, сделайте через ОБЪЕДИНИТЬ ВСЕ. Кстати, на 1С:Эксперт по это тоже рассказывают.
11. jan27 732 18.09.14 10:57 Сейчас в теме
(10) да, согласен, по ИЛИ отрабатывает медленнее, что и показано в работе
3. Gilev.Vyacheslav 1910 16.09.14 05:18 Сейчас в теме
в этой статье много "теоретических рассуждений" и очередное изобретение велосипеда

все это может не сработать, если в запросе например будет два десятка таблиц, а такой простой запрос в реальной жизни вряд ли будет создавать серьезные проблемы

но такие статьи нужны, пока обучаешь других хотя бы сам учишься )
artbear; flyDrag; Redokov; cleaner_it; zoytsa; awk; exciter; JesteR; mmch; alyaev.a.v; plmshka; shalimski; +12 Ответить
5. jan27 732 16.09.14 10:49 Сейчас в теме
(3) спасибо за внимание. Мне показалось, что рассуждений здесь маловато. Не ставилась задача показать как решать серьезные проблемы. Кстати, а не найдется ли у вас примера запроса, вызывающего Intra-query parallelism deadlocks?
kirinalex; +1 Ответить
16. zoytsa 19.09.14 14:14 Сейчас в теме
(3) Gilev.Vyacheslav,
интересна вставка временной таблицы, Ваша цитата с gilev.ru


Во многих случая ускорить запрос могут временные таблицы

Сообщение Гилёв Вячеслав » 15 окт 2013, 01:23
... могут, но не всегда.
Сами по себе временные таблицы это просто инструмент, который надо применять понимая плюсы и минусы этой технологии.

Минусы:
для создания временной таблицы требуется время;
для каждого соединения свои изолированные таблицы;
временные таблицы при заполнении большим объемом данных тратят много времени;
создание индексов для временных таблиц это еще дополнительное время;
осторожнее с ораклом, включая 11 версию субд плохо дело со статистикой;
слишком большое количество временных таблиц может занять много места на диске.

Плюсы:
в отличии от вложенных запрос количество строк во временной таблице ПРОГНОЗИРУЕМОЕ, именно "ясность" с объемом выборки делает их удобными для оптимизации мест, которые выполняются неоправдано долго;
временные таблицы не пересекаются по блокировкам;
временные таблицы могут позволить не совершать повторные действия над одними и теме же данным в сложном запросе;
временные таблицы можно использовать для сбора промежуточных результатов из "подзапросов", таким образом это может упростить контроль RLS (т.е. проверке подвергать только итоговые данные, а не все промежуточные действия в сложном запросе).


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


и еще:

Если в запросе используется соединение с виртуальной таблицей языка запросов "1С:Предприятия" (например, "РегистрНакопления.Товары.Остатки()") и запрос работает с неудовлетворительной производительностью, то рекомендуется вынести обращение к виртуальной таблице в отдельный запрос с сохранением результатов во временной таблице.

Виртуальные таблицы, используемые в языке запросов "1С:Предприятия", могут разворачиваться в подзапросы при трансляции в язык SQL. Это связано с тем, что виртуальная таблица часто (но не всегда) получает данные из нескольких физических таблиц СУБД. Если вы используете соединение с виртуальной таблицей, то на уровне SQL оно может быть в некоторых случаях реализовано как соединение с подзапросом. В этом случае оптимизатор СУБД может точно так же выбрать неоптимальный план, как при работе с подзапросом, использованным в языке "1С:Предприятия" в явном виде
17. Gilev.Vyacheslav 1910 20.09.14 21:45 Сейчас в теме
(16) zoytsa, Не понял сути сообщения, да и лучше писать в наш форум http://www.gilev.ru/forum/, если хотите услышать ответ от нас гарантированно
18. jan27 732 22.09.14 08:51 Сейчас в теме
(17) некрасиво использовать чужую статью для собственной рекламы, уж если начали обсуждать - продолжайте
kirinalex; ya.Avoronov; rudak_a; ZLENKO; +4 Ответить
6. PVG_73 17 17.09.14 11:06 Сейчас в теме
Эта статья говорит лишь о том, что оптимизировать можно и почему (поверхностно....)
А на самом деле такие статьи нужно рассматривать на конкретном примере:
Есть объект метаданных у него есть такие реквизиты, по таким то реквизитам строятся индексы.
Далее смотрим как меняется план выполнения SQL при той или иной выборке по данной таблице.
И тогда сразу будет видно отчего именно зависит какой план выполнения выберет SQL.
А в идеале рассмотреть выборку по нескольким таблица и показать как при правильном использовании тех или иных конструкций мы получаем оптимальный план выполнения....
И на самом деле очень хорошо это видно на самом запросе SQL, т.к. транслятор 1С все равно по своему интерпретирует наши запросы к базе.
7. jan27 732 17.09.14 11:54 Сейчас в теме
(6) синтаксис указанных запросов в СКЛ один в один как в 1С разве что англоязычный и поля замененены на имена СКЛ
да. в ходе экспериментов попадались варианты, когда один запрос 1С вызывает множество коротких запросов СКЛ, причем часть из них - работа с временными таблицами,
на мой взгляд такие запросы требуют дополнительного анализа и оптимизации, но это отдельная тема

конкретные примеры сильно привязаны к специфике конкретного запроса, хотелось показать общий подход
kirinalex; +1 Ответить
8. PVG_73 17 17.09.14 12:37 Сейчас в теме
(7), просто я хотел отметить, что для показа общего подхода так же необходимо было бы упомянуть, что первоначальная структура метаданных имеет тоже не маловажную роль, т.к. включения тех или иных индексов SQL полностью зависит от того как мы описали структуру хранимых данных.
9. jan27 732 17.09.14 14:45 Сейчас в теме
(8) это да, не спорю... но индексы можно и добавить по итогам анализа планов запроса, избыточные индексы тоже не есть гуд
12. AlX0id 19.09.14 10:33 Сейчас в теме
Я бы хотел еще уточнить одну вещь - профайлер показывает помимо длительности запроса еще логические чтения и число строк. Каким образом, например, сравнивать запросы с чуть большей длительностью и меньшим количеством чтений с запросами меньшей длительности, но на порядок большим количеством чтений?
13. jan27 732 19.09.14 12:37 Сейчас в теме
(12) если речь о рабочем сервере, профайлером не рекомендуют пользоваться, а так в профайлере можно группировать по различным колонкам, выгружать данные и сортировать по интересующим колонкам
14. AlX0id 19.09.14 13:17 Сейчас в теме
(13)
Вот меня и интересует, какие колонки должны интересовать в каких случаях %)
15. jan27 732 19.09.14 13:39 Сейчас в теме
(14) в большинстве случаев увеличения колонки Reads влекут за собой и увеличение в колонке Duration
19. lustin 26.09.14 01:24 Сейчас в теме
(0) А все таки у меня вопрос чем вызвана такая любовь к чистой ИТСовской обработке Консоль запросов. Есть же http://infostart.ru/public/56973/
artbear; rudak_a; +2 Ответить
20. jan27 732 26.09.14 01:46 Сейчас в теме
(19) если присмотреться, то можно увидеть, что она не чисто ИТС - www.lavelin.ru. Лично мне она нравится тем, что можно применять произвольный код к результату запрса
21. jobkostya1c_ERP 100 28.01.15 13:08 Сейчас в теме
Полезный материал для специалистов по оптимизации и производительности конфигураций 1С. Вот только Profiler нужно в меру использовать. Иначе как пошутили эти самые оптимизаторы "если запрос все равно в 1С криво выполняется и не понять в чем причина придется в Profiler лезть смотреть. Вот только если ты будешь лазить в профайлер с каждым кривым запросом то будешь два рубля в день получать. Не в смысле две тысячи :)"
22. jan27 732 28.01.15 23:05 Сейчас в теме
(21) а у вас все запросы такие кривые?))
23. amaksimov 28.01.16 12:34 Сейчас в теме
(22) Константин дело говорит.
Мне сегодня пригодилась, например, хранимая процедура sp_WhoIsAcitve, она также позволяет планы запросов получать (причём также в SQL графически его сразу видно). Исполняется так в SQL Server Management Studio:

exec sp_whoisactive
@get_full_inner_text = 0
,@get_plans = 1
,@get_outer_command = 1

Вложил хранимку в zip вложении.
Прикрепленные файлы:
who_is_active_v11_11.zip
24. jan27 732 28.01.16 12:46 Сейчас в теме
Оставьте свое сообщение