Переключение на Главную Страницу Страницы: [1] 2  ОтправитьПечать
Горячая тема (более 10 ответов) Выбрать подчиненные документы определенного вида (число прочтений - 10583 )
Neo
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 327
Зарегистрирован: 12. Ноября 2007
Выбрать подчиненные документы определенного вида
02. Марта 2010 :: 11:17
Печать  
     ТекстЗапроса="
     |SELECT
     |ДокРН.IDDOC as [ДокРН $Документ.РасходнаяНакладная],
     |Отбор.ChildID as [ДокВШ $Документ.ВводШтрихкодов]
     |FROM
     |$Документ.РасходнаяНакладная as ДокРН (nolock)
     |LEFT JOIN
     |_1SJOURN as Жур With (NOLOCK) ON ДокРН.IDDOC=Жур.IDDOC
     |LEFT JOIN
     |_1SCRDOC as Отбор (NOLOCK) ON Отбор.MDID=0 AND Отбор.Parentval='O1  RB'+ДокРН.IDDOC
     |WHERE Жур.Date_Time_IDDoc BETWEEN :ДатаНач AND :ДатаКон~ AND
     |Жур.Closed & 1 =1
     |";

=========================================

В этом запросе выводятся расходные накладные и все подчиненные им документы. Хочу ограничить выборку только одним видом подчиненного документа. Как бы это сделать оптимальнее, чтобы скорость не упала значительно? А то предполагается работа с большими объемами данных.
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3046
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Выбрать подчиненные документы определенного вида
Ответ #1 - 02. Марта 2010 :: 12:33
Печать  
SELECT
  Жур.IDDOC as [ДокРН $Документ.РасходнаяНакладная],
  right(Отбор.CHILD_DATE_TIME_IDDOC,9) as [ДокВШ $Документ.ВводШтрихкодов]
FROM
  _1SJOURN as Жур With (NOLOCK)
LEFT JOIN
  $Документ.РасходнаяНакладная as ДокРН (nolock) ON ДокРН.IDDOC=Жур.IDDOC
LEFT LOOP JOIN
  _1SCRDOC as Отбор (NOLOCK) ON Отбор.MDID=0 AND Отбор.Parentval='O1'+$ВидДокумента36.РасходнаяНакладная+Жур.IDDOC
LEFT LOOP JOIN
  _1SJOURN as Жур2 (NOLOCK) on Жур2.Date_Time_IDDoc = Отбор.CHILD_DATE_TIME_IDDOC and Жур2.IDDocDef = $ВидДокумента.ВводШтрихкодов
WHERE Жур.Date_Time_IDDoc BETWEEN :ДатаНач AND :ДатаКон~ AND
      Жур.IDDocDef = $ВидДокумента.РасходнаяНакладная AND
      Жур.Closed & 1 =1 AND
      Жур2.Date_Time_IDDoc IS NOT NULL
  

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


I Love YaBB 2!

Сообщений: 327
Зарегистрирован: 12. Ноября 2007
Re: Выбрать подчиненные документы определенного вида
Ответ #2 - 02. Марта 2010 :: 13:32
Печать  
а LOOP обязательно использовать?
  
Наверх
 
IP записан
 
alexdd
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 347
Зарегистрирован: 25. Июня 2007
Re: Выбрать подчиненные документы определенного вида
Ответ #3 - 02. Марта 2010 :: 14:29
Печать  
loop - это хинт оптимизатору, нужен или нет, по плану выполнения нужно смотреть.
Кстати, у меня почему-то при аналогичных запросах к _1scrdoc, явно приходиться указывать хинт (nolock index(parent)). Иначе почему-то скуль упорно пытается использовать индекс child и сканирует таблицу при этом.
  
Наверх
 
IP записан
 
Neo
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 327
Зарегистрирован: 12. Ноября 2007
Re: Выбрать подчиненные документы определенного вида
Ответ #4 - 02. Марта 2010 :: 15:12
Печать  
Цитата:
loop - это хинт оптимизатору, нужен или нет, по плану выполнения нужно смотреть


Поэтому и спросил. Просто интересно, почему в этом случае поставили такой хинт?  Улыбка Есть основания считать, что так план будет в любом случае лучше? Просто ведь бывает и наоборот: укажешь явно хинт, а он окажется не самым оптимальным для большинства случаев и в итоге СКЛ не сможет выбрать более оптимальный вариант.
  
Наверх
 
IP записан
 
alexdd
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 347
Зарегистрирован: 25. Июня 2007
Re: Выбрать подчиненные документы определенного вида
Ответ #5 - 02. Марта 2010 :: 15:24
Печать  
про loop ничего не знаю, не пробовалУлыбка Попробовать и посмотреть на план не проблема впринципе
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3046
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Выбрать подчиненные документы определенного вида
Ответ #6 - 03. Марта 2010 :: 06:22
Печать  
Без loop - посмотрел план.
Сервер выбрал не тот индекс который я хочу и применил merge join.
Поэтому я поставил loop что бы запрос работал так как мне надо.

Но, вообще кмк, это дело вкуса/тона/религии. Тут каждый для себя должен решать изучая планы выполнения.

ps
В подобных запросах еще некоторую роль иожет играть уровень параллелелизма. На моем боевом сервере этот параметр = 1
  

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


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Выбрать подчиненные документы определенного вида
Ответ #7 - 03. Марта 2010 :: 06:25
Печать  
trad писал(а) 03. Марта 2010 :: 06:22:
Без loop - посмотрел план.
Сервер выбрал не тот индекс который я хочу и применил merge join.
Поэтому я поставил loop что бы запрос работал так как мне надо.

Но, вообще кмк, это дело вкуса/тона/религии. Тут каждый для себя должен решать изучая планы выполнения.

ps
В подобных запросах еще некоторую роль иожет играть уровень параллелелизма. На моем боевом сервере этот параметр = 1

А можно  о влиянии этого параметра по подробней
или где об этом можно прочитать ?
у меня стоит как и по умолчанию 5.(sql2000)
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3046
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Выбрать подчиненные документы определенного вида
Ответ #8 - 03. Марта 2010 :: 06:27
Печать  
по умолчанию должно стоять 0 - ограничего количеством ядер
  

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


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Выбрать подчиненные документы определенного вида
Ответ #9 - 03. Марта 2010 :: 06:29
Печать  
trad писал(а) 03. Марта 2010 :: 06:27:
по умолчанию должно стоять 0 - ограничего количеством ядер

Тогда мы говорим о разных параметрах
я говорю о cost threshold for parallelism и значение = 5
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3046
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Выбрать подчиненные документы определенного вида
Ответ #10 - 03. Марта 2010 :: 06:33
Печать  
  

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


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Выбрать подчиненные документы определенного вида
Ответ #11 - 03. Марта 2010 :: 07:38
Печать  
OFF:

trad писал(а) 03. Марта 2010 :: 06:22:
Без loop - посмотрел план.
Сервер выбрал не тот индекс который я хочу и применил merge join.
Поэтому я поставил loop что бы запрос работал так как мне надо.

Эээ.. Глядя на Цитата:
if the data volume is large and the desired data can be obtained presorted from existing B-tree indexes, merge join is often the fastest available join algorithm
, я бы тоже в этом запросе выбрал merge join, только вместо Жур.IDDOC написал бы Right(Жур.Date_Time_IDDoc, 9). А просто хинта index было не достаточно? Нерешительный
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3046
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Выбрать подчиненные документы определенного вида
Ответ #12 - 03. Марта 2010 :: 11:54
Печать  
Цитата:
только вместо Жур.IDDOC написал бы Right(Жур.Date_Time_IDDoc, 9)
а смысл? все равно же есть closed - так что лукапа не избежать
  

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



Сообщений: 3046
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Выбрать подчиненные документы определенного вида
Ответ #13 - 03. Марта 2010 :: 12:05
Печать  
Цитата:
А просто хинта index было не достаточно?

эээ...
Ну индекс то выбирается _1SJOURN.DOCTYPE, но т.к. merge, то используется не все индексное выражение а только iddocdef.
А хотелось бы (iddocdef,date_time_iddoc)

Цитата:
Сервер выбрал не тот индекс который я хочу...
тут я, да, можно сказать соврал. Не индекс, а индексное выражение.
  

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


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Выбрать подчиненные документы определенного вида
Ответ #14 - 03. Марта 2010 :: 12:09
Печать  
trad писал(а) 03. Марта 2010 :: 11:54:
Цитата:
только вместо Жур.IDDOC написал бы Right(Жур.Date_Time_IDDoc, 9)
а смысл? все равно же есть closed - так что лукапа не избежать

Просто чтобы его лишний раз не разрывали противоречия при выборе (индекса и) типа соединения - вопрос то был об этом.
  

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