Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема Какой запрос корректнее? (число прочтений - 1979 )
MaxPiter
Full Member
***
Отсутствует


I Love 1C++

Сообщений: 187
Местоположение: Санкт-Петербург
Зарегистрирован: 20. Ноября 2008
Пол: Мужской
Какой запрос корректнее?
19. Января 2014 :: 14:57
Печать  
Добрый день.
Подскажите пожалуйста, какой запрос правильнее использовать для получения остатков на заданный момент времени?
В результате всегда выдают одно и тоже, по скорости первый на 1% быстрее.
По написанию, отличаются только по обращению к различным виртуальным таблицам.

[code]      ТекстЗапроса = "
     |SET NOCOUNT ON
     |SELECT ОстаткиТМЦОстаткиОбороты.Фирма [Фирма $Справочник.Фирмы]
     |      , ОстаткиТМЦОстаткиОбороты.Склад [Склад $Справочник.Склады]
     |      , ОстаткиТМЦОстаткиОбороты.Номенклатура [Номенклатура $Справочник.Номенклатура]
     |      , ОстаткиТМЦОстаткиОбороты.ЦенаПрод
     |      , ОстаткиТМЦОстаткиОбороты.Сотрудник [Сотрудник $Справочник]
     |      , Sum(ОстаткиТМЦОстаткиОбороты.КоличествоКонечныйОстаток) Количество
     |FROM НаТА=0,":ТекДок~","")+",,,,"+
     ?(НужныФирмы<>0,"(Фирма IN (SELECT Val FROM #текФирма)) AND","")+
     ?(НуженСклад<>0,"(Склад IN (SELECT Val FROM #текСклад)) AND","")+"
     |            (Номенклатура IN (SELECT val FROM #СпЗн)),,) AS ОстаткиТМЦОстаткиОбороты
     |GROUP BY ОстаткиТМЦОстаткиОбороты.Фирма
     |      , ОстаткиТМЦОстаткиОбороты.Склад
     |      , ОстаткиТМЦОстаткиОбороты.Номенклатура
     |      , ОстаткиТМЦОстаткиОбороты.Сотрудник
     |      , ОстаткиТМЦОстаткиОбороты.ЦенаПрод
     |HAVING (Sum(ОстаткиТМЦОстаткиОбороты.КоличествоКонечныйОстаток)<>0)
     |";[/code]
или
[code]      ТекстЗапроса = "
           |SET NOCOUNT ON
           |SELECT ОстаткиТМЦОстатки.Фирма [Фирма $Справочник.Фирмы]
           |      , ОстаткиТМЦОстатки.Склад [Склад $Справочник.Склады]
           |      , ОстаткиТМЦОстатки.Номенклатура [Номенклатура $Справочник.Номенклатура]
           |      , ОстаткиТМЦОстатки.ЦенаПрод ЦенаПрод
           |      , ОстаткиТМЦОстатки.Сотрудник [Сотрудник $Справочник]
           |      , Sum(ОстаткиТМЦОстатки.КоличествоОстаток) Количество
           |FROM $РегистрОстатки.ОстаткиТМЦ("+?(ОстаткиНаТА=0,":ТекДок~","")+",,"+
           ?(НужныФирмы<>0,"(Фирма IN (SELECT Val FROM #текФирма)) AND","")+
           ?(НуженСклад<>0,"(Склад IN (SELECT Val FROM #текСклад)) AND","")+"
           |            (Номенклатура IN (SELECT Val FROM #СпЗн)),,) AS ОстаткиТМЦОстатки
           |GROUP BY ОстаткиТМЦОстатки.Фирма
           |      , ОстаткиТМЦОстатки.Номенклатура
           |      , ОстаткиТМЦОстатки.Склад
           |      , ОстаткиТМЦОстатки.ЦенаПрод
           |      , ОстаткиТМЦОстатки.Сотрудник
           |HAVING (Sum(ОстаткиТМЦОстатки.КоличествоОстаток)<>0)
           |";
[/code]
  
Наверх
www  
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Какой запрос корректнее?
Ответ #1 - 23. Января 2014 :: 07:49
Печать  
Я б однозначно пользовался бы второй конструкцией. хотя бы потому, чтоб потом не вспоминать "нафига я юзаю таблицу с оборотами, когда мне нужны всего-лишь остатки? Может в этом есть какой-то сакральный смысл? Может я чего-то не понимаю и обороты нужны обязательно???"

А если по существу:
После разворачивания виртуальных таблиц, в первом, скорее всего, будет на один ЮНИОН больше (а может метапарсер умный и поймет, что он не нужен). Условия по нему один фиг, будут вырождать выборку и скуль нормально должен будет ее оптимизировать, но нафиг она нужна, а?
Плюс в первом виртуальная таблица выдает бОльшее число колонок.
Так что снова приходим к использованию второй.

Подробнее - кури конечные тексты запросов и/или описание, как 1Ска хранит данные регистров и как по ним получают остатки на момент времени.
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Какой запрос корректнее?
Ответ #2 - 23. Января 2014 :: 09:01
Печать  
только вот, гроупбай там не нужен вовсе..
  
Наверх
 
IP записан
 
MaxPiter
Full Member
***
Отсутствует


I Love 1C++

Сообщений: 187
Местоположение: Санкт-Петербург
Зарегистрирован: 20. Ноября 2008
Пол: Мужской
Re: Какой запрос корректнее?
Ответ #3 - 23. Января 2014 :: 09:55
Печать  
Eprst писал(а) 23. Января 2014 :: 09:01:
только вот, гроупбай там не нужен вовсе..

Может и не нужен, но так как в select есть sum(), то MSSQL требует группировки.
  
Наверх
www  
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Какой запрос корректнее?
Ответ #4 - 23. Января 2014 :: 10:24
Печать  
дык выкинь сумм оттуда, ВТ и так ужо сгруппирована. (указывай в ВТ только нужные измерения и ресурсы еще в параметрах)
  
Наверх
 
IP записан
 
goes gooines
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 3
Зарегистрирован: 02. Февраля 2014
Re: Какой запрос корректнее?
Ответ #5 - 02. Февраля 2014 :: 03:40
Печать  
good
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать