Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема Прямой запрос вместо РассчитатьРегистрыНА хуже? (число прочтений - 4478 )
transit
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 3
Зарегистрирован: 30. Ноября 2009
Прямой запрос вместо РассчитатьРегистрыНА хуже?
30. Ноября 2009 :: 12:45
Печать  
Добрый день.
Ситуация: база торговля 77 с доработками sql 2000. Стали долго проводиться документы, решил попробовал переписать запросы на получение итогов. Начал с реализации. Написал запрос, сравнил по времени выполнения с вызовом метода РассчитатьРегистрыНа(): во втором случае время отработки в 2 раза меньше. Подскажите где косяк.
Спасибо.
Код вот:

[code]
RS = СоздатьОбъект("ODBCRecordset");

         ТекстЗапроса = "
         |set nocount on
     |if exists (select * FROM tempdb..sysobjects where
     |ID=OBJECT_ID('tempdb..#TempTabNom') AND sysstat & 0xf = 3 )
     |drop table #TempTabNom;
     |create table #TempTabNom (val char(9), primary key clustered(val))
     |set nocount off";
     RS.Выполнить(ТекстЗапроса);      

     RS.Подготовить("insert into #TempTabNom values(?)");      
     RS.ВыполнитьSQL_ИзТЗ(тч, тч.КоличествоСтрок());

         RS.УстановитьТекстовыйПараметр("Док",ТекущийДокумент());
     RS.УстановитьТекстовыйПараметр("ДатаРасчета", ПозицияДока);
     RS.УстановитьТекстовыйПараметр("ЦенаПрод", 0);
     RS.УстановитьТекстовыйПараметр("ВыбФирма", Фирма);
     МОЛ = Склад.МОЛ;
     RS.УстановитьТекстовыйПараметр("ВыбМОЛ", МОЛ);
     
     ТекстЗапроса = "
     |select 
     |  Рег.Номенклатура as [Номенклатура $Справочник.Номенклатура],
     |  Рег.Партия as [Партия $Справочник.Партии],
     |  Рег.Фирма as [Фирма $Справочник.Фирмы],
     |  Рег.СтатусПартии as [СтатусПартии $Перечисления.СтатусыПартии],
     |  Рег.МОЛ as [МОЛ $Справочник.ФизЛица],
     |  Рег.ЦенаПрод as ЦенаПрод,
     |  Рег.ДатаПартии as ДатаПартии,
     |  Рег.КоличествоОстаток as Количество,
     |  Рег.СуммаУпрОстаток as СуммаУпр,
     |  Рег.СуммаРубОстаток as СуммаРуб,
     |  Рег.СуммаБезНДСОстаток as СуммаБезНДС,
     |  Журнал.IDDoc as [ДокПартии $Документ],
     |  Журнал.IDDocDef as ДокПартии_вид,
     |  Журнал.IDDocDef [ВидДок $ВидДокумента],
     |  Журнал.Date_Time_IDDoc
     |from
     |  $РегистрОстатки.ПартииНаличие(:ДатаРасчета~,
     |                           inner  join
     |                                          (select tmpN.val as Товар from #TempTabNom as tmpN) as Д2
     |                                          on МОЛ = :ВыбМОЛ
     |                                          and Д2.Товар = Номенклатура
     |                                          and ЦенаПрод = :ЦенаПрод
     |                                          and Фирма = :ВыбФирма) as Рег
     |left join
     |  $Справочник.Партии as Партии (nolock) ON Партии.ID = Рег.Партия
     |left join
     |  _1Sjourn as Журнал (nolock) ON
     |      ($ВидДокумента36.АктПроизводства + Журнал.IDDoc) = $Партии.ПриходныйДокумент
     |      or ($ВидДокумента36.ВводОстатковТМЦ + Журнал.IDDoc) = $Партии.ПриходныйДокумент
     |      or ($ВидДокумента36.ВозвратОтПокупателя + Журнал.IDDoc) = $Партии.ПриходныйДокумент
     |      or ($ВидДокумента36.ОприходованиеТМЦ + Журнал.IDDoc) = $Партии.ПриходныйДокумент
     |      or ($ВидДокумента36.ПоступлениеТМЦ + Журнал.IDDoc) = $Партии.ПриходныйДокумент
     |      or ($ВидДокумента36.ПоступлениеТМЦИмпорт + Журнал.IDDoc) = $Партии.ПриходныйДокумент
     |      or ($ВидДокумента36.СтрокаАвансОтчетаТМЦ + Журнал.IDDoc) = $Партии.ПриходныйДокумент
     |order by Рег.Номенклатура, Журнал.Date_Time_IDDoc
     |";   

[/code]
  
Наверх
 
IP записан
 
alexdd
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 347
Зарегистрирован: 25. Июня 2007
Re: Прямой запрос вместо РассчитатьРегистрыНА хуже?
Ответ #1 - 30. Ноября 2009 :: 15:29
Печать  
вот это
Код
Выбрать все
	ТекстЗапроса = "
   	|set nocount on
	|if exists (select * FROM tempdb..sysobjects where
	|ID=OBJECT_ID('tempdb..#TempTabNom') AND sysstat & 0xf = 3 )
	|drop table #TempTabNom;
	|create table #TempTabNom (val char(9), primary key clustered(val))
	|set nocount off";
	RS.Выполнить(ТекстЗапроса);

	RS.Подготовить("insert into #TempTabNom values(?)");
	RS.ВыполнитьSQL_ИзТЗ(тч, тч.КоличествоСтрок()); 


можно заменить на
Код
Выбрать все
RS.УложитьСписокОбъектов(спТМЦ,"#TempTabNom","Номенклатура"); 


должно быть быстрее.
Немного подкорректировал запрос:
Код
Выбрать все
	ТекстЗапроса = "set nocount on
	|select
	|  Рег.Номенклатура as [Номенклатура $Справочник.Номенклатура],
	|  Рег.Партия as [Партия $Справочник.Партии],
	|  Рег.Фирма as [Фирма $Справочник.Фирмы],
	|  Рег.СтатусПартии as [СтатусПартии $Перечисления.СтатусыПартии],
	|  Рег.МОЛ as [МОЛ $Справочник.ФизЛица],
	|  Рег.ЦенаПрод as ЦенаПрод,
	|  Рег.ДатаПартии as ДатаПартии,
	|  Рег.КоличествоОстаток as Количество,
	|  Рег.СуммаУпрОстаток as СуммаУпр,
	|  Рег.СуммаРубОстаток as СуммаРуб,
	|  Рег.СуммаБезНДСОстаток as СуммаБезНДС,
	|  Журнал.IDDoc as [ДокПартии $Документ],
	|  Журнал.IDDocDef as ДокПартии_вид,
	|  Журнал.IDDocDef [ВидДок $ВидДокумента],
	|  Журнал.Date_Time_IDDoc
	|from
	|  $РегистрОстатки.ПартииНаличие(:ДатаРасчета~,
	|				   inner  join #TempTabNom as tmpN (nolock) on val = Номенклатура,
        |                                    МОЛ = :ВыбМОЛ and Фирма = :ВыбФирма and ЦенаПрод = :ЦенаПрод,
        |                                   (Номенклатура,Партия,Фирма,СтатусПартии,МОЛ,ЦенаПрод,ДатаПартии),
        |                                   (Количество,СуммаУпр,СуммаРуб,СуммаБезНДС)) as Рег
	|left join
	|  $Справочник.Партии as Партии (nolock) ON Партии.ID = Рег.Партия
	|left join
	|  _1Sjourn as Журнал (nolock) ON Журнал.iddoc = right($Партии.ПриходныйДокумент,9)
	|order by Рег.Номенклатура, Журнал.Date_Time_IDDoc 

  
Наверх
 
IP записан
 
transit
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 3
Зарегистрирован: 30. Ноября 2009
Re: Прямой запрос вместо РассчитатьРегистрыНА хуже?
Ответ #2 - 30. Ноября 2009 :: 15:39
Печать  
alexdd, спасибо большое!

до этой строки уже допер :) из-за нее сильно тупило
[code]  
_1Sjourn as Журнал (nolock) ON Журнал.iddoc = right($Партии.ПриходныйДокумент,9)
[/code]
сейчас попробую другие изменения внести.
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Прямой запрос вместо РассчитатьРегистрыНА хуже?
Ответ #3 - 30. Ноября 2009 :: 18:36
Печать  
мелочь, но это:
|  Журнал.IDDocDef as ДокПартии_вид,
|  Журнал.IDDocDef [ВидДок $ВидДокумента],

можно объединить:
|  Журнал.IDDocDef as [ДокПартии_вид $ВидДокумента],
  

1&&2&&3
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Прямой запрос вместо РассчитатьРегистрыНА хуже?
Ответ #4 - 30. Ноября 2009 :: 18:47
Печать  
и еще можно написать так

Код
Выбрать все
...
$РегистрОстатки.ПартииНаличие(:ДатаРасчета~,
inner join (
  select distinct $СтрДок.<ПолеНоменклатура> Номенклатура
  from $ДокументСтроки.<ВидТекДокумента> СтрДок (nolock)
  where СтрДок.iddoc = :Док
) tmp on tmp.Номенклатура = Номенклатура,
... 


либо

Код
Выбрать все
...
$РегистрОстатки.ПартииНаличие(:ДатаРасчета~,,
Номенклатура in (
  select distinct $СтрДок.<ПолеНоменклатура>
  from $ДокументСтроки.<ВидТекДокумента> СтрДок (nolock)
  where СтрДок.iddoc = :Док
)
... 



и никаких #TempTabNom (и замедления проведения на sql2k)
  

1&&2&&3
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Прямой запрос вместо РассчитатьРегистрыНА хуже?
Ответ #5 - 30. Ноября 2009 :: 18:56
Печать  
и, если это модуль проведения, то не помешает
RS.ОбратныйРасчетОтТА(1)
  

1&&2&&3
Наверх
 
IP записан
 
transit
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 3
Зарегистрирован: 30. Ноября 2009
Re: Прямой запрос вместо РассчитатьРегистрыНА хуже?
Ответ #6 - 01. Декабря 2009 :: 05:33
Печать  
trad, спасибо за подсказки.
Такой вопрос: если у меня временная таблица с составом номенклатуры используется в отборах еще во втором запросе (объединены остатки, резервы, заявки) все равно лучше без временных таблиц (позиций номенклатуры в накладной в среднем не больше 15-20)?
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Прямой запрос вместо РассчитатьРегистрыНА хуже?
Ответ #7 - 01. Декабря 2009 :: 06:52
Печать  
transit писал(а) 01. Декабря 2009 :: 05:33:
trad, спасибо за подсказки.
Такой вопрос: если у меня временная таблица с составом номенклатуры используется в отборах еще во втором запросе (объединены остатки, резервы, заявки) все равно лучше без временных таблиц (позиций номенклатуры в накладной в среднем не больше 15-20)?

Канечно лучше. Зачем гнать на сервер список номенклатуры, когда он там уже есть.
  

1&&2&&3
Наверх
 
IP записан
 
skom
Junior Member
**
Отсутствует


"Hallo World"

Сообщений: 84
Местоположение: г.Кемерово
Зарегистрирован: 16. Января 2007
Пол: Мужской
Re: Прямой запрос вместо РассчитатьРегистрыНА хуже?
Ответ #8 - 08. Декабря 2009 :: 02:42
Печать  
transit

в этой конструкции

RS.УложитьСписокОбъектов(спТМЦ,"#TempTabNom","Номенклатура");

если 
#TempTabNom
заменить на
##TempTabNom

то у тебя получится ГЛОБАЛЬНАЯ таблица, которая будет доступна пока "не убъешь"
  

КонецЕсли;
Наверх
ICQ  
IP записан
 
Вадимко
God Member
*****
Отсутствует


Нам бы чего про ОдноЦэ...

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Прямой запрос вместо РассчитатьРегистрыНА хуже?
Ответ #9 - 08. Декабря 2009 :: 14:24
Печать  
Успех в ИЗБАВЛЕНИИ от временного расчета, вот куда копать надо...
  

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