Оптимизация запроса

1. user1169791 04.03.25 11:04 Сейчас в теме
Ребят доброго дня, помогите подскажите пожалуйста как можно оптимизировать запрос
	ВЫБРАТЬ
		ПоступлениеДопРасходов.Содержание КАК Содержание,
		ПоступлениеДопРасходов.Номенклатура КАК Номенклатура,
		СУММА(ПоступлениеДопРасходов.Сумма) КАК Сумма,
		МАКСИМУМ(ЗаказПоставщикуОтгруженный.Количество) КАК Количество,
		ПоступлениеДопРасходов.Валюта КАК Валюта,
		ПоступлениеДопРасходов.Курс КАК Курс,
		ПоступлениеДопРасходов.Контрагент КАК Контрагент,
		ПоступлениеДопРасходов.ДоговорВзаиморасчетов КАК Договор
	ИЗ
		(ВЫБРАТЬ
			"ГТД: Таможенная пошлина" КАК Содержание,
			ГТДИмпортТовары.Номенклатура КАК Номенклатура,
			ГТДИмпортТовары.Количество КАК Количество,
			ГТДИмпортТовары.СуммаПошлины КАК Сумма,
			ГТДИмпортТовары.Ссылка.ДоговорВзаиморасчетов.ВалютаВзаиморасчетов КАК Валюта,
			ГТДИмпортТовары.Ссылка.КурсВзаиморасчетов КАК Курс,
			ГТДИмпортТовары.Ссылка.Контрагент КАК Контрагент,
			ГТДИмпортТовары.Ссылка.ДоговорВзаиморасчетов КАК ДоговорВзаиморасчетов
		ИЗ
			Документ.ГТДИмпорт.Товары КАК ГТДИмпортТовары
		ГДЕ
			ГТДИмпортТовары.Ссылка.ДокументОснование = &Основание
			И ГТДИмпортТовары.Ссылка.Проведен
			И ГТДИмпортТовары.Номенклатура В(&МассивНоменклатуры)
		
		ОБЪЕДИНИТЬ ВСЕ
		
		ВЫБРАТЬ
			"ГТД: НДС",
			ГТДИмпортТовары.Номенклатура,
			ГТДИмпортТовары.Количество,
			ГТДИмпортТовары.СуммаНДС,
			ГТДИмпортТовары.Ссылка.ДоговорВзаиморасчетов.ВалютаВзаиморасчетов,
			ГТДИмпортТовары.Ссылка.КурсВзаиморасчетов,
			ГТДИмпортТовары.Ссылка.Контрагент,
			ГТДИмпортТовары.Ссылка.ДоговорВзаиморасчетов
		ИЗ
			Документ.ГТДИмпорт.Товары КАК ГТДИмпортТовары
		ГДЕ
			ГТДИмпортТовары.Ссылка.ДокументОснование = &Основание
			И ГТДИмпортТовары.Ссылка.Проведен
			И ГТДИмпортТовары.Номенклатура В(&МассивНоменклатуры)
		
		ОБЪЕДИНИТЬ ВСЕ
		
		ВЫБРАТЬ
			"ГТД: Таможенный сбор",
			ГТДИмпортТовары.Номенклатура,
			ГТДИмпортТовары.Количество,
			ГТДИмпортТовары.СуммаТаможня,
			ГТДИмпортТовары.Ссылка.ДоговорВзаиморасчетов.ВалютаВзаиморасчетов,
			ГТДИмпортТовары.Ссылка.КурсВзаиморасчетов,
			ГТДИмпортТовары.Ссылка.Контрагент,
			ГТДИмпортТовары.Ссылка.ДоговорВзаиморасчетов
		ИЗ
			Документ.ГТДИмпорт.Товары КАК ГТДИмпортТовары
		ГДЕ
			ГТДИмпортТовары.Ссылка.ДокументОснование = &Основание
			И ГТДИмпортТовары.Ссылка.Проведен
			И ГТДИмпортТовары.Номенклатура В(&МассивНоменклатуры)
		
		ОБЪЕДИНИТЬ ВСЕ
		
		ВЫБРАТЬ
			"ДР: " + ПоступлениеДопРасходовИмпортТовары.Ссылка.Содержание,
			ПоступлениеДопРасходовИмпортТовары.Номенклатура,
			ПоступлениеДопРасходовИмпортТовары.Количество,
			ПоступлениеДопРасходовИмпортТовары.Сумма,
			ПоступлениеДопРасходовИмпортТовары.Ссылка.ВалютаДокумента,
			ПоступлениеДопРасходовИмпортТовары.Ссылка.КурсДокумента,
			ПоступлениеДопРасходовИмпортТовары.Ссылка.Контрагент,
			ПоступлениеДопРасходовИмпортТовары.Ссылка.ДоговорВзаиморасчетов
		ИЗ
			Документ.ПоступлениеДопРасходовИмпорт.Товары КАК ПоступлениеДопРасходовИмпортТовары
		ГДЕ
			ПоступлениеДопРасходовИмпортТовары.Ссылка.ДокументОснование = &Основание
			И ПоступлениеДопРасходовИмпортТовары.Ссылка.Проведен
			И ПоступлениеДопРасходовИмпортТовары.Номенклатура В(&МассивНоменклатуры)) КАК ПоступлениеДопРасходов
			ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
				ЗаказПоставщикуОтгруженныйТовары.Номенклатура КАК Номенклатура,
				СУММА(ЗаказПоставщикуОтгруженныйТовары.Количество) КАК Количество
			ИЗ
				Документ.ЗаказПоставщикуОтгруженный.Товары КАК ЗаказПоставщикуОтгруженныйТовары
			ГДЕ
				ЗаказПоставщикуОтгруженныйТовары.Ссылка = &Основание
			
			СГРУППИРОВАТЬ ПО
				ЗаказПоставщикуОтгруженныйТовары.Номенклатура) КАК ЗаказПоставщикуОтгруженный
			ПО ПоступлениеДопРасходов.Номенклатура = ЗаказПоставщикуОтгруженный.Номенклатура
	
	СГРУППИРОВАТЬ ПО
		ПоступлениеДопРасходов.Содержание,
		ПоступлениеДопРасходов.Номенклатура,
		ПоступлениеДопРасходов.Валюта,
		ПоступлениеДопРасходов.Курс,
		ПоступлениеДопРасходов.Контрагент,
		ПоступлениеДопРасходов.ДоговорВзаиморасчетов
Показать
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
19. paulwist 04.03.25 16:29 Сейчас в теме
(1)
как можно оптимизировать запрос


План запроса в студию (в зависимости от СУБД либо в xml-формате, либо explain), там будет видно где тормоза.
KirillHome; +1 Ответить
2. antz 04.03.25 11:14 Сейчас в теме
Ну во-первых, вместо подзапроса сделать ВТ.
А зачем тут левое соединение, если поля в выборке не участвуют?

 ВЫБРАТЬ
            "ДР: " + ПоступлениеДопРасходовИмпортТовары.Ссылка.Содержание,
            ПоступлениеДопРасходовИмпортТовары.Номенклатура,
            ПоступлениеДопРасходовИмпортТовары.Количество,
            ПоступлениеДопРасходовИмпортТовары.Сумма,
            ПоступлениеДопРасходовИмпортТовары.Ссылка.ВалютаДокумента,
            ПоступлениеДопРасходовИмпортТовары.Ссылка.КурсДокумента,
            ПоступлениеДопРасходовИмпортТовары.Ссылка.Контрагент,
            ПоступлениеДопРасходовИмпортТовары.Ссылка.ДоговорВзаиморасчетов
        ИЗ
            Документ.ПоступлениеДопРасходовИмпорт.Товары КАК ПоступлениеДопРасходовИмпортТовары
        ГДЕ
            ПоступлениеДопРасходовИмпортТовары.Ссылка.ДокументОснование = &Основание
            И ПоступлениеДопРасходовИмпортТовары.Ссылка.Проведен
            И ПоступлениеДопРасходовИмпортТовары.Номенклатура В(&МассивНоменклатуры)) КАК ПоступлениеДопРасходов
            ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
                ЗаказПоставщикуОтгруженныйТовары.Номенклатура КАК Номенклатура,
                СУММА(ЗаказПоставщикуОтгруженныйТовары.Количество) КАК Количество
            ИЗ
                Документ.ЗаказПоставщикуОтгруженный.Товары КАК ЗаказПоставщикуОтгруженныйТовары
            ГДЕ
                ЗаказПоставщикуОтгруженныйТовары.Ссылка = &Основание
            
            СГРУППИРОВАТЬ ПО
                ЗаказПоставщикуОтгруженныйТовары.Номенклатура) КАК ЗаказПоставщикуОтгруженный
            ПО ПоступлениеДопРасходов.Номенклатура = ЗаказПоставщикуОтгруженный.Номенклатура
Показать
7. user2107191 04.03.25 12:11 Сейчас в теме
(2) ЗаказПоставщикуОтгруженный
11. antz 04.03.25 12:40 Сейчас в теме
(7) Что ЗаказПоставщикуОтгруженный?
13. user2107191 04.03.25 12:47 Сейчас в теме
(11) Это таблица вложенного запроса, и её поля участвуют в выборке.
если поля в выборке не участвуют?
12. antz 04.03.25 12:41 Сейчас в теме
(7) А, да, протер монитор, увидел.
14. user2107191 04.03.25 12:48 Сейчас в теме
(12) Поздно, я уже ответил )
15. Sashares 33 04.03.25 13:23 Сейчас в теме
(12) (13 )А я все еще не вижу. Как и где они участвуют в выборке?
Увидел.
3. homer_ 79 04.03.25 11:28 Сейчас в теме
оптимизировать для чего? медленно работает? или ...
4. user2107191 04.03.25 11:33 Сейчас в теме
(3)
оптимизировать для чего?
Для вредного сеньора.
5. user1169791 04.03.25 11:35 Сейчас в теме
медленно работает, надо ускорить
6. KirillHome 5 04.03.25 12:00 Сейчас в теме
(5) ну, можно попробовать вместо трёх запросов к ГТД, отличающихся только типом суммы и строкой описания сделать один, в котором получить все нужные суммы, а уже потом - "разделить" на три составляющие
user2107191; +1 Ответить
8. user2107191 04.03.25 12:12 Сейчас в теме
(6) ... поместить в ВТ и отындексировать по Номенклатуре.
И со второй (правой) таблицей проделать тот же кунстштюк.
NicolasCage; +1 Ответить
16. user1169791 04.03.25 13:59 Сейчас в теме
(6)
	ВЫБРАТЬ
            ГТДИмпортТовары.Номенклатура КАК Номенклатура,
            ГТДИмпортТовары.Количество КАК Количество,
            СУММА(ГТДИмпортТовары.СуммаПошлины) КАК СуммаПошлины,
	    СУММА(ГТДИмпортТовары.СуммаНДС) КАК СуммаНДС,
	    СУММА(ГТДИмпортТовары.СуммаТаможня) КАК СуммаТаможня,
            ГТДИмпортТовары.Ссылка.ДоговорВзаиморасчетов.ВалютаВзаиморасчетов КАК Валюта,
            ГТДИмпортТовары.Ссылка.КурсВзаиморасчетов КАК Курс,
            ГТДИмпортТовары.Ссылка.Контрагент КАК Контрагент,
            ГТДИмпортТовары.Ссылка.ДоговорВзаиморасчетов КАК Договор
	ПОМЕСТИТЬ ВТ

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


	ИНДЕКСИРОВАТЬ ПО
	Номенклатура
	;

	////////////////////////////////////////////////////////////­////////////////////
	ВЫБРАТЬ
	"ГТД: Таможенная пошлина" КАК Содержание
	ВТ.Номенклатура КАК Номенклатура,
	ВТ.Количество КАК Количество,
	ВТ.СуммаТаможня КАК Сумма,
	ВТ.Валюта КАК Валюта,
	ВТ.Курс КАК Курс,
	ВТ.Контрагент КАК Контрагент,
	ВТ.Договор КАК Договор
	
	ПОМЕСТИТЬ ВТ2
	ИЗ
	ВТ КАК ВТ

	ОБЪЕДИНИТЬ ВСЕ

	ВЫБРАТЬ
	
	"ГТД: НДС", 
	ВТ.Номенклатура ,
	ВТ.Количество,
	ВТ.СуммаНДС,
	ВТ.Валюта,
	ВТ.Курс,
	ВТ.Контрагент,
	ВТ.Договор,
	ИЗ
	ВТ КАК ВТ

	ОБЪЕДИНИТЬ ВСЕ

	ВЫБРАТЬ
	"ГТД: Таможенный сбор", 
	ВТ.Номенклатура ,
	ВТ.Количество,
	ВТ.СуммаПошлины,
	ВТ.Валюта,
	ВТ.Курс,
	ВТ.Контрагент,
	ВТ.Договор,
	ИЗ
	ВТ КАК ВТ

	ОБЪЕДИНИТЬ ВСЕ

	ВЫБРАТЬ
	"ДР: " + ПоступлениеДопРасходовИмпортТовары.Ссылка.Содержание,
	ПоступлениеДопРасходовИмпортТовары.Номенклатура,
        ПоступлениеДопРасходовИмпортТовары.Количество,
        ПоступлениеДопРасходовИмпортТовары.Сумма,
        ПоступлениеДопРасходовИмпортТовары.Ссылка.ВалютаДокумента,
        ПоступлениеДопРасходовИмпортТовары.Ссылка.КурсДокумента,
        ПоступлениеДопРасходовИмпортТовары.Ссылка.Контрагент,
        ПоступлениеДопРасходовИмпортТовары.Ссылка.ДоговорВзаиморасчетов
ИЗ
	Документ.ГТДИмпорт.Товары КАК ГТДИмпортТовары

ИНДЕКСИРОВАТЬ ПО
	Номенклатура
;

////////////////////////////////////////////////////////////­////////////////////
Показать


Примерно как то так? а потом соеденить с заказом поставщику
17. KirillHome 5 04.03.25 14:13 Сейчас в теме
(16)
Примерно как то так?


Примерно так, да.

На самом деле не уверен, что индексация нужна.
Ниже - цитата с ИТС
Также следует иметь в виду, что на маленьких таблицах (порядка нескольких тысяч записей и меньше) СУБД практически всегда использует сканирование таблицы либо сканирование кластерного (автоматически созданного системой) индекса, так как это наиболее простое решение в данном случае. Так что нет смысла дополнительно индексировать заведомо небольшие таблицы. С другой стороны, часто трудно заранее предугадать размер таблицы.

То есть понятно, что создание дополнительных индексов может положительно сказаться на выборке данных из больших таблиц и не дать никакого эффекта на маленьких объемах данных (а иногда и замедлить быстродействие системы в целом).
9. KirillHome 5 04.03.25 12:17 Сейчас в теме
(8) Возможно, и &МассивНоменклатуры тоже не нужен (я что-то глубокого смысла не понял)
10. user2107191 04.03.25 12:23 Сейчас в теме
(9) Нет, это просто параметр. Пусть живет с миром.
18. -AI- 04.03.25 14:41 Сейчас в теме
1) думаю, самое долгое тут, это строковое поле Содержание группировать,
сделайте его числовым 1,2,3,4....
2) если будете помещать в ВТ, то возможно стоит сгруппировать уже в ней, насколько возможно.
Оставьте свое сообщение

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