Время отработки СрезПоследних

1. osharov_d 23.08.17 11:41 Сейчас в теме
Коллеги, заранее извиняюсь если спрашиваю что-то глупое :)

Платформа 1C 8.2.19, SQL
Есть периодический РС с подчинением регистратору. Периодичность "День".
Физически записей в регистре около 1,5 млн

При использовании "СрезПоследних" запрос выполняется около 15 секунд:

ВЫБРАТЬ
	ЦеныНоменклатурыПоПартиямСериямСрезПоследних.ТипЦен,
	ЦеныНоменклатурыПоПартиямСериямСрезПоследних.Номенклатура КАК Номенклатура,
	ЦеныНоменклатурыПоПартиямСериямСрезПоследних.Цена
ИЗ
	РегистрСведений.ЦеныНоменклатурыПоПартиямСериям.СрезПоследних(
			&Период,
			ТипЦен = &ТипЦен
				И Номенклатура = &Номенклатура) КАК ЦеныНоменклатурыПоПартиямСериямСрезПоследних

Показать


Если я выполняю запрос в следующем виде, то время выполнения <= 1 секунды. Таблицы результата одинаковые.

ВЫБРАТЬ
	МАКСИМУМ(ЦеныНоменклатурыПоПартиямСериям.Период) КАК Период,
	ЦеныНоменклатурыПоПартиямСериям.ТипЦен,
	ЦеныНоменклатурыПоПартиямСериям.Номенклатура,
	ЦеныНоменклатурыПоПартиямСериям.ХарактеристикаНоменклатуры,
	ЦеныНоменклатурыПоПартиямСериям.СерияНоменклатуры,
	ЦеныНоменклатурыПоПартиямСериям.Партия,
	ЦеныНоменклатурыПоПартиямСериям.ЦенаИмпортераИзготовителя
ПОМЕСТИТЬ ВТ_ПериодЦен
ИЗ
	РегистрСведений.ЦеныНоменклатурыПоПартиямСериям КАК ЦеныНоменклатурыПоПартиямСериям
ГДЕ
	ЦеныНоменклатурыПоПартиямСериям.Период <= &Период
	И ЦеныНоменклатурыПоПартиямСериям.ТипЦен = &ТипЦен
	И ЦеныНоменклатурыПоПартиямСериям.Номенклатура = &Номенклатура

СГРУППИРОВАТЬ ПО
	ЦеныНоменклатурыПоПартиямСериям.ТипЦен,
	ЦеныНоменклатурыПоПартиямСериям.Номенклатура,
	ЦеныНоменклатурыПоПартиямСериям.Партия,
	ЦеныНоменклатурыПоПартиямСериям.ХарактеристикаНоменклатуры,
	ЦеныНоменклатурыПоПартиямСериям.СерияНоменклатуры,
	ЦеныНоменклатурыПоПартиямСериям.ЦенаИмпортераИзготовителя
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ВТ_ПериодЦен.Период,
	ВТ_ПериодЦен.ТипЦен,
	ВТ_ПериодЦен.Номенклатура,
	ЦеныНоменклатурыПоПартиямСериям.Цена
ИЗ
	ВТ_ПериодЦен КАК ВТ_ПериодЦен
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатурыПоПартиямСериям КАК ЦеныНоменклатурыПоПартиямСериям
		ПО ВТ_ПериодЦен.Период = ЦеныНоменклатурыПоПартиямСериям.Период
			И ВТ_ПериодЦен.ТипЦен = ЦеныНоменклатурыПоПартиямСериям.ТипЦен
			И ВТ_ПериодЦен.Номенклатура = ЦеныНоменклатурыПоПартиямСериям.Номенклатура
			И ВТ_ПериодЦен.ХарактеристикаНоменклатуры = ЦеныНоменклатурыПоПартиямСериям.ХарактеристикаНоменклатуры
			И ВТ_ПериодЦен.СерияНоменклатуры = ЦеныНоменклатурыПоПартиямСериям.СерияНоменклатуры
			И ВТ_ПериодЦен.Партия = ЦеныНоменклатурыПоПартиямСериям.Партия
			И ВТ_ПериодЦен.ЦенаИмпортераИзготовителя = ЦеныНоменклатурыПоПартиямСериям.ЦенаИмпортераИзготовителя
Показать


почему такая разница по времени и нормально ли это???
Прикрепленные файлы:
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
4. nytlenc 23.08.17 12:20 Сейчас в теме
(1)
При использовании "СрезПоследних" запрос выполняется около 15 секунд:


Нужно оптимизировать как минимум так:

ВЫБРАТЬ
    ЦеныНоменклатурыПоПартиямСериямСрезПоследних.ТипЦен,
    ЦеныНоменклатурыПоПартиямСериямСрезПоследних.Номенклатура КАК Номенклатура,
    ЦеныНоменклатурыПоПартиямСериямСрезПоследних.Цена
ИЗ
    РегистрСведений.ЦеныНоменклатурыПоПартиямСериям.СрезПоследних(
            &Период,
            (ТипЦен, Номенклатура) В (ВЫБРАТЬ &ТипЦен, &Номенклатура)) КАК ЦеныНоменклатурыПоПартиямСериямСрезПоследних
Показать


возможно еще необходимо добавить какие-то отборы в параметры регистра... К сожалению я не вижу структуру всего регистра и есть ли еще какие-то исходные данные по которым можно поставить фильтры в запросе.
Составные измерения (имеющие более одного типа) в регистре есть? Тоесть ТипЦен, и Номенклатура это однозначно ссылка на один справочник? Или на несколько?
5. osharov_d 23.08.17 12:23 Сейчас в теме
(4) Структура регистра на скриншоте приложена в самом начале.
По составным типам - измерение "Партия" (7 видов документов), но в отборах тут не участвует.
7. nytlenc 23.08.17 12:25 Сейчас в теме
(5) если у Измерения "Номенклатура" свойство Индексировать установлено в "Не индексировать" измените на "Индексировать". После изменения возможно придется переиндексировать таблицы БД через тестирование и исправление.
10. osharov_d 23.08.17 12:28 Сейчас в теме
(7) индексы
Период + [Измерение1 + ...]
и
Измерение1 + [Измерение2 +...] + Период

создаются автоматически независимо от настроек
12. osharov_d 23.08.17 12:30 Сейчас в теме
(10) хотя вроде пишут что
Измерение1 + [Измерение2 +...] + Период
только для 8.3 ... может тут и косяк какой ...
14. nytlenc 23.08.17 12:35 Сейчас в теме
(12) здесь https://its.1c.ru/db/metod8dev/content/1590/hdoc про 8.3 ничего не сказано. Написано "Создаются системой 1С:Предприятие 8."
16. osharov_d 23.08.17 12:36 Сейчас в теме
17. Сурикат 394 23.08.17 12:38 Сейчас в теме
(16)
Эта документация для последних версий платформы

У вас на старой платформе индексы могут отличаться и запрос среза последних может отличаться.
Посомтрите план запроса, сразу все увидите
20. nytlenc 23.08.17 13:43 Сейчас в теме
(16) предпочитаю доверять или официальным ресурсам или проверенной лично информации :)
15. TODD22 18 23.08.17 12:35 Сейчас в теме
(12)А откуда у вас 27 записей в результате? Если у вас исходя из условий в запросе выбираются цены по одной номенклатуре с одним типом цен? Или я что то не так понял?

Попробуйте убрать параметр Период. Так же отработает по скорости или нет?
18. osharov_d 23.08.17 12:39 Сейчас в теме
(15) разные партии, серии. это же не итоги, а срез последних ...

без периода картина та же
13. nytlenc 23.08.17 12:34 Сейчас в теме
(10) ну это только если в том случае, что "Индекс, включающий все измерения в том порядке, в котором они заданы при конфигурировании и поле Период."
хотя данное условие как посмотреть в запросе как раз таки выполняется.
Просто создается ощущение, что запрос именно перебирает таблицу а не выбирает по индексу
6. osharov_d 23.08.17 12:24 Сейчас в теме
(4)
(ТипЦен, Номенклатура) В (ВЫБРАТЬ &ТипЦен, &Номенклатура)

не помогло
9. nytlenc 23.08.17 12:26 Сейчас в теме
(6) СУБД если да то какая? Или файловая? прошу прощения за невнимательность. MS SQL или Postgre?
11. osharov_d 23.08.17 12:29 Сейчас в теме
19. osharov_d 23.08.17 12:44 Сейчас в теме
32. spacecraft 23.08.17 19:30 Сейчас в теме
(1) Профайлер sql тащится от 1с. Похоже не успевает создать оптимальный план запроса.

ВЫБРАТЬ
    ЦеныНоменклатурыПоПартиямСериямСрезПоследних.ТипЦен,
    ЦеныНоменклатурыПоПартиямСериямСрезПоследних.Номенклатура КАК Номенклатура,
    ЦеныНоменклатурыПоПартиямСериямСрезПоследних.Партия,
    ЦеныНоменклатурыПоПартиямСериямСрезПоследних.Цена
ИЗ
    РегистрСведений.ЦеныНоменклатурыПоПартиямСериям.СрезПоследних(
            &Период,
            ТипЦен = &ТипЦен
                И Номенклатура = &Номенклатура) КАК ЦеныНоменклатурыПоПартиямСериямСрезПоследних
Показать

Что он скажет на это?
33. osharov_d 23.08.17 20:20 Сейчас в теме
(32) проверю завтра, но запрос

ВЫБРАТЬ
    ЦеныНоменклатурыПоПартиямСериямСрезПоследних.ТипЦен,
    ЦеныНоменклатурыПоПартиямСериямСрезПоследних.Номенклатура КАК Номенклатура
ИЗ
    РегистрСведений.ЦеныНоменклатурыПоПартиямСериям.СрезПоследних(
            &Период,
            ТипЦен = &ТипЦен
                И Номенклатура = &Номенклатура) КАК ЦеныНоменклатурыПоПартиямСериямСрезПоследних
Показать


отрабатывает мгновенно. Как только добавляю цену - тупняк :(
35. Kinestetik 23 24.08.17 17:01 Сейчас в теме
(33) Было нечто подобное у меня. Как раз-таки для цен номенклатуры. Похоже, оптимизатор запросов сбит с толку и неправильно отрабатывает. Используйте тогда запрос из вашего первого поста, с временными таблицами который
2. Goleff74 215 23.08.17 12:14 Сейчас в теме
Вы прям этот запрос замеряете? Или это часть запроса?
По сути второй запрос - это запрос, в который SQL должен преобразовать первый запрос. Статистику пересчитывали на СКЛ?
3. osharov_d 23.08.17 12:18 Сейчас в теме
(2) ну нет ) выполняю просто через консоль запросов в предприятии. В итоговой таблице 27 записей так что сам вывод на форму по времени много занимать не может
8. alxarz 31 23.08.17 12:25 Сейчас в теме
тут наверняка можно найти почему https://infostart.ru/public/527518/
а ещё в профайлере посмотреть...
21. osharov_d 23.08.17 14:15 Сейчас в теме
Обнаружил интересную деталь:
Вот в таком варианте запрос отрабатывает меньше секунды
ВЫБРАТЬ
	ЦеныНоменклатурыПоПартиямСериямСрезПоследних.ТипЦен,
	ЦеныНоменклатурыПоПартиямСериямСрезПоследних.Номенклатура КАК Номенклатура,
	ЦеныНоменклатурыПоПартиямСериямСрезПоследних.Цена
ИЗ
	РегистрСведений.ЦеныНоменклатурыПоПартиямСериям.СрезПоследних(
			&Период,
			ТипЦен.Код = "000000014" И Номенклатура.Код = "р0000010017") КАК ЦеныНоменклатурыПоПартиямСериямСрезПоследних
Показать


попытаюсь и правда план запроса посмотреть ...
22. Onwardv 64 23.08.17 14:37 Сейчас в теме
Да всегда СрезПоследних, как и СрезПервых не быстрее пакета из трех или четырех запросов, выбирающих то же самое из реальной таблицы.
И чем записей больше, тем медленнее.

Также жутко тормозит, конструкция вида "...СрезПоследних(, Номенклатура В (выбрать * из ВТ_СписокНоменклатуры))... ". Если ВТ_СписокНоменклатуры содержит хотя бы несколько сотен записей. А делаешь пакет из несколько запросов к реальной таблице регистра и совсем другая скорость.
23. osharov_d 23.08.17 14:43 Сейчас в теме
(22) но не на порядок же ...

если бы не (21) - я бы согласился наверное
24. osharov_d 23.08.17 15:33 Сейчас в теме
в общем как-то так:
Прикрепленные файлы:
27. ildarovich 7865 23.08.17 17:29 Сейчас в теме
(24) Рисунок с планом запроса обрезанный - что-то за кадром осталось. Там написано какого индекса не хватает. Ну и план "быстрого" запроса тоже не помешал бы.
31. osharov_d 23.08.17 17:56 Сейчас в теме
(27)
/*
Отсутствуют сведения об индексе из план выполнения.sqlplan
Обработчик запросов считает, что реализация следующего индекса может сократить стоимость запроса на 89.6756%.
*/

/*
USE [crm]
GO
CREATE NONCLUSTERED INDEX [<Name of Missing Index, sysname,>]
ON [dbo].[_InfoRg7633] ([_Active],[_Fld7634RRef],[_Fld7635RRef],[_Period])
INCLUDE ([_Fld7636RRef],[_Fld7637RRef],[_Fld7638_TYPE],[_Fld7638_RTRef],[_Fld7638_RRRef],[_Fld7639])
GO
*/

Показать
25. Glebis 13 23.08.17 16:00 Сейчас в теме
Измерения ТипЦен и Номенклатуры с составным типом? Если да, то отборы по измерениям в виртуальной таблице нужно "ВЫРАЗИТЬ".
26. osharov_d 23.08.17 16:16 Сейчас в теме
28. Skill 23.08.17 17:43 Сейчас в теме
попробуйте написать в условии не
ТипЦен = &ТипЦен
                И Номенклатура = &Номенклатура

а,
Номенклатура = &Номенклатура И ТипЦен = &ТипЦен
                
30. osharov_d 23.08.17 17:53 Сейчас в теме
(28) то же самое ... да в в структуре метаданных сначала ТипЦен, потом Номенклатура
29. osharov_d 23.08.17 17:53 Сейчас в теме
Самое интересное, что на моей файловой копии запрос пролетает почти мгновенно в любом варианте
34. Glebis 13 24.08.17 11:28 Сейчас в теме
Возможно необходимо обновить статистику.
36. nvv1970 01.09.17 23:45 Сейчас в теме
У меня в практике попался запрос к срезу, который периодический подвисал на 30 сек. Записей - тоже счет на миллионы.
Где-то есть была инфа, что срезы - вещь проблемная. Соединение с вложенным запросом не использует статистику. Переписывание на временную таблицу решает проблему, т.к. соединение с ней и статистику использует и индексирование. Ну или на 83 ставим галку "срез последних" для хранения в физической таблице.
У меня все решилось переписыванием на ВТ. Проблема больше не проявлялась, хотя регистр активно изменяется.
Не нужно заморачиваться о причинах. Нужно знать одно: соединение с подзапросами может приподносить сюрпризы.
37. bocharovki 7 17.04.21 09:34 Сейчас в теме
Подниму эту старую тему.....

Столкнулся с такой же проблемой имеем следующий запрос:

ВЫБРАТЬ
	ПоказанияИПУ.Строение КАК Строение,
	ПоказанияИПУ.Помещение КАК Помещение,
	ПоказанияИПУ.ЛицевойСчет КАК ЛицевойСчет,
	ПоказанияИПУ.КатегорияУслуги КАК КатегорияУслуги,
	ПоказанияИПУ.ИндивидуальныйПриборУчета КАК ИндивидуальныйПриборУчета
	ПоказанияИПУ.Период КАК ДатаПоказаний,
	ПоказанияИПУ.Показание КАК Показание,
	ПоказанияИПУ.ТипПоказаний КАК ТипПоказаний
ИЗ
	РегистрСведений.ЖКУ_ПоказанияИПУ.СрезПоследних(
			&НачалоПериода,
			Строение = &Строение
				) КАК ПоказанияИПУ
Показать


Скорость выполнения 40 сек (возвращено 1457 записей)

Если переписать на

ВЫБРАТЬ
	ПоказанияИПУ.Строение КАК Строение,
	ПоказанияИПУ.Помещение КАК Помещение,
	ПоказанияИПУ.ЛицевойСчет КАК ЛицевойСчет,
	ПоказанияИПУ.КатегорияУслуги КАК КатегорияУслуги,
	ПоказанияИПУ.ИндивидуальныйПриборУчета КАК ИндивидуальныйПриборУчета,
	МАКСИМУМ(ПоказанияИПУ.Период) КАК ДатаПоказаний
ПОМЕСТИТЬ ВТ_ПериодыПоказаний
ИЗ
	РегистрСведений.ЖКУ_ПоказанияИПУ КАК ПоказанияИПУ
ГДЕ
	ПоказанияИПУ.Период <= &НачалоПериода
	И ПоказанияИПУ.Строение = &Строение

СГРУППИРОВАТЬ ПО
	ПоказанияИПУ.Строение,
	ПоказанияИПУ.Помещение,
	ПоказанияИПУ.ЛицевойСчет,
	ПоказанияИПУ.КатегорияУслуги,
	ПоказанияИПУ.ИндивидуальныйПриборУчета
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ВТ_ПериодыПоказаний.Строение КАК Строение,
	ВТ_ПериодыПоказаний.Помещение КАК Помещение,
	ВТ_ПериодыПоказаний.ЛицевойСчет КАК ЛицевойСчет,
	ВТ_ПериодыПоказаний.КатегорияУслуги КАК КатегорияУслуги,
	ВТ_ПериодыПоказаний.ИндивидуальныйПриборУчета КАК ИндивидуальныйПриборУчета,
	ВТ_ПериодыПоказаний.ДатаПоказаний КАК ДатаПоказаний,
	ПоказанияИПУ.ТипПоказаний КАК ТипПоказаний,
	ПоказанияИПУ.Показание КАК Показание
ИЗ
	ВТ_ПериодыПоказаний КАК ВТ_ПериодыПоказаний
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЖКУ_ПоказанияИПУ КАК ПоказанияИПУ
		ПО ВТ_ПериодыПоказаний.Строение = ПоказанияИПУ.Строение
			И ВТ_ПериодыПоказаний.Помещение = ПоказанияИПУ.Помещение
			И ВТ_ПериодыПоказаний.ЛицевойСчет = ПоказанияИПУ.ЛицевойСчет
			И ВТ_ПериодыПоказаний.КатегорияУслуги = ПоказанияИПУ.КатегорияУслуги
			И ВТ_ПериодыПоказаний.ИндивидуальныйПриборУчета = ПоказанияИПУ.ИндивидуальныйПриборУчета
			И ВТ_ПериодыПоказаний.ДатаПоказаний = ПоказанияИПУ.Период
Показать


Скорость выполнения 0,075 сек (возвращено 1457). Без комментариев

Индексация регистра по измерениям Строение, Помещение, ЛицевойСчет.

Я конечно могу отказаться от использования среза последних поскольку это моя конфигурация, но это мягко говоря не очень удобно.

Решение есть? Галочка "Разрешить итоги: Срез последних"?
38. nvv1970 17.04.21 11:44 Сейчас в теме
(37) 1. физический срез только для неопределенной даты. Для конкретных значений использоваться не может и не будет.
2. ВТ - почему бы и нет. Приходилось так делать на 2012sql. Выше проблема не встречалась.
3. Можно поиграться с текстом запроса, вынести условие в ГДЕ (вряд-ли изменит план, но все же).
4. Можно покрутить/покурить статистику. В зависимости от условий в проблемных запросах, можно попробовать фильтровальную статистику.
Ну и определить, откуда косячные планы, может их можно прибить гвоздями через PG или querry storage...
39. bocharovki 7 17.04.21 13:18 Сейчас в теме
(38) про галочку уже понял, что не сработает... Статистика.... Ну тут простой запрос к таблице одной той же базы данных с одним и тем же условием и получением одного и того же результата. Но разница аж в 500 раз. Я думаю ответ скрыт в том что выше вы писали следующее "Соединение с вложенным запросом не использует статистику". Где про это почитать?

Поскольку первый запрос преобразуется в следующее:

SEL ECT
T1.Fld1487RRef,
T1.Fld861RRef,
T1.Fld1292RRef,
T1.Fld862RRef,
T1.Fld863RRef,
T1.Period_,
T1.Fld869_,
T1.Fld2610RRef
FR OM (SEL ECT
T4.Период AS Period_,
T4.Строение AS Fld1487RRef,
T4.Помещение AS Fld861RRef,
T4.ЛицевойСчет AS Fld1292RRef,
T4.КатегорияУслуги AS Fld862RRef,
T4.ИндивидуальныйПриборУчета AS Fld863RRef,
T4.Показание AS Fld869_,
T4.ТипПоказаний AS Fld2610RRef
FR OM (SEL ECT
T3.Строение AS Fld1487RRef,
T3.Помещение AS Fld861RRef,
T3.ЛицевойСчет AS Fld1292RRef,
T3.КатегорияУслуги AS Fld862RRef,
T3.ИндивидуальныйПриборУчета AS Fld863RRef,
MAX(T3.Период) AS MAXPERIOD_
FR OM РегистрСведений.ЖКУ_ПоказанияИПУ T3
WH ERE T3.Период <= ? AND T3.Активность = 0x01 AND ((T3.Строение = ?))
GROUP BY T3.Строение,
T3.Помещение,
T3.ЛицевойСчет,
T3.КатегорияУслуги,
T3.ИндивидуальныйПриборУчета) T2
INNER JOIN РегистрСведений.ЖКУ_ПоказанияИПУ T4
ON T2.Fld1487RRef = T4.Строение AND T2.Fld861RRef = T4.Помещение AND T2.Fld1292RRef = T4.ЛицевойСчет AND T2.Fld862RRef = T4.КатегорияУслуги AND T2.Fld863RRef = T4.ИндивидуальныйПриборУчета AND T2.MAXPERIOD_ = T4.Период) T1
p_0: 40210401000000
p_1: 0xA67F001BFC3542C811E14EF9AF646BC3
Показать


Т.е. два вложенных запроса. Я так понимаю это стандартное преобразование СрезПоследних платформой?

В то время как второй запрос это

INS ERT INTO ВременнаяТаблица63 WITH(TABLOCK) (_Q_001_F_000RRef, _Q_001_F_001RRef, _Q_001_F_002RRef, _Q_001_F_003RRef, _Q_001_F_004RRef, _Q_001_F_005) SELECT
T1.Строение,
T1.Помещение,
T1.ЛицевойСчет,
T1.КатегорияУслуги,
T1.ИндивидуальныйПриборУчета,
MAX(T1.Период)
FR OM РегистрСведений.ЖКУ_ПоказанияИПУ T1
WH ERE (T1.Период <= ?) AND (T1.Строение = ?)
GROUP BY T1.Строение,
T1.Помещение,
T1.ЛицевойСчет,
T1.КатегорияУслуги,
T1.ИндивидуальныйПриборУчета
p_0: 40210401000000
p_1: 0xA67F001BFC3542C811E14EF9AF646BC3


SELE CT
T1._Q_001_F_000RRef,
T1._Q_001_F_001RRef,
T1._Q_001_F_002RRef,
T1._Q_001_F_003RRef,
T1._Q_001_F_004RRef,
T1._Q_001_F_005,
T2.ТипПоказаний,
T2.Показание
FR OM ВременнаяТаблица63 T1 WITH(NOLOCK)
LEFT OUTER JOIN РегистрСведений.ЖКУ_ПоказанияИПУ T2
ON ((((((T1._Q_001_F_000RRef = T2.Строение) AND (T1._Q_001_F_001RRef = T2.Помещение)) AND (T1._Q_001_F_002RRef = T2.ЛицевойСчет)) AND (T1._Q_001_F_003RRef = T2.КатегорияУслуги)) AND (T1._Q_001_F_004RRef = T2.ИндивидуальныйПриборУчета)) AND (T1._Q_001_F_005 = T2.Период))
Показать
40. nvv1970 17.04.21 13:25 Сейчас в теме
(39) читаем поверхностные рекомендации 1с на ИТС или kb.1c.ru. Или откладываем 1с в сторону и изучаем mssql. Msdn, Ютуб, Гугл.

Пройдите курсы эксперта. Это будет лучшее начало большого пути.
42. bocharovki 7 17.04.21 14:27 Сейчас в теме
(40) в рекомендациях 1с по работе запросов сказано, что не следует использовать соединение с подзапросами. При этом получается что в каждом СрезеПоследних у нас это соединение присутствует. Странно как то.....
43. nvv1970 17.04.21 14:52 Сейчас в теме
(42) Можно использовать соединение с подзапросом, а можно с ВТ.
ВТ в общем случае хуже. Лишний запрос, компиляция, запись.
Соединение с подзапросом легче, но иногда ошибается. Чтобы не ошибалось - нужно, чтобы подзапрос возвращал минимум строк с предсказуемым составом.

Это не запрет, а точка внимания. Способа обойтись без ВТ и подзапроса - нету.
Можно отказаться от срезов, реализовать архитектуру иначе, с дополнительной таблицей.
44. user1534961 17.04.21 14:58 Сейчас в теме
(43) а что в дополнительной таблице?
46. bocharovki 7 17.04.21 15:51 Сейчас в теме
(44) второй вариант без СрезПоследних, но с временной таблицей.
45. spacecraft 17.04.21 15:02 Сейчас в теме
(42) не совсем так. Есть рекомендация не использовать соединение виртуальной таблицы с физической.
Не желательно соединять левым соединением с подзапросом в качестве правой таблицы. Индексы не будут использованы. Так же, если подзапрос возвращает много записей. Так как будет full scan и для большого количества записей это скажется на производительности.
Даже в вашем втором примере с ВТ будет использован full scan для временной таблицы при соединении с физической. Но так как элементов в нем намного меньше, чем в правой таблице, то будет full scan для виртуальной и индексный поиск для физической, что нормально.
41. bocharovki 7 17.04.21 13:27 Сейчас в теме
(38) и еще интересный момент в первом случае самые затратные операции

Merge Join(Inner Join, MANY-TO-MANY MERGE:([T3].[Помещение], [T3].[ЛицевойСчет], [T3].[КатегорияУслуги], [T3].[ИндивидуальныйПриборУчета])=([T4].[Помещение], [T4].[ЛицевойСчет], [T4].[КатегорияУслуги], [T4].[ИндивидуальныйПриборУчета]), RESIDUAL:(РегистрСведений.ЖКУ_ПоказанияИПУ.[Помещение] as [T3].[Помещение]=РегистрСведений.ЖКУ_ПоказанияИПУ.[Помещение] as [T4].[Помещение] AND РегистрСведений.ЖКУ_ПоказанияИПУ.[ЛицевойСчет] as [T3].[ЛицевойСчет]=РегистрСведений.ЖКУ_ПоказанияИПУ.[ЛицевойСчет] as [T4].[ЛицевойСчет] AND РегистрСведений.ЖКУ_ПоказанияИПУ.[КатегорияУслуги] as [T3].[КатегорияУслуги]=РегистрСведений.ЖКУ_ПоказанияИПУ.[КатегорияУслуги] as [T4].[КатегорияУслуги] AND РегистрСведений.ЖКУ_ПоказанияИПУ.[ИндивидуальныйПриборУчета] as [T3].[ИндивидуальныйПриборУчета]=РегистрСведений.ЖКУ_ПоказанияИПУ.[ИндивидуальныйПриборУчета] as [T4].[ИндивидуальныйПриборУчета]))

2898000 строк

в то время как второй запрос максимум максимум строк 52500 перебрал

Clustered Index Seek(OBJECT:(РегистрСведений.ЖКУ_ПоказанияИПУ.[Индекс по Строение, Помещение, ЛицевойСчет, КатегорияУслуги, ИндивидуальныйПриборУчета, Период, Активность] AS [T1]), SEEK:([T1].[Строение]=[@P2]), WHERE:(РегистрСведений.ЖКУ_ПоказанияИПУ.[Период] as [T1].[Период]<=[@P1]) ORDERED FORWARD)
Оставьте свое сообщение

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