Переключение на Главную Страницу Страницы: [1] 2  ОтправитьПечать
Горячая тема (более 10 ответов) Можно ли оптимизировать запрос? (число прочтений - 3902 )
noxxx
Full Member
***
Отсутствует


1c++ rocks 8)

Сообщений: 239
Местоположение: Москва
Зарегистрирован: 24. Августа 2007
Пол: Мужской
Можно ли оптимизировать запрос?
23. Августа 2012 :: 07:29
Печать  
Добрый день.

Есть у нас такая функция:

Код
Выбрать все
Функция глСвободныйОстаток(Док,Склад,Номенклатура,Остаток=0,Резерв=0,НаКонецДня="") Экспорт

	rs = СоздатьОбъект("ODBCRecordSet");

	qr = "
	|SELECT	SUM(МестаХраненияОстатки.КоличествоОстаток) Остаток,
	|		SUM(ISNULL(РезервыОстатки.КоличествоОстаток, 0)) Резерв
	|FROM $РегистрОстатки.МестаХранения(:ВыбДата ~,,
	|		(МестоХранения = :ВыбМХ)
	|		AND (МПЗ = :ВыбМПЗ~),
	|		(МестоХранения, МПЗ),) AS МестаХраненияОстатки
	|LEFT JOIN $РегистрОстатки.Резервы(:ВыбДата ~,,
	|		(МестоХранения=:ВыбМХ)
	|		AND (Номенклатура=:ВыбМПЗ),
	|		(Номенклатура, МестоХранения),) AS РезервыОстатки ON МестаХраненияОстатки.МПЗ = $ВидСправочника36.Номенклатура + РезервыОстатки.Номенклатура AND МестаХраненияОстатки.МестоХранения = РезервыОстатки.МестоХранения";

	Если НаКонецДня<>"" Тогда
		rs.УстановитьТекстовыйПараметр("ВыбДата", 	НаКонецДня);
	Иначе
		rs.УстановитьТекстовыйПараметр("ВыбДата", 	СформироватьПозициюДокумента(Док, -1));
	КонецЕсли;
	rs.УстановитьТекстовыйПараметр("ВыбМПЗ", 	Номенклатура);
	rs.УстановитьТекстовыйПараметр("ВыбМХ", 	Склад);

	СтруктураОстатки=rs.ВыполнитьСкалярный(qr);
	Остаток=СтруктураОстатки.Остаток;
	Резерв=СтруктураОстатки.резерв;

	Возврат Остаток-Резерв;
КонецФункции 



По одному товару и одному складу запрос выполняется около 3 секунд. Можно ли оптимизировать этот запрос что бы он быстрее выполнялся?

Установка быстрой обработки движений в регистре резервов результата не дала.
  
Наверх
ICQ  
IP записан
 
val
Full Member
***
Отсутствует


Дорогу осиливает идущий

Сообщений: 137
Зарегистрирован: 07. Июля 2006
Re: Можно ли оптимизировать запрос?
Ответ #1 - 23. Августа 2012 :: 08:01
Печать  
1. Вместо Left Join Union All
2. Параметрический запрос
  
Наверх
 
IP записан
 
leshik
1c++ donor
Отсутствует



Сообщений: 820
Местоположение: Пятигорск
Зарегистрирован: 22. Апреля 2007
Пол: Мужской
Re: Можно ли оптимизировать запрос?
Ответ #2 - 23. Августа 2012 :: 08:02
Печать  
Установить признаки отбора итогов и движений у измерений МестоХранения и МПЗ этих регистров
  
Наверх
IP записан
 
leshik
1c++ donor
Отсутствует



Сообщений: 820
Местоположение: Пятигорск
Зарегистрирован: 22. Апреля 2007
Пол: Мужской
Re: Можно ли оптимизировать запрос?
Ответ #3 - 23. Августа 2012 :: 08:03
Печать  
val писал(а) 23. Августа 2012 :: 08:01:
1. Вместо Left Join Union All
2. Параметрический запрос

со вторым согласен а по первому надо план анализировать
  
Наверх
IP записан
 
val
Full Member
***
Отсутствует


Дорогу осиливает идущий

Сообщений: 137
Зарегистрирован: 07. Июля 2006
Re: Можно ли оптимизировать запрос?
Ответ #4 - 23. Августа 2012 :: 08:14
Печать  

Планы надо анализировать всегда.

UNION ALL позволит:
1) избавиться от:

ON МестаХраненияОстатки.МПЗ = $ВидСправочника36.Номенклатура + РезервыОстатки.Номенклатура AND МестаХраненияОстатки.МестоХранения = РезервыОстатки.МестоХранения

ISNULL(РезервыОстатки.КоличествоОстаток, 0)

2) отладить по скорости отдельно каждую таблицу.
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Можно ли оптимизировать запрос?
Ответ #5 - 23. Августа 2012 :: 08:20
Печать  
И это.. желательно передавать список товаров и поиметь останки 1 раз, чем кучу раз получать останки таким способом.

Ну и с юнион алл будет шустрее
  
Наверх
 
IP записан
 
noxxx
Full Member
***
Отсутствует


1c++ rocks 8)

Сообщений: 239
Местоположение: Москва
Зарегистрирован: 24. Августа 2007
Пол: Мужской
Re: Можно ли оптимизировать запрос?
Ответ #6 - 23. Августа 2012 :: 08:24
Печать  
Отбор движений дал результат - 2 секунды на 7 выполнений.
  
Наверх
ICQ  
IP записан
 
val
Full Member
***
Отсутствует


Дорогу осиливает идущий

Сообщений: 137
Зарегистрирован: 07. Июля 2006
Re: Можно ли оптимизировать запрос?
Ответ #7 - 23. Августа 2012 :: 08:24
Печать  
Подозреваю, что этот остаток - на форме документа при выписке товара, а также возможно на форме справочника товаров.
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Можно ли оптимизировать запрос?
Ответ #8 - 23. Августа 2012 :: 08:25
Печать  
noxxx писал(а) 23. Августа 2012 :: 08:24:
Отбор движений дал результат - 2 секунды на 7 выполнений.


Тебе для получения останков нужен Отбор ИТОГОВ, а не движений.
+ желательна галка быстрая обработка движений - чтоб с 1sjourn не было соединений при получении останков не на ТА.
  
Наверх
 
IP записан
 
val
Full Member
***
Отсутствует


Дорогу осиливает идущий

Сообщений: 137
Зарегистрирован: 07. Июля 2006
Re: Можно ли оптимизировать запрос?
Ответ #9 - 23. Августа 2012 :: 08:28
Печать  
"Отбор движений дал результат - 2 секунды на 7 выполнений".
Отлично. Но это - свежий индекс. Не забывайте про реиндексацию и обновление статистики.
И попробуйте параметрический запрос.
  
Наверх
 
IP записан
 
noxxx
Full Member
***
Отсутствует


1c++ rocks 8)

Сообщений: 239
Местоположение: Москва
Зарегистрирован: 24. Августа 2007
Пол: Мужской
Re: Можно ли оптимизировать запрос?
Ответ #10 - 23. Августа 2012 :: 08:38
Печать  
Использование UNION вместо LEFT JOIN дал результат - 0.161 на 7 исполнений. Дичь!
  
Наверх
ICQ  
IP записан
 
val
Full Member
***
Отсутствует


Дорогу осиливает идущий

Сообщений: 137
Зарегистрирован: 07. Июля 2006
Re: Можно ли оптимизировать запрос?
Ответ #11 - 23. Августа 2012 :: 08:47
Печать  
"Использование UNION вместо LEFT JOIN дал результат - 0.161 на 7 исполнений. Дичь!"
Рад за Вас. Надеюсь, это не следствие попадания в кеш.
Пробуете на разных товарах и с разными датами?
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Можно ли оптимизировать запрос?
Ответ #12 - 23. Августа 2012 :: 08:55
Печать  
Выкини еще получение измерений из ВТ (раз ты всё равно имеешь из запроса только остаток по конкретной номенклатуре/складу).
Т.е параметры измерений в ВТ не описывай.
  
Наверх
 
IP записан
 
noxxx
Full Member
***
Отсутствует


1c++ rocks 8)

Сообщений: 239
Местоположение: Москва
Зарегистрирован: 24. Августа 2007
Пол: Мужской
Re: Можно ли оптимизировать запрос?
Ответ #13 - 23. Августа 2012 :: 08:59
Печать  
val писал(а) 23. Августа 2012 :: 08:47:
"Использование UNION вместо LEFT JOIN дал результат - 0.161 на 7 исполнений. Дичь!"
Рад за Вас. Надеюсь, это не следствие попадания в кеш.
Пробуете на разных товарах и с разными датами?


Да, пробовал с разными документами за разные даты. Результат - 0.03-0.04 сек на исполнение. Я думаю это отличный результат.
  
Наверх
ICQ  
IP записан
 
leshik
1c++ donor
Отсутствует



Сообщений: 820
Местоположение: Пятигорск
Зарегистрирован: 22. Апреля 2007
Пол: Мужской
Re: Можно ли оптимизировать запрос?
Ответ #14 - 23. Августа 2012 :: 09:02
Печать  
Eprst писал(а) 23. Августа 2012 :: 08:55:
Выкини еще получение измерений из ВТ (раз ты всё равно имеешь из запроса только остаток по конкретной номенклатуре/складу).
Т.е параметры измерений в ВТ не описывай.


http://www.1cpp.ru/docum/icpp/html/ODBC.html#id34
по умолчанию расчет идет по всем измерениям
  
Наверх
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 
ОтправитьПечать