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


I Love YaBB 2!

Сообщений: 413
Зарегистрирован: 29. Июня 2006
Помогите оптимизировать запрос
14. Марта 2007 :: 07:58
Печать  
Нужно вытащить "всего" из нескольких видов документов
ТекстЗапроса01 = "
|SELECT
|SUM($ДкОСРСт.Всего)        AS     Vs01
|,SUM($ДкНМАСт.Всего)  AS    Vs02
|,SUM($ДкМАТСт.Всего)   AS    Vs03
|,SUM($ДкТОВСт.Всего)    AS    Vs04
|,SUM($ДкУСОСт.Всего)   AS    Vs05
|FROM
|_1SJourn as Жур (nolock),
|$Документ.ПоступлениеОС AS ДкОСР,
|$Документ.ПоступлениеНМА AS ДкНМА,
|$Документ.ПоступлениеМатериалов AS ДкМАТ, 
|$Документ.ПоступлениеТоваров AS ДкТОВ,
|$Документ.УслугиСтороннихОрганизаций AS ДкУСО,
|$ДокументСтроки.ПоступлениеОС AS ДкОСРСт,
|$ДокументСтроки.ПоступлениеНМА AS ДкНМАСт,
|$ДокументСтроки.ПоступлениеМатериалов AS ДкМАТСт, 
|$ДокументСтроки.ПоступлениеТоваров AS ДкТОВСт,
|$ДокументСтроки.УслугиСтороннихОрганизаций AS ДкУСОСт
|WHERE
|(Жур.IsMark  =0) AND  (Жур.Closed & 1 =1)
|AND  (Жур.Date_Time_IDDoc BETWEEN :НачДата AND :КонДата~)   AND
|(
|((Жур.IdDoc =ДкОСР.IdDoc) AND (ДкОСР.IdDoc  =ДкОСРСт.IdDoc ) AND (Жур.IDDocDef = $ВидДокумента.ПоступлениеОС) ) OR
|((Жур.IdDoc =ДкНМА.IdDoc) AND (ДкНМА.IdDoc  =ДкНМАСт.IdDoc) AND (Жур.IDDocDef = $ВидДокумента.ПоступлениеНМА) ) OR
|((Жур.IdDoc =ДкМАТ.IdDoc) AND (ДкМАТ.IdDoc  =ДкМАТСт.IdDoc) AND (Жур.IDDocDef = $ВидДокумента.ПоступлениеМатериалов) )  OR
|((Жур.IdDoc =ДкТОВ.IdDoc) AND (ДкТОВ.IdDoc  =ДкТОВСт.IdDoc) AND (Жур.IDDocDef = $ВидДокумента.ПоступлениеТоваров) )  OR
|((Жур.IdDoc =ДкУСО.IdDoc) AND (ДкУСО.IdDoc  =ДкУСОСт.IdDoc) AND (Жур.IDDocDef = $ВидДокумента.УслугиСтороннихОрганизаций) )
|) 
|";
В результате 1с зависает.
Видимо нужно как-то по другому. А как?
  
Наверх
 
IP записан
 
spock
1c++ developer
1c++ moderator
Отсутствует



Сообщений: 822
Местоположение: Новосибирск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Помогите оптимизировать запрос
Ответ #1 - 14. Марта 2007 :: 08:08
Печать  
Через UNION нужно переделать имхо.
  
Наверх
ICQ  
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Помогите оптимизировать запрос
Ответ #2 - 14. Марта 2007 :: 08:09
Печать  
итог по колонкам Всего включен?
  

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


I Love YaBB 2!

Сообщений: 413
Зарегистрирован: 29. Июня 2006
Re: Помогите оптимизировать запрос
Ответ #3 - 14. Марта 2007 :: 08:10
Печать  
Включен
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Помогите оптимизировать запрос
Ответ #4 - 14. Марта 2007 :: 08:11
Печать  
и еще тебе нужно "всего" по каждому виду отдельно или общий "всего" ?
  

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


I Love YaBB 2!

Сообщений: 413
Зарегистрирован: 29. Июня 2006
Re: Помогите оптимизировать запрос
Ответ #5 - 14. Марта 2007 :: 08:14
Печать  
Мне вообще нужно еще вытащить каждый документ. Но я пока до этого не дошел. Зависло на первом этапе. Сейчас попробую через UNION

Через UNION пошло шустрее  Улыбка

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



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Помогите оптимизировать запрос
Ответ #6 - 14. Марта 2007 :: 08:19
Печать  
Код
Выбрать все
ТекстЗапроса01 = "
|SELECT
|  Жур.IdDoc AS [Док $Документ],
|  Жур.IDDocDef AS Док_вид,
|  coalesce($ДкОСР.Всего, $ДкНМА.Всего, $ДкМАТ.Всего, $ДкТОВ.Всего, $ДкУСО.Всего) AS Всего
|FROM
|_1SJourn as Жур (nolock)
|left join $Документ.ПоступлениеОС AS ДкОСР (nolock) on Жур.IdDoc = ДкОСР.IdDoc
|left join $Документ.ПоступлениеНМА AS ДкНМА (nolock) on Жур.IdDoc = ДкНМА.IdDoc
|left join $Документ.ПоступлениеМатериалов AS ДкМАТ (nolock) on Жур.IdDoc = ДкМАТ.IdDoc
|left join $Документ.ПоступлениеТоваров AS ДкТОВ (nolock) on Жур.IdDoc = ДкТОВ.IdDoc
|left join $Документ.УслугиСтороннихОрганизаций AS ДкУСО (nolock) on Жур.IdDoc = ДкУСО.IdDoc
|WHERE Жур.Closed & 1 = 1
|  AND Жур.Date_Time_IDDoc BETWEEN :НачДата AND :КонДата~
|  AND Жур.IDDocDef in ($ВидДокумента.ПоступлениеОС, $ВидДокумента.ПоступлениеНМА, $ВидДокумента.ПоступлениеМатериалов,
|			     $ВидДокумента.ПоступлениеТоваров, $ВидДокумента.УслугиСтороннихОрганизаций)
|"; 

  

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


I Love YaBB 2!

Сообщений: 413
Зарегистрирован: 29. Июня 2006
Re: Помогите оптимизировать запрос
Ответ #7 - 14. Марта 2007 :: 08:21
Печать  
Спасибо trad. Интересно какой запрос будет шустрее, через join или union.
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Помогите оптимизировать запрос
Ответ #8 - 14. Марта 2007 :: 08:22
Печать  
замер - с тебя
  

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


I Love YaBB 2!

Сообщений: 413
Зарегистрирован: 29. Июня 2006
Re: Помогите оптимизировать запрос
Ответ #9 - 14. Марта 2007 :: 08:25
Печать  
ОК померяю сообщу.
  
Наверх
 
IP записан
 
RuporAbsurda
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 413
Зарегистрирован: 29. Июня 2006
Re: Помогите оптимизировать запрос
Ответ #10 - 14. Марта 2007 :: 10:11
Печать  
Итак результаты замеров (10 замеров, погрешность +-2):
        join - 163
        union -88
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Помогите оптимизировать запрос
Ответ #11 - 14. Марта 2007 :: 10:52
Печать  
да, в данном случае юнион рулит
  

1&&2&&3
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать