Добрый день, коллеги.
Прошу помощи в анализе плана запроса.
База 1C ERP 2.5.7.402, платформа 8.3.20.1838, MS SQL Server 2014.
Пользователи пожаловались на долгое выполнение отражения документов в рег. учете.
В качестве примера привели два документа перемещения, первый отражается в среднем за 3 минуты, а второй в пределах 15 секунд. В результате отражения первого документа 3 строки, у второго 9. Ранее отражение проходило до 5 секунд. О других документах информацию не предоставили.
Сняли копию (располагается в том же контуре что и рабочая база), повторил действия пользователя, ситуация идентична. Т.к. в базе был я один, то проблему параллельности пока отбросил.
Сделал замер производительности, было установлено, что основное время уходит на выполнение одного запроса (рисунок 1). Запрос имеет много соединений между временными таблицами, соединения с физическими отсутствуют (файлы запросов во вложении).
Отловил запрос и план профайлером. По первому документу прилагаю скриншот характеристик запроса, второй не попал в трассировку из-за отбора по полю Durations (рисунок 2). Получил планы запросов (оба). У разных документов, оказались разные планы.
Судя по плану основной процент сосредоточен на самом операторе "INSERT" (рисунок 3). Также смущает существенная разность фактического и предполагаемого количества строк.
Больших знаний в этой области к сожалению пока не имею, поэтому прошу подсказать, в чем может быть дело. Файлы планов запроса прилагаю.
Все регламентные операции по обслуживанию СУБД настроены.
Прошу помощи в анализе плана запроса.
База 1C ERP 2.5.7.402, платформа 8.3.20.1838, MS SQL Server 2014.
Пользователи пожаловались на долгое выполнение отражения документов в рег. учете.
В качестве примера привели два документа перемещения, первый отражается в среднем за 3 минуты, а второй в пределах 15 секунд. В результате отражения первого документа 3 строки, у второго 9. Ранее отражение проходило до 5 секунд. О других документах информацию не предоставили.
Сняли копию (располагается в том же контуре что и рабочая база), повторил действия пользователя, ситуация идентична. Т.к. в базе был я один, то проблему параллельности пока отбросил.
Сделал замер производительности, было установлено, что основное время уходит на выполнение одного запроса (рисунок 1). Запрос имеет много соединений между временными таблицами, соединения с физическими отсутствуют (файлы запросов во вложении).
Отловил запрос и план профайлером. По первому документу прилагаю скриншот характеристик запроса, второй не попал в трассировку из-за отбора по полю Durations (рисунок 2). Получил планы запросов (оба). У разных документов, оказались разные планы.
Судя по плану основной процент сосредоточен на самом операторе "INSERT" (рисунок 3). Также смущает существенная разность фактического и предполагаемого количества строк.
Больших знаний в этой области к сожалению пока не имею, поэтому прошу подсказать, в чем может быть дело. Файлы планов запроса прилагаю.
Все регламентные операции по обслуживанию СУБД настроены.
Прикрепленные файлы:



По теме из базы знаний
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(6) Сами запросы формирующие временные таблицы я не просматривал т.к. они выполнялись вполне приемлемо. Но я смотрел результаты их выполнения перед тем как выполняется "тяжелый" запрос. Самые большие таблицы это "Счета" - около 1900 записей и "ПланХозрасчетный".
Люди отвечающие за техническую часть ответили, что с железом все в порядке.
Люди отвечающие за техническую часть ответили, что с железом все в порядке.
(1) хорошо бы преобразовать в соединения с заранее подготовленными временными таблицами.
Предполагаемое количество строк...
В запросе, формирующем временную таблицу, я насчитал 16 левых соединений. Если отталкиваться только от количества строк соединяемых таблиц, такая большая цифра вполне могла получиться. Такие соединения, подобные этому:ЛЕВОЕ СОЕДИНЕНИЕ
Счета КАК СчетаДтПоАналитикеУчета
ПО
СчетаДтПоАналитикеУчета.Организация = ЗНАЧЕНИЕ(Справочник.Организации.ПустаяСсылка)
И Данные.АналитикаУчетаДт = СчетаДтПоАналитикеУчета.АналитикаУчета
И СчетаДтПоАналитикеУчета.МестоУчета = НЕОПРЕДЕЛЕНО
И Данные.ВидСчетаДт = СчетаДтПоАналитикеУчета.ВидСчетаРеглУчета
И Данные.ДолгосрочныйДт = СчетаДтПоАналитикеУчета.Долгосрочный
(1)
Это предполагаемые проценты, а не реальные. Оптимизатор предполагал, что придётся вставлять 4 миллиона строк, и исходя из этого прикидывал проценты. При выполнении же дотуда дошло только 3 строки, так что вряд ли там на самом деле был основной затык.
(1)
Обычно сильные провалы производительности бывают когда предполагаемое количество сильно меньше фактического, у вас же наоборот.
(1)
Что-то менялось с той поры, настройки какие-нибудь, еще что-нибудь?
Судя по плану основной процент сосредоточен на самом операторе "INSERT" (рисунок 3).
Это предполагаемые проценты, а не реальные. Оптимизатор предполагал, что придётся вставлять 4 миллиона строк, и исходя из этого прикидывал проценты. При выполнении же дотуда дошло только 3 строки, так что вряд ли там на самом деле был основной затык.
(1)
Также смущает существенная разность фактического и предполагаемого количества строк.
Обычно сильные провалы производительности бывают когда предполагаемое количество сильно меньше фактического, у вас же наоборот.
(1)
Ранее отражение проходило до 5 секунд.
Что-то менялось с той поры, настройки какие-нибудь, еще что-нибудь?
(2) Тексты запросов 1С, SQL изначально вложил в архив "Файлы.zip"
Дублирую текст запроса 1С ниже
Дублирую текст запроса 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)
|
| ЛЕВОЕ СОЕДИНЕНИЕ
| ПрочиеСчета КАК ПрочиеКт
| ПО
| Данные.Организация = ПрочиеКт.Организация
| И Данные.Ссылка = ПрочиеКт.Документ
| И Данные.ВидСчетаКт = ПрочиеКт.ВидСчетаРеглУчета
| И Данные.ИдентификаторСтроки = ПрочиеКт.ИдентификаторСтроки
| И ПрочиеКт.СчетУчета <> &ПустаяСсылка
|
|";
Показать
можно лишь посочувствовать такому... скорость как плата за универсальность к сожалению
конечно можно переписать для какогонить частного часто используемого случая, но это вряд ли будет эффективно, разве только для опыта или понимания процесса
конечно можно переписать для какогонить частного часто используемого случая, но это вряд ли будет эффективно, разве только для опыта или понимания процесса
(5)Правильно ли я понимаю, что главная проблема этого запроса в том, что в левых соединениях используется связь по полям из предыдущих таблиц, которые также соединяются с основной таблицей левым соединением.
Т.е. проблема в конструкциях
| ПО
| ЕСТЬNULL(СчетаКтПоМестуУчета.СчетУчета, ЕСТЬNULL(СчетаКтПоОрганизации.СчетУчета, ЕСТЬNULL(СчетаКтПоАналитикеУчета.СчетУчета, Данные.СчетКт))) = СчетаКтДанных.Ссылка
Т.е. проблема в конструкциях
| ПО
| ЕСТЬNULL(СчетаКтПоМестуУчета.СчетУчета, ЕСТЬNULL(СчетаКтПоОрганизации.СчетУчета, ЕСТЬNULL(СчетаКтПоАналитикеУчета.СчетУчета, Данные.СчетКт))) = СчетаКтДанных.Ссылка
(1) самые весёлые соединения, это такие:
и т.д
ПО ЕСТЬNULL(СчетаДтПоМестуУчета.СчетУчета, ЕСТЬNULL(СчетаДтПоОрганизации.СчетУчета, ЕСТЬNULL(СчетаДтПоАналитикеУчета.СчетУчета, Данные.СчетДт))) = СчетаДтДанных.Ссылка
ПО
| ЕСТЬNULL(СчетаКтПоМестуУчета.СчетУчета, ЕСТЬNULL(СчетаКтПоОрганизации.СчетУчета, ЕСТЬNULL(СчетаКтПоАналитикеУчета.СчетУчета, Данные.СчетКт))) = СчетаКтДанных.Ссылка
и т.д
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот