Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Горячая тема (более 10 ответов) Время исполнения запросов (число прочтений - 2850 )
Ярослав
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 43
Местоположение: Иркутск
Зарегистрирован: 14. Октября 2008
Время исполнения запросов
11. Августа 2010 :: 02:07
Печать  
Есть почти стандартный регистр "ПартииНаличие" (ТиС).
Измерения:
Фирма
Номенклатура (включен отбор итогов)
СтатусПартии
Партия
Ресурсы:
Количество
СуммаРуб
СуммаБезНДС
Индексы:
Остатки
PERIOD,Фирма,Номенклатура,СтатусПартии,Парти                            
PERIOD,Номенклатура    
Обороты
IDDOC,LINENO_,ACTNO
*******************************************
Документ.Реализация
АвтоматическаяНумерацияСтрок = 1
Индекс шапки:
IDDOC
ИндексТЧ:  
IDDOC,LINENO_                                        
-------------------------------------------
Есть Запрос1
Код
Выбрать все
	RS.ОбратныйРасчетОтТА(1);

ТекстЗапроса = "
|SELECT
|  Рег.Фирма as [Фирма $Справочник.Фирмы],
|  Рег.Номенклатура as [Номенклатура $Справочник.Номенклатура],
|  Рег.СтатусПартии as [СтатусПартии $Перечисление.СтатусыПартии],
|  Рег.Партия as [Партия $Справочник.Партии],
|  Рег.КоличествоОстатокas [Количество],
|  Рег.СуммаРубОстаток	as [СуммаРуб],
|  Рег.СуммаБезНДСОстатокas [СуммаБезНДС]
|FROM
|  $РегистрОстатки.ПартииНаличие(:КонДата~,,,
|           (Фирма,Номенклатура,СтатусПартии,Партия),(Количество,СуммаРуб,СуммаБезНДС)) as Рег
|WHERE Рег.Номенклатура IN (
|SELECT
|$Док.Номенклатура
|FROM $ДокументСтроки.Реализация as Док
|WHERE
|Док.IDDOC = :ВыбДок)";
RS.УстановитьТекстовыйПараметр("КонДата", СформироватьПозициюДокумента(Док.ПолучитьПозицию(),1));
RS.УстановитьТекстовыйПараметр("ВыбДок", ВыбДок);
 



Есть Запрос2
Код
Выбрать все
	RS.ОбратныйРасчетОтТА(1);

ТекстЗапроса =
"|SELECT
|  Рег.Фирма as [Фирма $Справочник.Фирмы],
|  Рег.Номенклатура as [Номенклатура$Справочник.Номенклатура],
|  Рег.СтатусПартии as [СтатусПартии $Перечисление.СтатусыПартии],
|  Рег.Партия 	as [Партия $Справочник.Партии],
|  Рег.КоличествоОстаток	as [Количество],
|  Рег.СуммаРубОстаток		as [СуммаРуб],
|  Рег.СуммаБезНДСОстаток	as [СуммаБезНДС]

|FROM
|  $РегистрОстатки.ПартииНаличие(:КонДата~,,
,(Фирма,Номенклатура,СтатусПартии,Партия),
(Количество,СуммаРуб,СуммаБезНДС)) as Рег
|WHERE Рег.Номенклатура IN (SELECT $Док.Номенклатура FROM $ДокументСтроки.Реализация as Док (nolock) WHERE Док.IDDOC IN(SELECT IDDOC FROM $Документ.Реализация as Док1 WHERE Док1.IDDOC = :ВыбДок))";


RS.УстановитьТекстовыйПараметр("КонДата", СформироватьПозициюДокумента(Док.ПолучитьПозицию(),1));
RS.УстановитьТекстовыйПараметр("ВыбДок", ВыбДок);
 


И запрос3
Код
Выбрать все
RS.ОбратныйРасчетОтТА(1);
ТекстЗапроса = "
|SELECT
|  Рег.Фирма as [Фирма $Справочник.Фирмы],
|  Рег.Номенклатура as [Номенклатура $Справочник.Номенклатура],
|  Рег.СтатусПартии as [СтатусПартии $Перечисление.СтатусыПартии],
|  Рег.Партия as [Партия $Справочник.Партии],
|  Рег.КоличествоОстаток	as [Количество],
|  Рег.СуммаРубОстаток		as [СуммаРуб],
|  Рег.СуммаБезНДСОстаток	as [СуммаБезНДС]
|FROM
|  $РегистрОстатки.ПартииНаличие(:КонДата~,,
|   Номенклатура IN (SELECT $Док.Номенклатура FROM $ДокументСтроки.Реализация as Док (nolock) WHERE Док.IDDOC IN(SELECT IDDOC FROM $Документ.Реализация as Док1 WHERE Док1.IDDOC = :ВыбДок)),
|           (Фирма,Номенклатура,СтатусПартии,Партия),(Количество,СуммаРуб,СуммаБезНДС)) as Рег";

тьПозицию(),1));
RS.УстановитьТекстовыйПараметр("ВыбДок", ВыбДок);
ТЗ1 = RS.ВыполнитьИнструкцию(ТекстЗапроса);  
 



Вопрос 1: почему запрос2 быстрее чем запрос3 и запрос1?
Объясните пожалуйста)
  
Наверх
 
IP записан
 
Salimbek
God Member
*****
Отсутствует



Сообщений: 862
Зарегистрирован: 06. Июня 2006
Пол: Мужской
Re: Время исполнения запросов
Ответ #1 - 11. Августа 2010 :: 04:48
Печать  
А если 3-й запрос сделать так:
Код
Выбрать все
RS.ОбратныйРасчетОтТА(1);
ТекстЗапроса = "
|SELECT
|  Рег.Фирма as [Фирма $Справочник.Фирмы],
|  Рег.Номенклатура as [Номенклатура $Справочник.Номенклатура],
|  Рег.СтатусПартии as [СтатусПартии $Перечисление.СтатусыПартии],
|  Рег.Партия as [Партия $Справочник.Партии],
|  Рег.КоличествоОстаток	as [Количество],
|  Рег.СуммаРубОстаток		as [СуммаРуб],
|  Рег.СуммаБезНДСОстаток	as [СуммаБезНДС]
|FROM
|  $РегистрОстатки.ПартииНаличие(:КонДата~,,
|   Номенклатура IN (SELECT $Док.Номенклатура FROM $ДокументСтроки.Реализация as Док (nolock) WHERE Док.IDDOC = :ВыбДок)),
|           (Фирма,Номенклатура,СтатусПартии,Партия),(Количество,СуммаРуб,СуммаБезНДС)) as Рег";

тьПозицию(),1));
RS.УстановитьТекстовыйПараметр("ВыбДок", ВыбДок);
ТЗ1 = RS.ВыполнитьИнструкцию(ТекстЗапроса); 

  
Наверх
ICQ  
IP записан
 
Ярослав
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 43
Местоположение: Иркутск
Зарегистрирован: 14. Октября 2008
Re: Время исполнения запросов
Ответ #2 - 11. Августа 2010 :: 08:01
Печать  
Средние результаты разных запросов(по разному количеству документов(от 1 до 1000)):
1. Запрос с условием
Код
Выбрать все
Номенклатура IN (SELECT $Док.Номенклатура FROM $ДокументСтроки.Реализация as Док (nolock) WHERE Док.IDDOC IN(SELECT IDDOC FROM $Документ.Реализация as Док1 WHERE Док1.IDDOC = :ВыбДок)) 

вне ВТ исполняется 2024,526
2. Запрос с условием
Код
Выбрать все
Номенклатура IN (SELECT $Док.Номенклатура FROM $ДокументСтроки.Реализация as Док (nolock) WHERE Док.IDDOC IN(SELECT IDDOC FROM $Документ.Реализация as Док1 WHERE Док1.IDDOC = :ВыбДок)) 

в ВТ исполняется 2692,152
3. Запрос с условием
Код
Выбрать все
Номенклатура IN (SELECT Val FROM #ВыбНоменклатура) 

вне ВТ исполняется 3213,714
4. Запрос с условием
Код
Выбрать все
Номенклатура IN (SELECT $Док.Номенклатура FROM $ДокументСтроки.Реализация as Док (nolock) WHERE Док.IDDOC = :ВыбДок)), 

в ВТ исполняется 3306,511
5. Запрос с условием
Код
Выбрать все
Номенклатура IN (SELECT Val FROM #ВыбНоменклатура) 

в ВТ исполняется 6226,421
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Время исполнения запросов
Ответ #3 - 11. Августа 2010 :: 08:21
Печать  
Ну а вот так то что не проверил ????
Нафига еще целую таблицу шерстить для поиска дока ?
Код
Выбрать все
Номенклатура IN (SELECT $Док.Номенклатура FROM $ДокументСтроки.Реализация as Док (nolock) WHERE Док.IDDOC = :ВыбДок)
 




  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Время исполнения запросов
Ответ #4 - 11. Августа 2010 :: 08:26
Печать  
Повтори тест после sp_updatestats и после _1sp_DBReindex.
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
Ярослав
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 43
Местоположение: Иркутск
Зарегистрирован: 14. Октября 2008
Re: Время исполнения запросов
Ответ #5 - 11. Августа 2010 :: 09:03
Печать  
Eprst писал(а) 11. Августа 2010 :: 08:21:
Ну а вот так то что не проверил ????
Нафига еще целую таблицу шерстить для поиска дока ?
Код
Выбрать все
Номенклатура IN (SELECT $Док.Номенклатура FROM $ДокументСтроки.Реализация as Док (nolock) WHERE Док.IDDOC = :ВыбДок)
 


а запрос 4 разве не такой?

  
Наверх
 
IP записан
 
Salimbek
God Member
*****
Отсутствует



Сообщений: 862
Зарегистрирован: 06. Июня 2006
Пол: Мужской
Re: Время исполнения запросов
Ответ #6 - 11. Августа 2010 :: 09:40
Печать  
В 1-м и 2-м запросе ты получаешь все остатки и потом из них оставляешь те, которые есть у тебя в Табличной части
В 3-м запросе - в запросе к регистру используется фильтр по номенклатуре (что более правильно), только селект один был лишний.

Разница во времени выполнения может быть вызвана разными причинами. Конкретно - надо смотреть (например как ты время меряешь? и что значит "по разному количеству документов"? для одного запроса - одно количество документов, а для другого - другое?)
Очень помогает, в частности, вызывать твой запрос с RS.Отладка(1) и далее посмотреть его в QueryAnalizer на предмет плана выполнения запроса
  
Наверх
ICQ  
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Время исполнения запросов
Ответ #7 - 11. Августа 2010 :: 09:46
Печать  
Ярослав писал(а) 11. Августа 2010 :: 09:03:
Eprst писал(а) 11. Августа 2010 :: 08:21:
Ну а вот так то что не проверил ????
Нафига еще целую таблицу шерстить для поиска дока ?
Код
Выбрать все
Номенклатура IN (SELECT $Док.Номенклатура FROM $ДокументСтроки.Реализация as Док (nolock) WHERE Док.IDDOC = :ВыбДок)
 


а запрос 4 разве не такой?



а ты это условие наружу ВТ вытащи, раз у тебя самое малое время на фильтр снаружи..
« Последняя редакция: 11. Августа 2010 :: 13:48 - Eprst »  
Наверх
 
IP записан
 
Salimbek
God Member
*****
Отсутствует



Сообщений: 862
Зарегистрирован: 06. Июня 2006
Пол: Мужской
Re: Время исполнения запросов
Ответ #8 - 11. Августа 2010 :: 13:08
Печать  
Eprst писал(а) 11. Августа 2010 :: 09:46:
а ты это условие наружу ВТ вытащи, раз у тебя замое малое время на фильтр снаружи..


У него первый запрос такой
  
Наверх
ICQ  
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Время исполнения запросов
Ответ #9 - 11. Августа 2010 :: 13:47
Печать  
неа.. в первом он еще на кой то табличку шапки дока цепляет..
  
Наверх
 
IP записан
 
Ярослав
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 43
Местоположение: Иркутск
Зарегистрирован: 14. Октября 2008
Re: Время исполнения запросов
Ответ #10 - 12. Августа 2010 :: 00:46
Печать  
berezdetsky писал(а) 11. Августа 2010 :: 08:26:
Повтори тест после sp_updatestats и после _1sp_DBReindex.


А если во время _1sp_DBReindex написал ошибку по справочнику(он нигде не используется), то наверное это хреново?)
sql 2000
  
Наверх
 
IP записан
 
Ярослав
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 43
Местоположение: Иркутск
Зарегистрирован: 14. Октября 2008
Re: Время исполнения запросов
Ответ #11 - 12. Августа 2010 :: 01:53
Печать  
Eprst писал(а) 11. Августа 2010 :: 13:47:
неа.. в первом он еще на кой то табличку шапки дока цепляет..


Ага, поэтому я и написал сюда, мне не понятно:
Почему когда прицепляешь шапку документа запрос работает быстрее чем без шапки?
Почему когда условие внутри ВТ запрос работает медленне чем внешнее?
  
Наверх
 
IP записан
 
Ярослав
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 43
Местоположение: Иркутск
Зарегистрирован: 14. Октября 2008
Re: Время исполнения запросов
Ответ #12 - 12. Августа 2010 :: 05:41
Печать  
berezdetsky писал(а) 11. Августа 2010 :: 08:26:
Повтори тест после sp_updatestats и после _1sp_DBReindex.

Спасибо. Всё стало как и должно быть!
  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Время исполнения запросов
Ответ #13 - 12. Августа 2010 :: 06:19
Печать  
Ярослав писал(а) 12. Августа 2010 :: 00:46:
А если во время _1sp_DBReindex написал ошибку по справочнику(он нигде не используется), то наверное это хреново?)
sql 2000

хз. Смотря что пишет. Выполни ещё

DBCC CHECKTABLE ('SCxxx')
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать