Результат запроса при изменении 1 параметра выполняется в медленне в 700 раз
Добрый день,
Имеется конфигурация Аренда и управление недвижимостью для "1С:Бухгалтерия 8", редакция 3.0.
База расположена на postgres 13.
В коде вызывается запрос 2 раза подряд с разным значением параметра "ПостояннаяЧасть", Истина и Ложь.
При запросе Истина, ответ через 0,7 сек, при Ложь 700 сек. Во втором случает возвращает таблицу на 0 строк.
На postgressql 12 редакции данной ситуации нет.
Проверяли на 13, 15 редакциях. Сборки используем от PGPro. Тюнинг производили аналогично 12 редакции.
Чем обусловлена ситуация - мы не умеем тюнить постгес или в свежих редакциях что то сломалось?
Текст запроса (не изменялся от разработчика):
Имеется конфигурация Аренда и управление недвижимостью для "1С:Бухгалтерия 8", редакция 3.0.
База расположена на postgres 13.
В коде вызывается запрос 2 раза подряд с разным значением параметра "ПостояннаяЧасть", Истина и Ложь.
При запросе Истина, ответ через 0,7 сек, при Ложь 700 сек. Во втором случает возвращает таблицу на 0 строк.
На postgressql 12 редакции данной ситуации нет.
Проверяли на 13, 15 редакциях. Сборки используем от PGPro. Тюнинг производили аналогично 12 редакции.
Чем обусловлена ситуация - мы не умеем тюнить постгес или в свежих редакциях что то сломалось?
Текст запроса (не изменялся от разработчика):
ВЫБРАТЬ
СтатусыОбъектовАренды.Услуга КАК Услуга,
СтатусыОбъектовАренды.ОбъектАренды КАК ОбъектАренды,
СтатусыОбъектовАренды.ДатаНачалаАренды КАК ДатаНачалаСрокаАренды,
ВЫБОР
КОГДА СтатусыОбъектовАренды.ДатаОкончанияАренды < &ДатаОкончания
ТОГДА СтатусыОбъектовАренды.ДатаОкончанияАренды
ИНАЧЕ &ДатаОкончания
КОНЕЦ КАК ДатаОкончанияСрокаАренды,
АР_СтавкиСрезПоследних.Ставка КАК Ставка,
АР_СтавкиСрезПоследних.СпособНачисления КАК СпособНачисления,
АР_СтавкиСрезПоследних.Площадь КАК Количество,
СтатусыОбъектовАренды.Услуга.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
ВЫБОР
КОГДА СтатусыОбъектовАренды.Счетчик ССЫЛКА Справочник.АР_СпискиСчетчиков
ТОГДА НЕОПРЕДЕЛЕНО
ИНАЧЕ СтатусыОбъектовАренды.Счетчик
КОНЕЦ КАК Счетчик,
СтатусыОбъектовАренды.КоэффициентОтнесенияСчетчика КАК КоэффициентОтнесенияСчетчика,
ЕСТЬNULL(АР_ЗаключениеДоговораАрендыПостояннаяЧастьАренднойПлаты.НомерСтроки, ЕСТЬNULL(АР_ЗаключениеДоговораАрендыПеременнаяЧастьАренднойПлаты.НомерСтроки, 9999)) КАК НомерСтрокиТЧ,
АР_СтавкиСрезПоследних.СтавкаНДС КАК СтавкаНДС
ИЗ
РегистрСведений.АР_СтатусыОбъектовАренды.СрезПоследних(
&МоментВремени,
ЗаключениеДоговора = &ЗаключениеДоговора
И Услуга.АР_ПостояннаяЧастьОплаты = &ПостояннаяЧасть) КАК СтатусыОбъектовАренды
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.АР_Ставки.СрезПоследних(
&МоментВремени,
СрокДействия >= &ДатаСреза
ИЛИ СрокДействия = ДАТАВРЕМЯ(1, 1, 1)) КАК АР_СтавкиСрезПоследних
ПО СтатусыОбъектовАренды.Договор = АР_СтавкиСрезПоследних.Договор
И СтатусыОбъектовАренды.ОбъектАренды = АР_СтавкиСрезПоследних.ОбъектАренды
И СтатусыОбъектовАренды.Услуга = АР_СтавкиСрезПоследних.Услуга
ЛЕВОЕ СОЕДИНЕНИЕ Документ.АР_ЗаключениеДоговораАренды.ПостояннаяЧастьАренднойПлаты КАК АР_ЗаключениеДоговораАрендыПостояннаяЧастьАренднойПлаты
ПО СтатусыОбъектовАренды.ОбъектАренды = АР_ЗаключениеДоговораАрендыПостояннаяЧастьАренднойПлаты.ОбъектАренды
И СтатусыОбъектовАренды.Услуга = АР_ЗаключениеДоговораАрендыПостояннаяЧастьАренднойПлаты.Услуга
И СтатусыОбъектовАренды.ЗаключениеДоговора = АР_ЗаключениеДоговораАрендыПостояннаяЧастьАренднойПлаты.Ссылка
ЛЕВОЕ СОЕДИНЕНИЕ Документ.АР_ЗаключениеДоговораАренды.ПеременнаяЧастьАренднойПлаты КАК АР_ЗаключениеДоговораАрендыПеременнаяЧастьАренднойПлаты
ПО СтатусыОбъектовАренды.ОбъектАренды = АР_ЗаключениеДоговораАрендыПеременнаяЧастьАренднойПлаты.ОбъектАренды
И СтатусыОбъектовАренды.Услуга = АР_ЗаключениеДоговораАрендыПеременнаяЧастьАренднойПлаты.Услуга
И СтатусыОбъектовАренды.ЗаключениеДоговора = АР_ЗаключениеДоговораАрендыПеременнаяЧастьАренднойПлаты.Ссылка
ГДЕ
СтатусыОбъектовАренды.ДатаНачалаАренды < &ДатаОкончания
УПОРЯДОЧИТЬ ПО
НомерСтрокиТЧ
ПоказатьПо теме из базы знаний
- Устройство хранения данных в MS SQL Server
- Не спеша, эффективно и правильно – путь разработки. Часть 2. Теория
- Parameter sniffing и генерация планов для разработчиков 1С
- Смотрим запросы 1С через Microsoft SQL Profiler по следам ошибок разработчиков, приводящих к проблемам производительности
- Нагрузочное тестирование на раз, два, три
Найденные решения
(1)
Добрый день,
проблема решена следующим образом:
Установлена редакция postges 15.4 от 1С скачаннаяhttps://releases.1c.ru .
Установлены рекомендованные параметры по памяти.
Запрос при любом значении параметра выполняется за 0,079 с.
редакцию от PGPro развернули в первый раз.
Добрый день,
проблема решена следующим образом:
Установлена редакция postges 15.4 от 1С скачанная
Установлены рекомендованные параметры по памяти.
Запрос при любом значении параметра выполняется за 0,079 с.
редакцию от PGPro развернули в первый раз.
Остальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1) для начала не плохо бы разнести получение срезов и не соединять их напрямую.и с физическими таблицами.
Можно выполнить отдельно часть запроса получения среза с параметром ПостояннаяЧасть. И посмотреть количество записей полученных при Истина и Ложь.
Могу предположить, что при Истина их намного меньше.
А при Ложь их очень много. И далее идет соединение полным перебором без использования индексов.
Можно выполнить отдельно часть запроса получения среза с параметром ПостояннаяЧасть. И посмотреть количество записей полученных при Истина и Ложь.
Могу предположить, что при Истина их намного меньше.
А при Ложь их очень много. И далее идет соединение полным перебором без использования индексов.
(1)
Добрый день,
проблема решена следующим образом:
Установлена редакция postges 15.4 от 1С скачаннаяhttps://releases.1c.ru .
Установлены рекомендованные параметры по памяти.
Запрос при любом значении параметра выполняется за 0,079 с.
редакцию от PGPro развернули в первый раз.
Добрый день,
проблема решена следующим образом:
Установлена редакция postges 15.4 от 1С скачанная
Установлены рекомендованные параметры по памяти.
Запрос при любом значении параметра выполняется за 0,079 с.
редакцию от PGPro развернули в первый раз.
(3)План запроса для
Для ЛОЖЬ консоль запросов вывалилась с ошибкой на запрос отразить план запроса.
Количество строк вызвращаемых при ЛОЖЬ = 0
ПостояннаяЧасть = ИСТИНА
"Sort (cost=7815.25..7815.25 rows=1 width=261) (actual time=723.761..723.769 rows=4 loops=1)
Output: t8._fld25919rref, t8._fld25920rref, t8._fld25922, (CASE WHEN (t8._fld25923 < '2023-12-20 00:00:00'::timestamp without time zone) THEN t8._fld25923 ELSE '2023-12-20 00:00:00'::timestamp without time zone END), t14._fld25913_type, t14._fld25913_n, t14._fld25913_rrref, t14._fld25914rref, t14._fld25915, t17._fld3601rref, (CASE WHEN ((t8._fld25925_type = '\\x08'::bytea) AND (t8._fld25925_rtref = '\\x0000835e'::bytea)) THEN '\\x01'::bytea ELSE t8._fld25925_type END), (CASE WHEN ((t8._fld25925_type = '\\x08'::bytea) AND (t8._fld25925_rtref = '\\x0000835e'::bytea)) THEN '\\x00000000'::bytea ELSE t8._fld25925_rtref END), (CASE WHEN ((t8._fld25925_type = '\\x08'::bytea) AND (t8._fld25925_rtref = '\\x0000835e'::bytea)) THEN '\\x00000000000000000000000000000000'::bytea ELSE t8._fld25925_rrref END), t8._fld25926, (COALESCE(t15._lineno19679, COALESCE(t16._lineno19688, '9999'::numeric))), t14._fld38594rref
Sort Key: (COALESCE(t15._lineno19679, COALESCE(t16._lineno19688, '9999'::numeric)))
Sort Method: quicksort Memory: 25kB
Buffers: shared hit=522956
-> Nested Loop Left Join (cost=7812.66..7815.24 rows=1 width=261) (actual time=690.144..723.760 rows=4 loops=1)
Output: t8._fld25919rref, t8._fld25920rref, t8._fld25922, CASE WHEN (t8._fld25923 < '2023-12-20 00:00:00'::timestamp without time zone) THEN t8._fld25923 ELSE '2023-12-20 00:00:00'::timestamp without time zone END, t14._fld25913_type, t14._fld25913_n, t14._fld25913_rrref, t14._fld25914rref, t14._fld25915, t17._fld3601rref, CASE WHEN ((t8._fld25925_type = '\\x08'::bytea) AND (t8._fld25925_rtref = '\\x0000835e'::bytea)) THEN '\\x01'::bytea ELSE t8._fld25925_type END, CASE WHEN ((t8._fld25925_type = '\\x08'::bytea) AND (t8._fld25925_rtref = '\\x0000835e'::bytea)) THEN '\\x00000000'::bytea ELSE t8._fld25925_rtref END, CASE WHEN ((t8._fld25925_type = '\\x08'::bytea) AND (t8._fld25925_rtref = '\\x0000835e'::bytea)) THEN '\\x00000000000000000000000000000000'::bytea ELSE t8._fld25925_rrref END, t8._fld25926, COALESCE(t15._lineno19679, COALESCE(t16._lineno19688, '9999'::numeric)), t14._fld38594rref
Inner Unique: true
Buffers: shared hit=522956
-> Nested Loop Left Join (cost=7812.56..7815.11 rows=1 width=150) (actual time=690.135..723.745 rows=4 loops=1)
Output: t8._fld25919rref, t8._fld25920rref, t8._fld25922, t8._fld25923, t8._fld25925_type, t8._fld25925_rtref, t8._fld25925_rrref, t8._fld25926, t14._fld25913_type, t14._fld25913_n, t14._fld25913_rrref, t14._fld25914rref, t14._fld25915, t14._fld38594rref, t15._lineno19679, t16._lineno19688
Join Filter: ((t8._fld25921_type = '\\x08'::bytea) AND (t8._fld25921_rtref = '\\x00000273'::bytea))
Buffers: shared hit=522944
-> Nested Loop Left Join (cost=7812.44..7814.71 rows=1 width=169) (actual time=690.127..723.731 rows=4 loops=1)
Output: t8._fld25919rref, t8._fld25920rref, t8._fld25922, t8._fld25923, t8._fld25925_type, t8._fld25925_rtref, t8._fld25925_rrref, t8._fld25926, t8._fld25921_type, t8._fld25921_rtref, t8._fld25921_rrref, t14._fld25913_type, t14._fld25913_n, t14._fld25913_rrref, t14._fld25914rref, t14._fld25915, t14._fld38594rref, t15._lineno19679
Join Filter: ((t8._fld25921_type = '\\x08'::bytea) AND (t8._fld25921_rtref = '\\x00000273'::bytea))
Buffers: shared hit=522936
-> Nested Loop (cost=7812.33..7814.50 rows=1 width=164) (actual time=690.114..723.713 rows=2 loops=1)
Output: t8._fld25919rref, t8._fld25920rref, t8._fld25922, t8._fld25923, t8._fld25925_type, t8._fld25925_rtref, t8._fld25925_rrref, t8._fld25926, t8._fld25921_type, t8._fld25921_rtref, t8._fld25921_rrref, t14._fld25913_type, t14._fld25913_n, t14._fld25913_rrref, t14._fld25914rref, t14._fld25915, t14._fld38594rref
Inner Unique: true
Join Filter: ((t8._fld25918rref = t4._fld25918rref) AND (t8._fld25919rref = t4._fld25919rref) AND (t8._fld25920rref = t4._fld25920rref) AND (t8._fld25921_type = t4._fld25921_type) AND (t8._fld25921_rtref = t4._fld25921_rtref) AND (t8._fld25921_rrref = t4._fld25921_rrref) AND (t8._period = (max(t4._period))) AND (t8._recordertref = (substr(max((t6._recordertref || t6._recorderrref)), 1, 4))) AND (t8._recorderrref = (substr(max((t6._recordertref || t6._recorderrref)), 5, 16))))
Rows Removed by Join Filter: 148045
Buffers: shared hit=522930
-> Nested Loop (cost=5721.74..5723.76 rows=1 width=313) (actual time=113.347..552.482 rows=74024 loops=1)
Output: t8._fld25919rref, t8._fld25920rref, t8._fld25922, t8._fld25923, t8._fld25925_type, t8._fld25925_rtref, t8._fld25925_rrref, t8._fld25926, t8._fld25918rref, t8._fld25921_type, t8._fld25921_rtref, t8._fld25921_rrref, t8._period, t8._recordertref, t8._recorderrref, t12._fld25910rref, t12._fld25911rref, t12._fld25912rref, t14._fld25913_type, t14._fld25913_n, t14._fld25913_rrref, t14._fld25914rref, t14._fld25915, t14._fld38594rref, t14._fld25910rref, t14._fld25911rref, t14._fld25912rref
Join Filter: (((max(t12._period)) = t14._period) AND ((substr(max((t13._recordertref || t13._recorderrref)), 1, 4)) = t14._recordertref) AND ((substr(max((t13._recordertref || t13._recorderrref)), 5, 16)) = t14._recorderrref))
Rows Removed by Join Filter: 111556
Buffers: shared hit=521526
-> Nested Loop (cost=5721.57..5723.53 rows=1 width=271) (actual time=113.334..296.348 rows=74024 loops=1)
Output: t8._fld25919rref, t8._fld25920rref, t8._fld25922, t8._fld25923, t8._fld25925_type, t8._fld25925_rtref, t8._fld25925_rrref, t8._fld25926, t8._fld25918rref, t8._fld25921_type, t8._fld25921_rtref, t8._fld25921_rrref, t8._period, t8._recordertref, t8._recorderrref, t12._fld25910rref, t12._fld25911rref, t12._fld25912rref, (max(t12._period)), (substr(max((t13._recordertref || t13._recorderrref)), 1, 4)), (substr(max((t13._recordertref || t13._recorderrref)), 5, 16))
Buffers: shared hit=172805
-> GroupAggregate (cost=5721.40..5721.52 rows=1 width=123) (actual time=113.308..149.977 rows=38538 loops=1)
Output: t12._fld25910rref, t12._fld25911rref, t12._fld25912rref, (max(t12._period)), substr(max((t13._recordertref || t13._recorderrref)), 1, 4), substr(max((t13._recordertref || t13._recorderrref)), 5, 16)
Group Key: t12._fld25910rref, t12._fld25911rref, t12._fld25912rref, (max(t12._period))
Buffers: shared hit=3386
-> Sort (cost=5721.40..5721.40 rows=1 width=81) (actual time=113.278..116.100 rows=42160 loops=1)
Output: t12._fld25910rref, t12._fld25911rref, t12._fld25912rref, (max(t12._period)), t13._recordertref, t13._recorderrref
Sort Key: t12._fld25910rref, t12._fld25911rref, t12._fld25912rref, (max(t12._period))
Sort Method: quicksort Memory: 6807kB
Buffers: shared hit=3386
-> Hash Join (cost=3005.69..5721.40 rows=1 width=81) (actual time=47.208..77.117 rows=42160 loops=1)
Output: t12._fld25910rref, t12._fld25911rref, t12._fld25912rref, (max(t12._period)), t13._recordertref, t13._recorderrref
Inner Unique: true
Hash Cond: ((t13._fld25910rref = t12._fld25910rref) AND (t13._fld25911rref = t12._fld25911rref) AND (t13._fld25912rref = t12._fld25912rref) AND (t13._period = (max(t12._period))))
Buffers: shared hit=3386
-> Seq Scan on public._inforg25909 t13 (cost=0.00..2424.64 rows=69303 width=81) (actual time=0.009..13.927 rows=69303 loops=1)
Output: t13._period, t13._recordertref, t13._recorderrref, t13._lineno, t13._active, t13._fld25910rref, t13._fld25911rref, t13._fld25912rref, t13._fld25913_type, t13._fld25913_n, t13._fld25913_rrref, t13._fld25914rref, t13._fld25915, t13._fld38594rref, t13._fld46441, t13._fld1173
Filter: (t13._active AND (t13._fld1173 = '0'::numeric) AND ((t13._fld46441 >= '2023-12-20 00:00:00'::timestamp without time zone) OR (t13._fld46441 = '0001-01-01 00:00:00'::timestamp without time zone)))
Buffers: shared hit=1693
-> Hash (cost=2908.67..2908.67 rows=6930 width=59) (actual time=47.183..47.185 rows=38538 loops=1)
Output: t12._fld25910rref, t12._fld25911rref, t12._fld25912rref, (max(t12._period))
Buckets: 65536 (originally 8192) Batches: 1 (originally 1) Memory Usage: 4125kB
Buffers: shared hit=1693
-> HashAggregate (cost=2770.07..2839.37 rows=6930 width=59) (actual time=32.337..38.253 rows=38538 loops=1)
Output: t12._fld25910rref, t12._fld25911rref, t12._fld25912rref, max(t12._period)
Group Key: t12._fld25910rref, t12._fld25911rref, t12._fld25912rref
Batches: 1 Memory Usage: 9745kB
Buffers: shared hit=1693
-> Seq Scan on public._inforg25909 t12 (cost=0.00..2493.94 rows=69031 width=59) (actual time=0.001..13.337 rows=69031 loops=1)
Output: t12._period, t12._recordertref, t12._recorderrref, t12._lineno, t12._active, t12._fld25910rref, t12._fld25911rref, t12._fld25912rref, t12._fld25913_type, t12._fld25913_n, t12._fld25913_rrref, t12._fld25914rref, t12._fld25915, t12._fld38594rref, t12._fld46441, t12._fld1173
Filter: (t12._active AND (t12._period <= '2023-12-20 00:00:00'::timestamp without time zone) AND (t12._fld1173 = '0'::numeric) AND ((t12._fld46441 >= '2023-12-20 00:00:00'::timestamp without time zone) OR (t12._fld46441 = '0001-01-01 00:00:00'::timestamp without time zone)))
Rows Removed by Filter: 272
Buffers: shared hit=1693
-> Index Scan using _inforg25917_3 on public._inforg25917 t8 (cost=0.17..1.99 rows=1 width=148) (actual time=0.003..0.003 rows=2 loops=38538)
Output: t8._period, t8._recordertref, t8._recorderrref, t8._lineno, t8._active, t8._fld25918rref, t8._fld25919rref, t8._fld25920rref, t8._fld25921_type, t8._fld25921_rtref, t8._fld25921_rrref, t8._fld25922, t8._fld25923, t8._fld25924rref, t8._fld25925_type, t8._fld25925_rtref, t8._fld25925_rrref, t8._fld25926, t8._fld1173
Index Cond: ((t8._fld1173 = '0'::numeric) AND (t8._fld25918rref = t12._fld25912rref) AND (t8._fld25919rref = t12._fld25910rref) AND (t8._fld25920rref = t12._fld25911rref))
Filter: (t8._fld25922 < '2023-12-20 00:00:00'::timestamp without time zone)
Rows Removed by Filter: 0
Buffers: shared hit=169419
-> Index Scan using _inforg25909_3 on public._inforg25909 t14 (cost=0.17..0.22 rows=1 width=144) (actual time=0.002..0.003 rows=3 loops=74024)
Output: t14._period, t14._recordertref, t14._recorderrref, t14._lineno, t14._active, t14._fld25910rref, t14._fld25911rref, t14._fld25912rref, t14._fld25913_type, t14._fld25913_n, t14._fld25913_rrref, t14._fld25914rref, t14._fld25915, t14._fld38594rref, t14._fld46441, t14._fld1173
Index Cond: ((t14._fld1173 = '0'::numeric) AND (t14._fld25910rref = t8._fld25919rref) AND (t14._fld25911rref = t8._fld25920rref) AND (t14._fld25912rref = t8._fld25918rref))
Buffers: shared hit=348721
-> GroupAggregate (cost=2090.59..2090.71 rows=1 width=147) (actual time=0.001..0.002 rows=2 loops=74024)
Output: t4._fld25918rref, t4._fld25919rref, t4._fld25920rref, t4._fld25921_type, t4._fld25921_rtref, t4._fld25921_rrref, (max(t4._period)), substr(max((t6._recordertref || t6._recorderrref)), 1, 4), substr(max((t6._recordertref || t6._recorderrref)), 5, 16)
Group Key: t4._fld25918rref, t4._fld25919rref, t4._fld25920rref, t4._fld25921_type, t4._fld25921_rtref, t4._fld25921_rrref, (max(t4._period))
Buffers: shared hit=1404
-> Sort (cost=2090.59..2090.59 rows=1 width=105) (actual time=0.000..0.000 rows=2 loops=74024)
Output: t4._fld25918rref, t4._fld25919rref, t4._fld25920rref, t4._fld25921_type, t4._fld25921_rtref, t4._fld25921_rrref, (max(t4._period)), t6._recordertref, t6._recorderrref
Sort Key: t4._fld25918rref, t4._fld25919rref, t4._fld25920rref, (max(t4._period))
Sort Method: quicksort Memory: 25kB
Buffers: shared hit=1404
-> Nested Loop (cost=0.33..2090.59 rows=1 width=105) (actual time=8.615..9.617 rows=2 loops=1)
Output: t4._fld25918rref, t4._fld25919rref, t4._fld25920rref, t4._fld25921_type, t4._fld25921_rtref, t4._fld25921_rrref, (max(t4._period)), t6._recordertref, t6._recorderrref
Inner Unique: true
Join Filter: (t4._fld25919rref = t7._idrref)
Rows Removed by Join Filter: 14
Buffers: shared hit=1404
-> Nested Loop (cost=0.33..2070.89 rows=1 width=122) (actual time=8.566..9.502 rows=2 loops=1)
Output: t4._fld25918rref, t4._fld25919rref, t4._fld25920rref, t4._fld25921_type, t4._fld25921_rtref, t4._fld25921_rrref, (max(t4._period)), t6._recordertref, t6._recorderrref, t6._fld25919rref
Buffers: shared hit=1374
-> GroupAggregate (cost=0.17..2069.78 rows=1 width=83) (actual time=8.554..9.482 rows=2 loops=1)
Output: t4._fld25918rref, t4._fld25919rref, t4._fld25920rref, t4._fld25921_type, t4._fld25921_rtref, t4._fld25921_rrref, max(t4._period)
Group Key: t4._fld25918rref, t4._fld25919rref, t4._fld25920rref, t4._fld25921_type, t4._fld25921_rtref, t4._fld25921_rrref
Buffers: shared hit=1367
-> Nested Loop (cost=0.17..2069.76 rows=1 width=83) (actual time=8.545..9.474 rows=2 loops=1)
Output: t4._fld25918rref, t4._fld25919rref, t4._fld25920rref, t4._fld25921_type, t4._fld25921_rtref, t4._fld25921_rrref, t4._period
Inner Unique: true
Join Filter: (t4._fld25919rref = t5._idrref)
Rows Removed by Join Filter: 14
Buffers: shared hit=1367
-> Index Only Scan using _inforg25917_3 on public._inforg25917 t4 (cost=0.17..2049.78 rows=3 width=83) (actual time=8.451..9.376 rows=2 loops=1)
Output: t4._fld1173, t4._fld25918rref, t4._fld25919rref, t4._fld25920rref, t4._fld25921_type, t4._fld25921_rtref, t4._fld25921_rrref, t4._period, t4._recordertref, t4._recorderrref, t4._lineno, t4._active
Index Cond: ((t4._fld1173 = '0'::numeric) AND (t4._fld25921_type = '\\x08'::bytea) AND (t4._fld25921_rtref = '\\x00000273'::bytea) AND (t4._fld25921_rrref = '\\x865200155d0a1f2311ee101740b50113'::bytea) AND (t4._period <= '2023-12-20 00:00:00'::timestamp without time zone) AND (t4._active = true))
Heap Fetches: 0
Buffers: shared hit=1352
-> Materialize (cost=0.00..19.60 rows=11 width=17) (actual time=0.013..0.046 rows=8 loops=2)
Output: t5._idrref
Buffers: shared hit=15
-> Seq Scan on public._reference137 t5 (cost=0.00..19.58 rows=11 width=17) (actual time=0.022..0.086 rows=8 loops=1)
Output: t5._idrref
Filter: (t5._fld3616 AND (t5._fld1173 = '0'::numeric))
Rows Removed by Filter: 175
Buffers: shared hit=15
-> Index Only Scan using _inforg25917_3 on public._inforg25917 t6 (cost=0.17..1.09 rows=1 width=105) (actual time=0.007..0.008 rows=1 loops=2)
Output: t6._fld1173, t6._fld25918rref, t6._fld25919rref, t6._fld25920rref, t6._fld25921_type, t6._fld25921_rtref, t6._fld25921_rrref, t6._period, t6._recordertref, t6._recorderrref, t6._lineno, t6._active
Index Cond: ((t6._fld1173 = '0'::numeric) AND (t6._fld25918rref = t4._fld25918rref) AND (t6._fld25919rref = t4._fld25919rref) AND (t6._fld25920rref = t4._fld25920rref) AND (t6._fld25921_type = '\\x08'::bytea) AND (t6._fld25921_rtref = '\\x00000273'::bytea) AND (t6._fld25921_rrref = '\\x865200155d0a1f2311ee101740b50113'::bytea) AND (t6._period = (max(t4._period))) AND (t6._active = true))
Heap Fetches: 0
Buffers: shared hit=7
-> Seq Scan on public._reference137 t7 (cost=0.00..19.58 rows=11 width=17) (actual time=0.007..0.055 rows=8 loops=2)
Output: t7._idrref, t7._version, t7._marked, t7._predefinedid, t7._parentidrref, t7._folder, t7._code, t7._description, t7._fld3600, t7._fld3615rref, t7._fld3601rref, t7._fld3599, t7._fld3603, t7._fld3604, t7._fld3605rref, t7._fld3606rref, t7._fld3607rref, t7._fld3608rref, t7._fld3609rref, t7._fld3610rref, t7._fld3611rref, t7._fld3612rref, t7._fld35461rref, t7._fld3613rref, t7._fld3614rref, t7._fld3616, t7._fld3617, t7._fld3618, t7._fld3619, t7._fld3620, t7._fld3621, t7._fld35462rref, t7._fld3623, t7._fld3602rref, t7._fld28360rref, t7._fld29737, t7._fld29738, t7._fld29784rref, t7._fld29789rref, t7._fld3622, t7._fld3624rref, t7._fld31627rref, t7._fld59074rref, t7._fld36820, t7._fld38596rref, t7._fld46618, t7._fld46619, t7._fld46620, t7._fld46621, t7._fld46622, t7._fld46623, t7._fld46624, t7._fld46625, t7._fld46626, t7._fld46627, t7._fld46628rref, t7._fld49235, t7._fld49236, t7._fld46883, t7._fld46884, t7._fld49816, t7._fld47837, t7._fld58201, t7._fld58202, t7._fld58203, t7._fld58204, t7._fld58205, t7._fld58206, t7._fld58207, t7._fld58208, t7._fld58209, t7._fld58210, t7._fld58211, t7._fld1173
Filter: (t7._fld3616 AND (t7._fld1173 = '0'::numeric))
Rows Removed by Filter: 175
Buffers: shared hit=30
-> Index Scan using _document627_vt19678_skx1 on public._document627_vt19678x1 t15 (cost=0.12..0.20 rows=1 width=56) (actual time=0.006..0.007 rows=2 loops=2)
Output: t15._document627_idrref, t15._fld1173, t15._keyfield, t15._lineno19679, t15._fld19680rref, t15._fld19681rref, t15._fld19682, t15._fld19683rref, t15._fld19684_type, t15._fld19684_n, t15._fld19684_rrref, t15._fld19685, t15._fld19686, t15._fld38586rref
Index Cond: ((t15._fld1173 = '0'::numeric) AND (t15._document627_idrref = t8._fld25921_rrref))
Filter: ((t8._fld25920rref = t15._fld19680rref) AND (t8._fld25919rref = t15._fld19681rref))
Rows Removed by Filter: 2
Buffers: shared hit=6
-> Index Scan using _document627_vt19687_skx1 on public._document627_vt19687x1 t16 (cost=0.12..0.39 rows=1 width=56) (actual time=0.003..0.003 rows=0 loops=4)
Output: t16._document627_idrref, t16._fld1173, t16._keyfield, t16._lineno19688, t16._fld19689rref, t16._fld19690rref, t16._fld19691, t16._fld19692rref, t16._fld19693rref, t16._fld19694_type, t16._fld19694_n, t16._fld19694_rrref, t16._fld19695, t16._fld19696, t16._fld19697_type, t16._fld19697_rtref, t16._fld19697_rrref, t16._fld19698, t16._fld38587rref
Index Cond: ((t16._fld1173 = '0'::numeric) AND (t16._document627_idrref = t8._fld25921_rrref))
Filter: ((t8._fld25920rref = t16._fld19689rref) AND (t8._fld25919rref = t16._fld19690rref))
Buffers: shared hit=8
-> Index Scan using _reference137_s_hpk on public._reference137 t17 (cost=0.11..0.13 rows=1 width=34) (actual time=0.002..0.002 rows=1 loops=4)
Output: t17._idrref, t17._version, t17._marked, t17._predefinedid, t17._parentidrref, t17._folder, t17._code, t17._description, t17._fld3600, t17._fld3615rref, t17._fld3601rref, t17._fld3599, t17._fld3603, t17._fld3604, t17._fld3605rref, t17._fld3606rref, t17._fld3607rref, t17._fld3608rref, t17._fld3609rref, t17._fld3610rref, t17._fld3611rref, t17._fld3612rref, t17._fld35461rref, t17._fld3613rref, t17._fld3614rref, t17._fld3616, t17._fld3617, t17._fld3618, t17._fld3619, t17._fld3620, t17._fld3621, t17._fld35462rref, t17._fld3623, t17._fld3602rref, t17._fld28360rref, t17._fld29737, t17._fld29738, t17._fld29784rref, t17._fld29789rref, t17._fld3622, t17._fld3624rref, t17._fld31627rref, t17._fld59074rref, t17._fld36820, t17._fld38596rref, t17._fld46618, t17._fld46619, t17._fld46620, t17._fld46621, t17._fld46622, t17._fld46623, t17._fld46624, t17._fld46625, t17._fld46626, t17._fld46627, t17._fld46628rref, t17._fld49235, t17._fld49236, t17._fld46883, t17._fld46884, t17._fld49816, t17._fld47837, t17._fld58201, t17._fld58202, t17._fld58203, t17._fld58204, t17._fld58205, t17._fld58206, t17._fld58207, t17._fld58208, t17._fld58209, t17._fld58210, t17._fld58211, t17._fld1173
Index Cond: ((t17._fld1173 = '0'::numeric) AND (t17._idrref = t8._fld25919rref))
Buffers: shared hit=12
Planning:
Buffers: shared hit=4
Planning Time: 24.753 ms
Execution Time: 723.903 ms
",RowsAffected=4
ПоказатьДля ЛОЖЬ консоль запросов вывалилась с ошибкой на запрос отразить план запроса.
Количество строк вызвращаемых при ЛОЖЬ = 0
(7) "При запросе Истина, ответ через 0,7 сек, при Ложь 700 сек."
1. план ваш не смотрел, много времени копаться нет
2. Ну если у вас большое количество записей, а нужного индекса нет, то предпложу что происходит сканирование таблицы
для ИСТИНЫ записи быстро находятся, видимо их немного, а остальные записи с ложью и перебирается вся таблица
тут время будет пропорционально размеру
в более поздних версиях платформы изменился механизм "AQO — адаптивная оптимизация запросов", можете попробовать его тупо выключить , подробнееhttps://postgrespro.ru/docs/postgrespro/14/aqo
DROP EXTENSION aqo;
SELECT aqo_reset();
и возможно удалить строчку
shared_preload_libraries = 'aqo'
из файла postgresql.conf.
3. Также появился "параллелизм". Посмотрите его внимательней. Если там настроено на многопоточку, то настройте ради эксперимента на один поток. Хотя кажется что маловероятно дело в этом, визуально в плане не многопоточка не бросается сходу в глаза.
ALTER SYSTEM SET max_parallel_workers_per_gather TO 1; --2 это дефолтовое значение
-- значение 0 означает что не будет параллелизма, чем больше конкуренции за ресусры, больше блокировок,
-- ем выше загруженность процессора, тем меньше это значение. При одном пользователи значение будет максимальным.
-- Можно также пробовать при закрытии месяца, реструкторизации, загрузке dt в один поток 1с разрешать большие значения.
-- При многопоточной загрузке dt 1С наоборот отключать ставя 0.
ALTER SYSTEM SET max_parallel_workers TO 1;--8 - дефолтовое значение
-- рекомендуется подбирать настройку смотря на загруженность процессора, при загруженности меньше 30%
--пробуйте добавить пару ядер, перечитать настройки и оценить новую загруженность
ALTER SYSTEM SET max_worker_processes TO 1;--8 - дефолтовое значение
--обычно совпадает max_parallel_workers
ALTER SYSTEM SET parallel_leader_participation TO off;-- поумолчанию включен
-- есть смысл отключать только по указанию программиста, степень положительного или отрицательного влияния
-- ведущего зависит от типа плана запроса, числа рабочих процессов и длительности запроса.
1. план ваш не смотрел, много времени копаться нет
2. Ну если у вас большое количество записей, а нужного индекса нет, то предпложу что происходит сканирование таблицы
для ИСТИНЫ записи быстро находятся, видимо их немного, а остальные записи с ложью и перебирается вся таблица
тут время будет пропорционально размеру
в более поздних версиях платформы изменился механизм "AQO — адаптивная оптимизация запросов", можете попробовать его тупо выключить , подробнее
DROP EXTENSION aqo;
SELECT aqo_reset();
и возможно удалить строчку
shared_preload_libraries = 'aqo'
из файла postgresql.conf.
3. Также появился "параллелизм". Посмотрите его внимательней. Если там настроено на многопоточку, то настройте ради эксперимента на один поток. Хотя кажется что маловероятно дело в этом, визуально в плане не многопоточка не бросается сходу в глаза.
ALTER SYSTEM SET max_parallel_workers_per_gather TO 1; --2 это дефолтовое значение
-- значение 0 означает что не будет параллелизма, чем больше конкуренции за ресусры, больше блокировок,
-- ем выше загруженность процессора, тем меньше это значение. При одном пользователи значение будет максимальным.
-- Можно также пробовать при закрытии месяца, реструкторизации, загрузке dt в один поток 1с разрешать большие значения.
-- При многопоточной загрузке dt 1С наоборот отключать ставя 0.
ALTER SYSTEM SET max_parallel_workers TO 1;--8 - дефолтовое значение
-- рекомендуется подбирать настройку смотря на загруженность процессора, при загруженности меньше 30%
--пробуйте добавить пару ядер, перечитать настройки и оценить новую загруженность
ALTER SYSTEM SET max_worker_processes TO 1;--8 - дефолтовое значение
--обычно совпадает max_parallel_workers
ALTER SYSTEM SET parallel_leader_participation TO off;-- поумолчанию включен
-- есть смысл отключать только по указанию программиста, степень положительного или отрицательного влияния
-- ведущего зависит от типа плана запроса, числа рабочих процессов и длительности запроса.
зачем эти простыни со спецификой соединений?
выделяем то, что "подозреваем" в не оптимальности и исследуем
Если в этом блоке все Ок вне зависимости от параметра, то тогда ныряем в дебри
выделяем то, что "подозреваем" в не оптимальности и исследуем
ВЫБРАТЬ
Т.Ставка КАК Ставка
ИЗ
РегистрСведений.АР_СтатусыОбъектовАренды.СрезПоследних(
&МоментВремени,
ЗаключениеДоговора = &ЗаключениеДоговора
И Услуга.АР_ПостояннаяЧастьОплаты = &ПостояннаяЧасть) КАК Т
Если в этом блоке все Ок вне зависимости от параметра, то тогда ныряем в дебри
(8)
При любом параметре запрос работает Ок
И
так же запрос отрабатывает без проблем
все Ок вне зависимости от параме
ВЫБРАТЬ
АР_СтатусыОбъектовАрендыСрезПоследних.ОбъектАренды КАК ОбъектАренды
ИЗ
РегистрСведений.АР_СтатусыОбъектовАренды.СрезПоследних(
&МоментВремени,
Договор.КС_ДоговорАренды = &ДоговорАренды
И Услуга.АР_ПостояннаяЧастьОплаты = &ПостояннаяЧастьОплаты) КАК АР_СтатусыОбъектовАрендыСрезПоследних
При любом параметре запрос работает Ок
И Услуга.АР_ПостояннаяЧастьОплаты) КАК Т
И
И НЕ Услуга.АР_ПостояннаяЧастьОплаты) КАК Т
так же запрос отрабатывает без проблем
Я бы исследовал пару подзапросов, а уже потом с параметром
ВЫБРАТЬ
Т.Ставка КАК Ставка
ИЗ
РегистрСведений.АР_СтатусыОбъектовАренды.СрезПоследних(
&МоментВремени,
ЗаключениеДоговора = &ЗаключениеДоговора
И Услуга.АР_ПостояннаяЧастьОплаты) КАК Т
;
ВЫБРАТЬ
Т.Ставка КАК Ставка
ИЗ
РегистрСведений.АР_СтатусыОбъектовАренды.СрезПоследних(
&МоментВремени,
ЗаключениеДоговора = &ЗаключениеДоговора
И НЕ Услуга.АР_ПостояннаяЧастьОплаты) КАК Т
Показать
(13)И вот это условие сделать до соединения временных таблиц, которые Вы в консоли будете пробовать.
РегистрСведений.АР_Ставки есть "Услуга", есть связь с "СтатусыОбъектовАренды.Услуга", но условия на услугу в срезе ставок нет. Почему?
Услуга - это наверняка относительно не большой справочник. Можно сразу получить все нужные и условие поменять на "Услуга В (Выбрать т.Ссылка из Справочник.Услуги как т ГДЕ...)
ГДЕ
СтатусыОбъектовАренды.ДатаНачалаАренды < &ДатаОкончания
РегистрСведений.АР_Ставки есть "Услуга", есть связь с "СтатусыОбъектовАренды.Услуга", но условия на услугу в срезе ставок нет. Почему?
Услуга - это наверняка относительно не большой справочник. Можно сразу получить все нужные и условие поменять на "Услуга В (Выбрать т.Ссылка из Справочник.Услуги как т ГДЕ...)
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот