Помощь в анализе плана запроса

1. egorkinps 17.10.22 15:45 Сейчас в теме
Добрый день, коллеги.
Прошу помощи в анализе плана запроса.

База 1C ERP 2.5.7.402, платформа 8.3.20.1838, MS SQL Server 2014.
Пользователи пожаловались на долгое выполнение отражения документов в рег. учете.
В качестве примера привели два документа перемещения, первый отражается в среднем за 3 минуты, а второй в пределах 15 секунд. В результате отражения первого документа 3 строки, у второго 9. Ранее отражение проходило до 5 секунд. О других документах информацию не предоставили.

Сняли копию (располагается в том же контуре что и рабочая база), повторил действия пользователя, ситуация идентична. Т.к. в базе был я один, то проблему параллельности пока отбросил.
Сделал замер производительности, было установлено, что основное время уходит на выполнение одного запроса (рисунок 1). Запрос имеет много соединений между временными таблицами, соединения с физическими отсутствуют (файлы запросов во вложении).

Отловил запрос и план профайлером. По первому документу прилагаю скриншот характеристик запроса, второй не попал в трассировку из-за отбора по полю Durations (рисунок 2). Получил планы запросов (оба). У разных документов, оказались разные планы.
Судя по плану основной процент сосредоточен на самом операторе "INSERT" (рисунок 3). Также смущает существенная разность фактического и предполагаемого количества строк.

Больших знаний в этой области к сожалению пока не имею, поэтому прошу подсказать, в чем может быть дело. Файлы планов запроса прилагаю.
Все регламентные операции по обслуживанию СУБД настроены.
Прикрепленные файлы:
Файлы.zip
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
6. RustamZz 17.10.22 17:51 Сейчас в теме
(1) Посмотреть нужно еще на запросы заполнения врем. таблиц. TemDB где размещен - все ли нормально с диском?
11. egorkinps 17.10.22 18:23 Сейчас в теме
(6) Сами запросы формирующие временные таблицы я не просматривал т.к. они выполнялись вполне приемлемо. Но я смотрел результаты их выполнения перед тем как выполняется "тяжелый" запрос. Самые большие таблицы это "Счета" - около 1900 записей и "ПланХозрасчетный".
Люди отвечающие за техническую часть ответили, что с железом все в порядке.
12. RustamZz 17.10.22 18:31 Сейчас в теме
(11) Тогда понятно почему он считает, что будет много данных. Индексируются эти таблицы?
18. egorkinps 18.10.22 08:12 Сейчас в теме
(12) Посмотрел запросы, индексация временных таблиц выполняется
8. SlavaKron 17.10.22 18:07 Сейчас в теме
(1)
Предполагаемое количество строк...
В запросе, формирующем временную таблицу, я насчитал 16 левых соединений. Если отталкиваться только от количества строк соединяемых таблиц, такая большая цифра вполне могла получиться. Такие соединения, подобные этому:
ЛЕВОЕ СОЕДИНЕНИЕ
	Счета КАК СчетаДтПоАналитикеУчета
ПО 
	СчетаДтПоАналитикеУчета.Организация = ЗНАЧЕНИЕ(Справочник.Организации.ПустаяСсылка)
	И Данные.АналитикаУчетаДт = СчетаДтПоАналитикеУчета.АналитикаУчета
	И СчетаДтПоАналитикеУчета.МестоУчета = НЕОПРЕДЕЛЕНО
	И Данные.ВидСчетаДт = СчетаДтПоАналитикеУчета.ВидСчетаРеглУчета
	И Данные.ДолгосрочныйДт = СчетаДтПоАналитикеУчета.Долгосрочный
хорошо бы преобразовать в соединения с заранее подготовленными временными таблицами.
user1826630; +1 Ответить
10. egorkinps 17.10.22 18:17 Сейчас в теме
(8) Спасибо, подумаю над преобразованием запроса
15. redfred 17.10.22 18:51 Сейчас в теме
(1)
Судя по плану основной процент сосредоточен на самом операторе "INSERT" (рисунок 3).


Это предполагаемые проценты, а не реальные. Оптимизатор предполагал, что придётся вставлять 4 миллиона строк, и исходя из этого прикидывал проценты. При выполнении же дотуда дошло только 3 строки, так что вряд ли там на самом деле был основной затык.

(1)
Также смущает существенная разность фактического и предполагаемого количества строк.


Обычно сильные провалы производительности бывают когда предполагаемое количество сильно меньше фактического, у вас же наоборот.

(1)
Ранее отражение проходило до 5 секунд.


Что-то менялось с той поры, настройки какие-нибудь, еще что-нибудь?
19. egorkinps 18.10.22 08:58 Сейчас в теме
(15) Спасибо за пояснения.
Настройки и код не менялся.
2. Fox-trot 163 17.10.22 15:56 Сейчас в теме
на текст запроса нуна взглянуть для начала
3. egorkinps 17.10.22 16:35 Сейчас в теме
(2) Тексты запросов 1С, SQL изначально вложил в архив "Файлы.zip"
Дублирую текст запроса 1С ниже

ТекстЗапроса =
	"ВЫБРАТЬ
	|	Данные.Ссылка                       КАК Ссылка,
	|	Данные.Период                       КАК Период,
	|	НАЧАЛОПЕРИОДА(Данные.Период, ДЕНЬ)  КАК ДатаОтражения,
	|	Данные.ИдентификаторСтроки          КАК ИдентификаторСтроки,
	|
	|	Данные.Организация                  КАК Организация,
	|
	|	Данные.Сумма                        КАК Сумма,
	|	Данные.СуммаУУ                      КАК СуммаУУ,
	|	
	|	Данные.ВидСчетаДт                   КАК ВидСчетаДт,
	|	Данные.АналитикаУчетаДт             КАК АналитикаУчетаДт,
	|	Данные.МестоУчетаДт                 КАК МестоУчетаДт,
	|	Данные.ДолгосрочныйДт               КАК ДолгосрочныйДт,
	|
	|	Данные.ВалютаДт                     КАК ВалютаДт,
	|	Данные.ПодразделениеДт              КАК ПодразделениеДт,
	|	Данные.НаправлениеДеятельностиДт    КАК НаправлениеДеятельностиДт,
	|	
	|	ЕСТЬNULL(ПрочиеДт.СчетУчета, ЕСТЬNULL(СчетаДтДанных.Ссылка, &ПустаяСсылка)) КАК СчетДт,
	|
	|	ВЫБОР
	|		КОГДА ЕСТЬNULL(ПрочиеДт.ИспользоватьСубконто, ЛОЖЬ)
	|		ТОГДА ПрочиеДт.ВидСубконто1
	|		ИНАЧЕ ЕСТЬNULL(ВидыДт1.Ссылка, НЕОПРЕДЕЛЕНО)
	|	КОНЕЦ КАК ВидСубконтоДт1,
	|	ВЫБОР
	|		КОГДА ЕСТЬNULL(ПрочиеДт.ИспользоватьСубконто, ЛОЖЬ)
	|		ТОГДА ПрочиеДт.Субконто1
	|		КОГДА Данные.СубконтоДт1 = ВидыДт1.ПустоеЗначениеСубконто
	|		ТОГДА НЕОПРЕДЕЛЕНО
	|		ИНАЧЕ Данные.СубконтоДт1
	|	КОНЕЦ КАК СубконтоДт1,
	|
	|	ВЫБОР
	|		КОГДА ЕСТЬNULL(ПрочиеДт.ИспользоватьСубконто, ЛОЖЬ)
	|		ТОГДА ПрочиеДт.ВидСубконто2
	|		ИНАЧЕ ЕСТЬNULL(ВидыДт2.Ссылка, НЕОПРЕДЕЛЕНО)
	|	КОНЕЦ КАК ВидСубконтоДт2,
	|	ВЫБОР
	|		КОГДА ЕСТЬNULL(ПрочиеДт.ИспользоватьСубконто, ЛОЖЬ)
	|		ТОГДА ПрочиеДт.Субконто2
	|		КОГДА Данные.СубконтоДт2 = ВидыДт2.ПустоеЗначениеСубконто
	|		ТОГДА НЕОПРЕДЕЛЕНО
	|		ИНАЧЕ Данные.СубконтоДт2
	|	КОНЕЦ КАК СубконтоДт2,
	|
	|	ВЫБОР
	|		КОГДА ЕСТЬNULL(ПрочиеДт.ИспользоватьСубконто, ЛОЖЬ)
	|		ТОГДА ПрочиеДт.ВидСубконто3
	|		ИНАЧЕ ЕСТЬNULL(ВидыДт3.Ссылка, НЕОПРЕДЕЛЕНО)
	|	КОНЕЦ КАК ВидСубконтоДт3,
	|	ВЫБОР
	|		КОГДА ЕСТЬNULL(ПрочиеДт.ИспользоватьСубконто, ЛОЖЬ)
	|		ТОГДА ПрочиеДт.Субконто3
	|		КОГДА Данные.СубконтоДт3 = ВидыДт3.ПустоеЗначениеСубконто
	|		ТОГДА НЕОПРЕДЕЛЕНО
	|		ИНАЧЕ Данные.СубконтоДт3
	|	КОНЕЦ КАК СубконтоДт3,
	|	
	|	ВЫБОР
	|		КОГДА ЕСТЬNULL(СчетаДтПоМестуУчета.ИспользоватьСубконто, ЕСТЬNULL(СчетаДтПоОрганизации.ИспользоватьСубконто, ЕСТЬNULL(СчетаДтПоАналитикеУчета.ИспользоватьСубконто, ЛОЖЬ)))
	|		ТОГДА ЕСТЬNULL(СчетаДтПоМестуУчета.ВидСубконто, ЕСТЬNULL(СчетаДтПоОрганизации.ВидСубконто, ЕСТЬNULL(СчетаДтПоАналитикеУчета.ВидСубконто, НЕОПРЕДЕЛЕНО)))
	|		ИНАЧЕ НЕОПРЕДЕЛЕНО
	|	КОНЕЦ КАК ВидСубконтоДт,
	|	ВЫБОР
	|		КОГДА ЕСТЬNULL(СчетаДтПоМестуУчета.ИспользоватьСубконто, ЕСТЬNULL(СчетаДтПоОрганизации.ИспользоватьСубконто, ЕСТЬNULL(СчетаДтПоАналитикеУчета.ИспользоватьСубконто, ЛОЖЬ)))
	|		ТОГДА ЕСТЬNULL(СчетаДтПоМестуУчета.Субконто, ЕСТЬNULL(СчетаДтПоОрганизации.Субконто, ЕСТЬNULL(СчетаДтПоАналитикеУчета.Субконто, НЕОПРЕДЕЛЕНО)))
	|		ИНАЧЕ НЕОПРЕДЕЛЕНО
	|	КОНЕЦ КАК СубконтоДт,
	|
	|	Данные.ВалютнаяСуммаДт           КАК ВалютнаяСуммаДт,
	|	Данные.КоличествоДт              КАК КоличествоДт,
	|	Данные.СуммаНУДт                 КАК СуммаНУДт,
	|	Данные.СуммаПРДт                 КАК СуммаПРДт,
	|	Данные.СуммаВРДт                 КАК СуммаВРДт,
	|
	|	Данные.ВидСчетаКт                КАК ВидСчетаКт,
	|	Данные.АналитикаУчетаКт          КАК АналитикаУчетаКт,
	|	Данные.МестоУчетаКт              КАК МестоУчетаКт,
	|	Данные.ДолгосрочныйКт            КАК ДолгосрочныйКт,
	|
	|	Данные.ВалютаКт                  КАК ВалютаКт,
	|	Данные.ПодразделениеКт           КАК ПодразделениеКт,
	|	Данные.НаправлениеДеятельностиКт КАК НаправлениеДеятельностиКт,
	|	
	|	ЕСТЬNULL(ПрочиеКт.СчетУчета, ЕСТЬNULL(СчетаКтДанных.Ссылка, &ПустаяСсылка)) КАК СчетКт,
	|	
	|	ВЫБОР
	|		КОГДА ЕСТЬNULL(ПрочиеКт.ИспользоватьСубконто, ЛОЖЬ)
	|		ТОГДА ПрочиеКт.ВидСубконто1
	|		ИНАЧЕ ЕСТЬNULL(ВидыКт1.Ссылка, НЕОПРЕДЕЛЕНО)
	|	КОНЕЦ КАК ВидСубконтоКт1,
	|	ВЫБОР
	|		КОГДА ЕСТЬNULL(ПрочиеКт.ИспользоватьСубконто, ЛОЖЬ)
	|		ТОГДА ПрочиеКт.Субконто1
	|		КОГДА Данные.СубконтоКт1 = ВидыКт1.ПустоеЗначениеСубконто
	|		ТОГДА НЕОПРЕДЕЛЕНО
	|		ИНАЧЕ Данные.СубконтоКт1
	|	КОНЕЦ КАК СубконтоКт1,
	|
	|	ВЫБОР
	|		КОГДА ЕСТЬNULL(ПрочиеКт.ИспользоватьСубконто, ЛОЖЬ)
	|		ТОГДА ПрочиеКт.ВидСубконто2
	|		ИНАЧЕ ЕСТЬNULL(ВидыКт2.Ссылка, НЕОПРЕДЕЛЕНО)
	|	КОНЕЦ КАК ВидСубконтоКт2,
	|	ВЫБОР
	|		КОГДА ЕСТЬNULL(ПрочиеКт.ИспользоватьСубконто, ЛОЖЬ)
	|		ТОГДА ПрочиеКт.Субконто2
	|		КОГДА Данные.СубконтоКт2 = ВидыКт2.ПустоеЗначениеСубконто
	|		ТОГДА НЕОПРЕДЕЛЕНО
	|		ИНАЧЕ Данные.СубконтоКт2
	|	КОНЕЦ КАК СубконтоКт2,
	|
	|	ВЫБОР
	|		КОГДА ЕСТЬNULL(ПрочиеКт.ИспользоватьСубконто, ЛОЖЬ)
	|		ТОГДА ПрочиеКт.ВидСубконто3
	|		ИНАЧЕ ЕСТЬNULL(ВидыКт3.Ссылка, НЕОПРЕДЕЛЕНО)
	|	КОНЕЦ КАК ВидСубконтоКт3,
	|	ВЫБОР
	|		КОГДА ЕСТЬNULL(ПрочиеКт.ИспользоватьСубконто, ЛОЖЬ)
	|		ТОГДА ПрочиеКт.Субконто3
	|		КОГДА Данные.СубконтоКт3 = ВидыКт3.ПустоеЗначениеСубконто
	|		ТОГДА НЕОПРЕДЕЛЕНО
	|		ИНАЧЕ Данные.СубконтоКт3
	|	КОНЕЦ КАК СубконтоКт3,
	|
	|	ВЫБОР
	|		КОГДА ЕСТЬNULL(СчетаКтПоМестуУчета.ИспользоватьСубконто, ЕСТЬNULL(СчетаКтПоОрганизации.ИспользоватьСубконто, ЕСТЬNULL(СчетаКтПоАналитикеУчета.ИспользоватьСубконто, ЛОЖЬ)))
	|		ТОГДА ЕСТЬNULL(СчетаКтПоМестуУчета.ВидСубконто, ЕСТЬNULL(СчетаКтПоОрганизации.ВидСубконто, ЕСТЬNULL(СчетаКтПоАналитикеУчета.ВидСубконто, НЕОПРЕДЕЛЕНО)))
	|		ИНАЧЕ НЕОПРЕДЕЛЕНО
	|	КОНЕЦ КАК ВидСубконтоКт,
	|	ВЫБОР
	|		КОГДА ЕСТЬNULL(СчетаКтПоМестуУчета.ИспользоватьСубконто, ЕСТЬNULL(СчетаКтПоОрганизации.ИспользоватьСубконто, ЕСТЬNULL(СчетаКтПоАналитикеУчета.ИспользоватьСубконто, ЛОЖЬ)))
	|		ТОГДА ЕСТЬNULL(СчетаКтПоМестуУчета.Субконто, ЕСТЬNULL(СчетаКтПоОрганизации.Субконто, ЕСТЬNULL(СчетаКтПоАналитикеУчета.Субконто, НЕОПРЕДЕЛЕНО)))
	|		ИНАЧЕ НЕОПРЕДЕЛЕНО
	|	КОНЕЦ КАК СубконтоКт,
	|
	|	Данные.ВалютнаяСуммаКт          КАК ВалютнаяСуммаКт,
	|	Данные.КоличествоКт             КАК КоличествоКт,
	|	Данные.СуммаНУКт                КАК СуммаНУКт,
	|	Данные.СуммаПРКт                КАК СуммаПРКт,
	|	Данные.СуммаВРКт                КАК СуммаВРКт,
	|	
	|	Данные.Содержание               КАК Содержание,
	|	Данные.Сторно                   КАК Сторно
	|
	|ПОМЕСТИТЬ РезультатСопоставления
	|
	|ИЗ 
	|	ДанныеДляСопоставления КАК Данные
	|	
	|	ЛЕВОЕ СОЕДИНЕНИЕ
	|		Счета КАК СчетаДтПоМестуУчета
	|	ПО 
	|		Данные.Организация = СчетаДтПоМестуУчета.Организация
	|		И Данные.АналитикаУчетаДт = СчетаДтПоМестуУчета.АналитикаУчета
	|		И Данные.МестоУчетаДт = СчетаДтПоМестуУчета.МестоУчета
	|		И Данные.ВидСчетаДт = СчетаДтПоМестуУчета.ВидСчетаРеглУчета
	|		И Данные.ДолгосрочныйДт = СчетаДтПоМестуУчета.Долгосрочный
	|	
	|	ЛЕВОЕ СОЕДИНЕНИЕ
	|		Счета КАК СчетаДтПоОрганизации
	|	ПО 
	|		Данные.Организация = СчетаДтПоОрганизации.Организация
	|		И Данные.АналитикаУчетаДт = СчетаДтПоОрганизации.АналитикаУчета
	|		И СчетаДтПоОрганизации.МестоУчета = НЕОПРЕДЕЛЕНО
	|		И Данные.ВидСчетаДт = СчетаДтПоОрганизации.ВидСчетаРеглУчета
	|		И Данные.ДолгосрочныйДт = СчетаДтПоОрганизации.Долгосрочный
	|	
	|	ЛЕВОЕ СОЕДИНЕНИЕ
	|		Счета КАК СчетаДтПоАналитикеУчета
	|	ПО 
	|		СчетаДтПоАналитикеУчета.Организация = ЗНАЧЕНИЕ(Справочник.Организации.ПустаяСсылка)
	|		И Данные.АналитикаУчетаДт = СчетаДтПоАналитикеУчета.АналитикаУчета
	|		И СчетаДтПоАналитикеУчета.МестоУчета = НЕОПРЕДЕЛЕНО
	|		И Данные.ВидСчетаДт = СчетаДтПоАналитикеУчета.ВидСчетаРеглУчета
	|		И Данные.ДолгосрочныйДт = СчетаДтПоАналитикеУчета.Долгосрочный
	|	
	|	ЛЕВОЕ СОЕДИНЕНИЕ
	|		ПланХозрасчетный КАК СчетаДтДанных
	|	ПО
	|		ЕСТЬNULL(СчетаДтПоМестуУчета.СчетУчета, ЕСТЬNULL(СчетаДтПоОрганизации.СчетУчета, ЕСТЬNULL(СчетаДтПоАналитикеУчета.СчетУчета, Данные.СчетДт))) = СчетаДтДанных.Ссылка
	|	
	|	ЛЕВОЕ СОЕДИНЕНИЕ
	|		ВидыСубконто КАК ВидыДт1
	|	ПО
	|		ВидыДт1.Ссылка = ЕСТЬNULL(СчетаДтДанных.ВидСубконто1, НЕОПРЕДЕЛЕНО)
	|		И ВидыДт1.ТипЗначения = ТИПЗНАЧЕНИЯ(Данные.СубконтоДт1)
	|	
	|	ЛЕВОЕ СОЕДИНЕНИЕ
	|		ВидыСубконто КАК ВидыДт2
	|	ПО
	|		ВидыДт2.Ссылка = ЕСТЬNULL(СчетаДтДанных.ВидСубконто2, НЕОПРЕДЕЛЕНО)
	|		И ВидыДт2.ТипЗначения = ТИПЗНАЧЕНИЯ(Данные.СубконтоДт2)
	|
	|	ЛЕВОЕ СОЕДИНЕНИЕ
	|		ВидыСубконто КАК ВидыДт3
	|	ПО
	|		ВидыДт3.Ссылка = ЕСТЬNULL(СчетаДтДанных.ВидСубконто3, НЕОПРЕДЕЛЕНО)
	|		И ВидыДт3.ТипЗначения = ТИПЗНАЧЕНИЯ(Данные.СубконтоДт3)
	|	
	|	ЛЕВОЕ СОЕДИНЕНИЕ 
	|		ПрочиеСчета КАК ПрочиеДт
	|	ПО 
	|		Данные.Организация = ПрочиеДт.Организация
	|		И Данные.Ссылка = ПрочиеДт.Документ 
	|		И Данные.ВидСчетаДт = ПрочиеДт.ВидСчетаРеглУчета
	|		И Данные.ИдентификаторСтроки = ПрочиеДт.ИдентификаторСтроки
	|		И ПрочиеДт.СчетУчета <> &ПустаяСсылка
	|	
	|	ЛЕВОЕ СОЕДИНЕНИЕ
	|		Счета КАК СчетаКтПоМестуУчета
	|	ПО
	|		Данные.Организация = СчетаКтПоМестуУчета.Организация
	|		И Данные.АналитикаУчетаКт = СчетаКтПоМестуУчета.АналитикаУчета
	|		И Данные.МестоУчетаКт = СчетаКтПоМестуУчета.МестоУчета
	|		И Данные.ВидСчетаКт = СчетаКтПоМестуУчета.ВидСчетаРеглУчета
	|		И Данные.ДолгосрочныйКт = СчетаКтПоМестуУчета.Долгосрочный
	|	
	|	ЛЕВОЕ СОЕДИНЕНИЕ
	|		Счета КАК СчетаКтПоОрганизации
	|	ПО
	|		Данные.Организация = СчетаКтПоОрганизации.Организация
	|		И Данные.АналитикаУчетаКт = СчетаКтПоОрганизации.АналитикаУчета
	|		И СчетаКтПоОрганизации.МестоУчета = НЕОПРЕДЕЛЕНО
	|		И Данные.ВидСчетаКт = СчетаКтПоОрганизации.ВидСчетаРеглУчета
	|		И Данные.ДолгосрочныйКт = СчетаКтПоОрганизации.Долгосрочный
	|
	|	ЛЕВОЕ СОЕДИНЕНИЕ
	|		Счета КАК СчетаКтПоАналитикеУчета
	|	ПО
	|		СчетаКтПоАналитикеУчета.Организация = ЗНАЧЕНИЕ(Справочник.Организации.ПустаяСсылка)
	|		И Данные.АналитикаУчетаКт = СчетаКтПоАналитикеУчета.АналитикаУчета
	|		И СчетаКтПоАналитикеУчета.МестоУчета = НЕОПРЕДЕЛЕНО
	|		И Данные.ВидСчетаКт = СчетаКтПоАналитикеУчета.ВидСчетаРеглУчета
	|		И Данные.ДолгосрочныйКт = СчетаКтПоАналитикеУчета.Долгосрочный
	|
	|	ЛЕВОЕ СОЕДИНЕНИЕ
	|		ПланХозрасчетный КАК СчетаКтДанных
	|	ПО
	|		ЕСТЬNULL(СчетаКтПоМестуУчета.СчетУчета, ЕСТЬNULL(СчетаКтПоОрганизации.СчетУчета, ЕСТЬNULL(СчетаКтПоАналитикеУчета.СчетУчета, Данные.СчетКт))) = СчетаКтДанных.Ссылка
	|
	|	ЛЕВОЕ СОЕДИНЕНИЕ
	|		ВидыСубконто КАК ВидыКт1
	|	ПО
	|		ВидыКт1.Ссылка = ЕСТЬNULL(СчетаКтДанных.ВидСубконто1, НЕОПРЕДЕЛЕНО)
	|		И ВидыКт1.ТипЗначения = ТИПЗНАЧЕНИЯ(Данные.СубконтоКт1)
	|	
	|	ЛЕВОЕ СОЕДИНЕНИЕ
	|		ВидыСубконто КАК ВидыКт2
	|	ПО
	|		ВидыКт2.Ссылка = ЕСТЬNULL(СчетаКтДанных.ВидСубконто2, НЕОПРЕДЕЛЕНО)
	|		И ВидыКт2.ТипЗначения = ТИПЗНАЧЕНИЯ(Данные.СубконтоКт2)
	|
	|	ЛЕВОЕ СОЕДИНЕНИЕ
	|		ВидыСубконто КАК ВидыКт3
	|	ПО
	|		ВидыКт3.Ссылка = ЕСТЬNULL(СчетаКтДанных.ВидСубконто3, НЕОПРЕДЕЛЕНО)
	|		И ВидыКт3.ТипЗначения = ТИПЗНАЧЕНИЯ(Данные.СубконтоКт3)
	|	
	|	ЛЕВОЕ СОЕДИНЕНИЕ 
	|		ПрочиеСчета КАК ПрочиеКт
	|	ПО 
	|		Данные.Организация = ПрочиеКт.Организация 
	|		И Данные.Ссылка = ПрочиеКт.Документ 
	|		И Данные.ВидСчетаКт = ПрочиеКт.ВидСчетаРеглУчета
	|		И Данные.ИдентификаторСтроки = ПрочиеКт.ИдентификаторСтроки
	|		И ПрочиеКт.СчетУчета <> &ПустаяСсылка
	|	
	|";
Показать
4. nomad_irk 80 17.10.22 16:44 Сейчас в теме
(3)Запрос отлаживали в консоли, чтобы понять какой из множества тормозит и при каких обстоятельствах?
7. egorkinps 17.10.22 18:05 Сейчас в теме
(4)Целиком запрос в консоли не отлаживал.
"понять какой из множества тормозит" - Вы имеете в виду разбить этот запрос в несколько и протестировать каждое левое соединение ?
13. Sashares 33 17.10.22 18:35 Сейчас в теме
(7)Закомментируйте часть полей и соединений, выполняйте запрос, смотрите результат.
Раскомментируйте следующую часть полей и соединений, еще раз выполняете, смотрите результат.
Как найдете какое соединение критично замедляет, можно будет что-то изменить.
16. nomad_irk 80 17.10.22 22:36 Сейчас в теме
(7)да, переделать запрос на соединение с подготовленными временными таблицами.
Без уточнения источника тормозного соединения/запроса сложно что-либо советовать.
5. Fox-trot 163 17.10.22 16:55 Сейчас в теме
можно лишь посочувствовать такому... скорость как плата за универсальность к сожалению
конечно можно переписать для какогонить частного часто используемого случая, но это вряд ли будет эффективно, разве только для опыта или понимания процесса
9. egorkinps 17.10.22 18:12 Сейчас в теме
(5)Правильно ли я понимаю, что главная проблема этого запроса в том, что в левых соединениях используется связь по полям из предыдущих таблиц, которые также соединяются с основной таблицей левым соединением.
Т.е. проблема в конструкциях
| ПО
| ЕСТЬNULL(СчетаКтПоМестуУчета.СчетУчета, ЕСТЬNULL(СчетаКтПоОрганизации.СчетУчета, ЕСТЬNULL(СчетаКтПоАналитикеУчета.СчетУчета, Данные.СчетКт))) = СчетаКтДанных.Ссылка
14. Sashares 33 17.10.22 18:38 Сейчас в теме
(9)Если причина в этом, то выберите все остальные данные во временную таблицу, добавьте в нее такое поле для связи, проиндексируйте его, а потом уже, в следующем запросе соединяйтесь с этой таблицей.
17. user1203706 15 17.10.22 23:13 Сейчас в теме
(1) самые весёлые соединения, это такие:
ПО ЕСТЬNULL(СчетаДтПоМестуУчета.СчетУчета, ЕСТЬNULL(СчетаДтПоОрганизации.СчетУчета, ЕСТЬNULL(СчетаДтПоАналитикеУчета.СчетУчета, Данные.СчетДт))) = СчетаДтДанных.Ссылка


ПО
	|		ЕСТЬNULL(СчетаКтПоМестуУчета.СчетУчета, ЕСТЬNULL(СчетаКтПоОрганизации.СчетУчета, ЕСТЬNULL(СчетаКтПоАналитикеУчета.СчетУчета, Данные.СчетКт))) = СчетаКтДанных.Ссылка


и т.д
Оставьте свое сообщение

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