Переключение на Главную Страницу Страницы: 1 [2]  ОтправитьПечать
Горячая тема (более 10 ответов) Аналогичные запросы выполняются поразному. (число прочтений - 4495 )
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Аналогичные запросы выполняются поразному.
Ответ #15 - 01. Февраля 2011 :: 07:31
Печать  
Цитата:
Но вот под 2000 скулем разница была очевидна даже на весьма примитивных запросах.
пользуюсь 2000
проблем (ORvsIN) не наблюдал (речь разумеется о логически эквивалентных условиях)
  

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


I Love YaBB 2!

Сообщений: 114
Зарегистрирован: 30. Марта 2007
Re: Аналогичные запросы выполняются поразному.
Ответ #16 - 01. Февраля 2011 :: 08:03
Печать  
trad писал(а) 01. Февраля 2011 :: 07:31:
Цитата:
Но вот под 2000 скулем разница была очевидна даже на весьма примитивных запросах.
пользуюсь 2000
проблем (ORvsIN) не наблюдал


Аналогично  Улыбка
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Аналогичные запросы выполняются поразному.
Ответ #17 - 09. Февраля 2011 :: 06:20
Печать  
Пожалуй, стоит написать небольшое пояснение.

Когда я только начал работать в RiK-центре, и познакомился с 1С++ и прямыми запросами, одним из первых моих заданий была доработка отчета.
Я дописал запрос - и отчет начал формироваться вместо пары секунд секунд 30..40.
Начали с Олегом (Садовниковым) курить план запроса - выявили сваливание в Table scan на условии вида OR.
По совету Олега заменил OR на абсолютно идентичный IN(значение, значение) - сразу Table Scan ушел в небытие, и запрос стал выполняться с прежней скоростью.

Не исключено, что там и без того было понаворочено условий, что появление OR просто сносило крышу планировщику запроса. Но факт остается фактом и на неокрепшие (в тот момент) мозги это оставило неизгладимое впечатление.
С тех пор у меня есть непререкаемое правило: там, где OR равнозначно заменяется на IN - использовать IN. К тому же - это куда более читаемо.

Так что, за свою категоричность приношу извинения, но все же мягко рекомендую использовать IN() вместо OR.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Аналогичные запросы выполняются поразному.
Ответ #18 - 09. Февраля 2011 :: 06:32
Печать  
Satans Claws писал(а) 01. Февраля 2011 :: 07:04:
Сейчас на работе 2005 скуль - сходу написать запрос, который бы показывал кардинальную разницу не получается. Видимо, планировщик запроса кардинально поумнел.

Но вот под 2000 скулем разница была очевидна даже на весьма примитивных запросах.
И немало времени выполнения было сокращено именно на такой банальной замене.

не верю.(причина в чем то другом например необновленная статистика индекся и.т.д)
планировщик не мог поумнеть в принципе
1с работает в sql2005 базе с форматом базы 80 т.е.
планировщик фактически "пытается" эмулировть язык sql2000
и от этого и идут "глюки замедления" т.к. формат базы внутренний новый а к ней применяется предыдущий оптимизатор запросов.

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



Сообщений: 862
Зарегистрирован: 06. Июня 2006
Пол: Мужской
Re: Аналогичные запросы выполняются поразному.
Ответ #19 - 09. Февраля 2011 :: 09:06
Печать  
Z1 писал(а) 09. Февраля 2011 :: 06:32:
не верю.(причина в чем то другом например необновленная статистика индекся и.т.д)
планировщик не мог поумнеть в принципе
1с работает в sql2005 базе с форматом базы 80 т.е.
планировщик фактически "пытается" эмулировть язык sql2000
и от этого и идут "глюки замедления" т.к. формат базы внутренний новый а к ней применяется предыдущий оптимизатор запросов.

Я бы не был столь категоричен, ведь в условии OR в первой части могут использоваться одни поля, а во второй - другие. Из-за этого, в сложных запросах, планировщик мог "перестраховаться" и уйти в TableScan. Тогда как при использовании IN мы явно указываем, что работаем с одним и тем же полем, что, ИМХО, проще для анализатора запроса.
  
Наверх
ICQ  
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Аналогичные запросы выполняются поразному.
Ответ #20 - 09. Февраля 2011 :: 10:21
Печать  
Salimbek писал(а) 09. Февраля 2011 :: 09:06:
Z1 писал(а) 09. Февраля 2011 :: 06:32:
не верю.(причина в чем то другом например необновленная статистика индекся и.т.д)
планировщик не мог поумнеть в принципе
1с работает в sql2005 базе с форматом базы 80 т.е.
планировщик фактически "пытается" эмулировть язык sql2000
и от этого и идут "глюки замедления" т.к. формат базы внутренний новый а к ней применяется предыдущий оптимизатор запросов.

Я бы не был столь категоричен, ведь в условии OR в первой части могут использоваться одни поля, а во второй - другие. Из-за этого, в сложных запросах, планировщик мог "перестраховаться" и уйти в TableScan. Тогда как при использовании IN мы явно указываем, что работаем с одним и тем же полем, что, ИМХО, проще для анализатора запроса.

В общем виде в условии IN выражение любой сложности может стоять и в левой части ( правда так редко пишут)
я имел ввиду что
(IDDOC = Зн1  OR IDDOC = Зн2  OR IDDOC = Зн3 OR IDDOC = Зн4)
эквивалентно
( IDDOC IN ( Зн1, Зн2 , Зн3 , Зн4) )

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



Сообщений: 923
Местоположение: Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Аналогичные запросы выполняются поразному.
Ответ #21 - 09. Февраля 2011 :: 20:12
Печать  
Я бы сначала выгрузил во временную таблицу контрагентов по условию:
Код
Выбрать все
($Контрагенты.Поставщик = 0)
		|   And (Not(Контрагенты.Descr Like 'яя%'))
		|   And ($ФизЛица.ЯвлМенеджер = 1) 


А потом получал остатки уже по фильтру из временной таблицы.
  
Наверх
IP записан
 
Переключение на Главную Страницу Страницы: 1 [2] 
ОтправитьПечать