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


1C++ ->

Сообщений: 361
Местоположение: Барнаул
Зарегистрирован: 05. Сентября 2009
Пол: Мужской
Аналогичные запросы выполняются поразному.
20. Января 2011 :: 03:43
Печать  
Написал отчет "задолженность перед поставщиками". Там основой всего является запрос:
Код
Выбрать все
ТекстЗапроса = "-- qryMaker:Отчет по просроченному поставщикам.2010.09.13.17.12.37
		|Select
		|    Выборка.Менеджер [Менеджер $Справочник.ФизЛица]
		|  , Выборка.Контрагент [Контрагент $Справочник.Контрагенты]
		|  , Выборка.День
		|  , Выборка.Сальдо
		|  , Выборка.ЧистоеСальдо
		|--, Выборка.ИсключитьИзСальдо
		|  , Выборка.ПоступлениеТМЦ [ПоступлениеТМЦ $Документ.ПоступлениеТМЦ]
		|  , Выборка.ДатаОплаты
		|  , Sum(Выборка.Сумма) Сумма
		|From(Select Выборка1.Менеджер   Менеджер
		|   ,   Контрагент = Case Выборка1.Контрагент  
		|	 When Null Then Выборка3.Контрагент
		|	 Else Выборка1.Контрагент End
		|   ,   Выборка1.День	  День
		|   ,   (Выборка1.СуммаСальдо + IsNull(Выборка3.Сумма,0)) Сальдо
		|   ,   Выборка1.СуммаСальдо ЧистоеСальдо
		|   ,   Выборка3.Сумма	 ИсключитьИзСальдо
		|   ,   ПоступлениеТМЦ = Case Выборка1.День
		|	 When Выборка2.ДатаОплаты Then
		|				     Case Выборка1.Контрагент When Выборка2.Контрагент Then Выборка2.ПоступлениеТМЦ
		|				     Else Null End  
		|	 Else Null End
		|   ,   ДатаОплаты =  Case Выборка1.День
		|	 When Выборка2.ДатаОплаты Then
		|				     Case Выборка1.Контрагент When Выборка2.Контрагент Then Выборка2.ДатаОплаты
		|				     Else Null End
		|	 Else Null End
		|   ,   Сумма = Case Выборка1.День
		|	 When Выборка2.ДатаОплаты Then
		|				     Case Выборка1.Контрагент When Выборка2.Контрагент Then Выборка2.Сумма
		|				     Else Null End
		|	 Else Null End  
		|From
		|------------------------- Выборка 1.1
		|(SELECT $Контрагенты.Менеджер Менеджер
		|   , Контрагенты.ID Контрагент
		|	, Dat_.Dat День
		|	, Sum(IsNull(ПоставщикиОстатки.СуммаРубОстаток,0) + IsNull(ПокупателиОстатки.СуммаРубОстаток,0)) СуммаСальдо
		|   , Sum(ПоставщикиОстатки.СуммаРубОстаток) СуммаПоставщика
		|FROM $Справочник.Контрагенты AS Контрагенты With (NOLOCK)
		|Inner Join	$Справочник.ФизЛица As ФизЛица On $Контрагенты.Менеджер = ФизЛица.Id
		|FULL OUTER JOIN Dat_ On (1=1)
		|LEFT JOIN $РегистрОстатки.Поставщики(:НачДата~,
		|		RIGHT OUTER JOIN $Справочник.Контрагенты AS Контрагенты With (NOLOCK) ON $Контрагенты.ОсновнойДоговор = Договор,
		|		Договор,
		|		СуммаРуб) AS ПоставщикиОстатки ON $Контрагенты.ОсновнойДоговор = ПоставщикиОстатки.Договор
		|LEFT JOIN $РегистрОстатки.Покупатели(:НачДата~,
		|		RIGHT OUTER JOIN $Справочник.Контрагенты AS Контрагенты With (NOLOCK) ON $Контрагенты.ОсновнойДоговор = Договор,
		|		Договор,
		|		СуммаРуб) AS ПокупателиОстатки ON $Контрагенты.ОсновнойДоговор = ПокупателиОстатки.Договор
		| WHERE ($Контрагенты.Поставщик = 0)
		|   And (Not(Контрагенты.Descr Like 'яя%'))
		|   And ($ФизЛица.ЯвлМенеджер = 1)
		|GROUP BY $Контрагенты.Менеджер
		|   , Контрагенты.Id
		|   , Контрагенты.Descr
		|   , Dat_.Dat
		|) As Выборка1
		|------------------------- Выборка 1.2  
		| Left Join (Select $ПоступлениеТМЦ.Контрагент Контрагент
		|  ,	   Sum($ПоступлениеТМЦ.СуммаВзаиморасчетов) Сумма
		|  FROM $Документ.ПоступлениеТМЦ AS ПоступлениеТМЦ With (NOLOCK)
		|  INNER JOIN _1SJOURN AS Журнал With (NOLOCK) ON ПоступлениеТМЦ.IDDOC = Журнал.IDDOC
		|  Where ($ПоступлениеТМЦ.ДатаОплаты Between :НачДата And :КонДата)
		|	   And ((Журнал.CLOSED & 1) = 1)
		|  Group by $ПоступлениеТМЦ.Контрагент) As Выборка3 On Выборка3.Контрагент = Выборка1.Контрагент
		|------------------------- Выборка 2
		|  ,(Select $ПоступлениеТМЦ.Контрагент Контрагент
		|  ,	   ПоступлениеТМЦ.IDDOC ПоступлениеТМЦ
		|  ,	   $ПоступлениеТМЦ.ДатаОплаты ДатаОплаты
		|  ,	   $ПоступлениеТМЦ.СуммаВзаиморасчетов Сумма
		|    From $Документ.ПоступлениеТМЦ As ПоступлениеТМЦ
		|    INNER JOIN _1SJOURN AS Журнал With (NOLOCK) ON ПоступлениеТМЦ.IDDOC = Журнал.IDDOC
		|    Where ($ПоступлениеТМЦ.ДатаОплаты Between :НачДата And :КонДата)
		|	     And (Журнал.IsMark = 0)) As Выборка2
		| Where ((Выборка1.СуммаСальдо<>0) And (Not(Выборка1.СуммаСальдо Is Null)) And
		|	  (Выборка1.СуммаПоставщика<>0) And (Not(Выборка1.СуммаПоставщика Is Null)))
		|	 Or ((Выборка3.Сумма<>0) And (Not(Выборка3.Сумма Is Null)))
		|	 Or (Выборка2.ДатаОплаты  <> cast('17530101' as datetime))
		|--((Выборка1.Контрагент = Выборка2.Контрагент) Or (Выборка2.Контрагент Is Null))
		|    ) As Выборка
		|-- Where ((Выборка.ИсключитьИзСальдо<>0) And (Not(Выборка.ИсключитьИзСальдо Is Null)))
		|--   Or ((Выборка.ЧистоеСальдо<>0) And (Not(Выборка.ЧистоеСальдо Is Null)))
		|Group By
		|    Выборка.Менеджер
		|  , Выборка.Контрагент
		|  , Выборка.День
		|  , Выборка.Сальдо
		|  , Выборка.ЧистоеСальдо
		|  , Выборка.ПоступлениеТМЦ
		|  , Выборка.ДатаОплаты
		|Order By
		|    Выборка.Менеджер
		|  , Выборка.Контрагент
		|  , Выборка.День
		|  , Выборка.Сальдо
		|--  , Выборка.ИсключитьИзСальдо
		|  , Выборка.ПоступлениеТМЦ
		|  , Выборка.ДатаОплаты
		|"; 

, где Dat_ - уложенная временная таблица дней
               Делаю отчет по дебиторке на основе данного - меняю в тексте запроса "РегистрПокупатели" на "РегистрПоставщики" и "ПоступлениеТМЦ" на "Реализацию". Получаю аналогичный запрос, который корректно отрабатывается и всё бы замечательно, но он "вешает" сервер в отличие от первого. Проверил, (NOLOCK) везде есть. Переделал заново - результат тот же.
Помогите разобраться, в чём причина. Текст запроса далее.
« Последняя редакция: 20. Января 2011 :: 06:44 - al_zzz »  

Каждая система проходит три стадии:&&1) Шумиха&&2) Неразбериха&&3) Поиск виновных (собственно, рабочий процесс)&&4) Наказание невиновных&&5) Награждение непричастных&& В.М. Глушков
Наверх
 
IP записан
 
al_zzz
Senior Member
****
Отсутствует


1C++ ->

Сообщений: 361
Местоположение: Барнаул
Зарегистрирован: 05. Сентября 2009
Пол: Мужской
Re: Аналогичные запросы выполняются поразному.
Ответ #1 - 20. Января 2011 :: 03:46
Печать  
Код
Выбрать все
ТекстЗапроса = "-- qryMaker:Отчет по просроченному поставщикам.2010.09.13.17.12.37
		|Select
		|    Выборка.Менеджер [Менеджер $Справочник.ФизЛица]
		|  , Выборка.Контрагент [Контрагент $Справочник.Контрагенты]
		|  , Выборка.День
		|  , - Выборка.Сальдо
		|  , - Выборка.ЧистоеСальдо
		|--, Выборка.ИсключитьИзСальдо
		|  , Выборка.Реализация [Реализация $Документ.Реализация]
		|  , Выборка.ДатаОплаты
		|  , Sum(Выборка.Сумма) Сумма
		|From(Select Выборка1.Менеджер   Менеджер
		|   ,   Контрагент = Case Выборка1.Контрагент
		|	 When Null Then Выборка3.Контрагент
		|	 Else Выборка1.Контрагент End
		|   ,   Выборка1.День	  День
		|   ,   (- Выборка1.СуммаСальдо + IsNull(Выборка3.Сумма,0)) Сальдо
		|   ,   Выборка1.СуммаСальдо ЧистоеСальдо
		|   ,   Выборка3.Сумма	 ИсключитьИзСальдо
		|   ,   Реализация = Case Выборка1.День
		|	 When Выборка2.ДатаОплаты Then
		|				     Case Выборка1.Контрагент When Выборка2.Контрагент Then Выборка2.Реализация
		|				     Else Null End
		|	 Else Null End
		|   ,   ДатаОплаты =  Case Выборка1.День
		|	 When Выборка2.ДатаОплаты Then
		|				     Case Выборка1.Контрагент When Выборка2.Контрагент Then Выборка2.ДатаОплаты
		|				     Else Null End
		|	 Else Null End
		|   ,   Сумма = Case Выборка1.День
		|	 When Выборка2.ДатаОплаты Then
		|				     Case Выборка1.Контрагент When Выборка2.Контрагент Then Выборка2.Сумма
		|				     Else Null End
		|	 Else Null End
		|From
		|------------------------- Выборка 1.1
		|(SELECT $Контрагенты.Менеджер Менеджер
		|   , Контрагенты.ID Контрагент
		|	, Dat_.Dat День
		|	, Sum(IsNull(ПокупателиОстатки.СуммаРубОстаток,0) + IsNull(ПоставщикиОстатки.СуммаРубОстаток,0)) СуммаСальдо
		|   , Sum(ПокупателиОстатки.СуммаРубОстаток) СуммаПокупателя
		|FROM $Справочник.Контрагенты AS Контрагенты With (NOLOCK)
		|Inner Join	$Справочник.ФизЛица As ФизЛица On $Контрагенты.Менеджер = ФизЛица.Id
		|FULL OUTER JOIN Dat_ On (1=1)
		|LEFT JOIN $РегистрОстатки.Покупатели(:НачДата~,
		|		RIGHT OUTER JOIN $Справочник.Контрагенты AS Контрагенты With (NOLOCK) ON $Контрагенты.ОсновнойДоговор = Договор,
		|		Договор,
		|		СуммаРуб) AS ПокупателиОстатки ON $Контрагенты.ОсновнойДоговор = ПокупателиОстатки.Договор
		|LEFT JOIN $РегистрОстатки.Поставщики(:НачДата~,
		|		RIGHT OUTER JOIN $Справочник.Контрагенты AS Контрагенты With (NOLOCK) ON $Контрагенты.ОсновнойДоговор = Договор,
		|		Договор,
		|		СуммаРуб) AS ПоставщикиОстатки ON $Контрагенты.ОсновнойДоговор = ПоставщикиОстатки.Договор
		| WHERE --($Контрагенты.Поставщик = 0)
		|--   And
		|   (Not(Контрагенты.Descr Like 'яя%'))
		|   And (($ФизЛица.ЯвлМенеджер = 2) Or ($ФизЛица.ЯвлМенеджер = 3))
		|GROUP BY $Контрагенты.Менеджер
		|   , Контрагенты.Id
		|   , Контрагенты.Descr
		|   , Dat_.Dat
		|) As Выборка1
		|------------------------- Выборка 1.2
		| Left Join (Select $Реализация.Контрагент Контрагент
		|  ,	   Sum($Реализация.СуммаВзаиморасчетов) Сумма
		|  FROM $Документ.Реализация AS Реализация With (NOLOCK)
		|  INNER JOIN _1SJOURN AS Журнал With (NOLOCK) ON Реализация.IDDOC = Журнал.IDDOC
		|  Where ($Реализация.ДатаОплаты Between :НачДата And :КонДата)
		|	   And ((Журнал.CLOSED & 1) = 1)
		|  Group by $Реализация.Контрагент) As Выборка3 On Выборка3.Контрагент = Выборка1.Контрагент
		|------------------------- Выборка 2
		|  ,(Select $Реализация.Контрагент Контрагент
		|  ,	   Реализация.IDDOC Реализация
		|  ,	   $Реализация.ДатаОплаты ДатаОплаты
		|  ,	   $Реализация.СуммаВзаиморасчетов Сумма
		|    From $Документ.Реализация As Реализация
		|    INNER JOIN _1SJOURN AS Журнал With (NOLOCK) ON Реализация.IDDOC = Журнал.IDDOC
		|    Where ($Реализация.ДатаОплаты Between :НачДата And :КонДата)
		|	     And (Журнал.IsMark = 0)) As Выборка2
		| Where ((Выборка1.СуммаСальдо<>0) And (Not(Выборка1.СуммаСальдо Is Null)) And
		|	  (Выборка1.СуммаПокупателя<>0) And (Not(Выборка1.СуммаПокупателя Is Null)))
		|	 Or ((Выборка3.Сумма<>0) And (Not(Выборка3.Сумма Is Null)))
		|	 Or (Выборка2.ДатаОплаты  <> cast('17530101' as datetime))
		|--((Выборка1.Контрагент = Выборка2.Контрагент) Or (Выборка2.Контрагент Is Null))
		|    ) As Выборка
		|-- Where ((Выборка.ИсключитьИзСальдо<>0) And (Not(Выборка.ИсключитьИзСальдо Is Null)))
		|--   Or ((Выборка.ЧистоеСальдо<>0) And (Not(Выборка.ЧистоеСальдо Is Null)))
		|Group By
		|    Выборка.Менеджер
		|  , Выборка.Контрагент
		|  , Выборка.День
		|  , Выборка.Сальдо
		|  , Выборка.ЧистоеСальдо
		|--  , Выборка.ИсключитьИзСальдо
		|  , Выборка.Реализация
		|  , Выборка.ДатаОплаты
		|Order By
		|    Выборка.Менеджер
		|  , Выборка.Контрагент
		|  , Выборка.День
		|  , Выборка.Сальдо
		|--  , Выборка.ИсключитьИзСальдо
		|  , Выборка.Реализация
		|  , Выборка.ДатаОплаты
		|"; 

     
  

Каждая система проходит три стадии:&&1) Шумиха&&2) Неразбериха&&3) Поиск виновных (собственно, рабочий процесс)&&4) Наказание невиновных&&5) Награждение непричастных&& В.М. Глушков
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Аналогичные запросы выполняются поразному.
Ответ #2 - 20. Января 2011 :: 10:38
Печать  
al_zzz писал(а) 20. Января 2011 :: 03:43:
но он "вешает" сервер в отличие от первого. Проверил, (NOLOCK) везде есть.

NOLOCK есть не везде. И запрос точно рабочий? Я завис на кросс джойне выборки 1.2 и выборки 2.  Улыбка
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
al_zzz
Senior Member
****
Отсутствует


1C++ ->

Сообщений: 361
Местоположение: Барнаул
Зарегистрирован: 05. Сентября 2009
Пол: Мужской
Re: Аналогичные запросы выполняются поразному.
Ответ #3 - 20. Января 2011 :: 10:59
Печать  
berezdetsky писал(а) 20. Января 2011 :: 10:38:
NOLOCK есть не везде. И запрос точно рабочий? Я завис на кросс джойне выборки 1.2 и выборки 2.  Улыбка

Оба запроса рабочие и выдают нужный результат.
1. Можете уточнить, где ещё нужно добавить NOLOCK? 
2. Во втором запросе заменил
Код
Выбрать все
|...
|    And (($ФизЛица.ЯвлМенеджер = 2) Or ($ФизЛица.ЯвлМенеджер = 3))
|...
 


на
Код
Выбрать все
|...
|    And ($ФизЛица.ЯвлМенеджер = 2)
|...
 

. После этого перестал вешать.
  

Каждая система проходит три стадии:&&1) Шумиха&&2) Неразбериха&&3) Поиск виновных (собственно, рабочий процесс)&&4) Наказание невиновных&&5) Награждение непричастных&& В.М. Глушков
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Аналогичные запросы выполняются поразному.
Ответ #4 - 20. Января 2011 :: 11:17
Печать  
al_zzz писал(а) 20. Января 2011 :: 10:59:
1. Можете уточнить, где ещё нужно добавить NOLOCK?  

Цитата:
           |Inner Join      $Справочник.ФизЛица As ФизЛица On $Контрагенты.Менеджер = ФизЛица.Id
           |FULL OUTER JOIN Dat_ On (1=1)
...
           |    From $Документ.Реализация As Реализация


al_zzz писал(а) 20. Января 2011 :: 10:59:
2. Во втором запросе заменил

Флажок "Сортировка" реквизита ЯвлМенеджер не спасает?
  

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


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Аналогичные запросы выполняются поразному.
Ответ #5 - 20. Января 2011 :: 11:25
Печать  
al_zzz писал(а) 20. Января 2011 :: 10:59:
Оба запроса рабочие и выдают нужный результат.

А, ну да. Ты потом лишние данные вырезаешь этими фееричными Case...Else Null End.  Ужас Есть от чего вешаться..
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
al_zzz
Senior Member
****
Отсутствует


1C++ ->

Сообщений: 361
Местоположение: Барнаул
Зарегистрирован: 05. Сентября 2009
Пол: Мужской
Re: Аналогичные запросы выполняются поразному.
Ответ #6 - 20. Января 2011 :: 11:34
Печать  
berezdetsky писал(а) 20. Января 2011 :: 11:25:
А, ну да. Ты потом лишние данные вырезаешь этими фееричными Case...Else Null End.  Ужас Есть от чего вешаться..

Не смог придумать, как это сделать красивее и короче... Зато потом в 1с-ке группирую всё это и получаю то, что нужно. Улыбка
  

Каждая система проходит три стадии:&&1) Шумиха&&2) Неразбериха&&3) Поиск виновных (собственно, рабочий процесс)&&4) Наказание невиновных&&5) Награждение непричастных&& В.М. Глушков
Наверх
 
IP записан
 
Leierkastenmann
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 114
Зарегистрирован: 30. Марта 2007
Re: Аналогичные запросы выполняются поразному.
Ответ #7 - 20. Января 2011 :: 13:54
Печать  
Запросики однако...  Улыбка Я бы тоже на месте сервера повесился  Улыбка
Данных в таблицах много? Если немного, то еще ладно, прожить можно. Но я бы смотрел в сторону упрощения запроса, разбиения его на части чтобы избавиться от таких страшных вложенных запросов, использования временных таблиц, поменьше "or" в условиях, а желательно вообще без них. "Full outer join" тоже не увлекаться. Буквально вот вчера только переделал древний запрос, который содержал в себе Full outer join с подзапросами на временные таблицы и скорость выполнения в разы увеличилась. К тому же не надо забывать, что соединения с виртуальными таблицами это тоже соединения с подзапросами.
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Аналогичные запросы выполняются поразному.
Ответ #8 - 21. Января 2011 :: 11:36
Печать  
al_zzz писал(а) 20. Января 2011 :: 10:59:
[quote author=berezdetsky link=1295495031/0#2 date=1295519893]
2. Во втором запросе заменил
Код
Выбрать все
And (($ФизЛица.ЯвлМенеджер = 2) Or ($ФизЛица.ЯвлМенеджер = 3)) 


на
Код
Выбрать все
And ($ФизЛица.ЯвлМенеджер = 2) 

. После этого перестал вешать.



Дык, Or для скуля - это жути.
Практически всегда Or сваливает план выполнения в Table Scan - будь это поле хоть трижды индексированно.
Юзай
Код
Выбрать все
And $ФизЛица.ЯвлМенеджер in (2, 3) 



Ну и вообще
Код
Выбрать все
FULL OUTER JOIN Dat_ On (1=1) 

даст тебе Cross Join, что (за редким исключеним), есть зло.
  
Наверх
 
IP записан
 
al_zzz
Senior Member
****
Отсутствует


1C++ ->

Сообщений: 361
Местоположение: Барнаул
Зарегистрирован: 05. Сентября 2009
Пол: Мужской
Re: Аналогичные запросы выполняются поразному.
Ответ #9 - 24. Января 2011 :: 09:50
Печать  
Осознаю всё вышесказанное, но для упрощения этих запросов не хватает знаний и, особенно, времени. Считаю за счастье уже и эту возможность ускорить получение данных.
А результатом данного отчета является таблица, где указывается "чистое" сальдо клиента и суммы ожидаемых от него оплат в разрезе дней. Сколько надо времени, чтоб написать такой отчет (а ещё важнее, время выполнения!!!) штатными средствами 1с?
Всем большое спасибо за активное участие!  
Вопрос закрыт.
  

Каждая система проходит три стадии:&&1) Шумиха&&2) Неразбериха&&3) Поиск виновных (собственно, рабочий процесс)&&4) Наказание невиновных&&5) Награждение непричастных&& В.М. Глушков
Наверх
 
IP записан
 
ezarucheisky
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 4
Зарегистрирован: 21. Января 2011
Re: Аналогичные запросы выполняются поразному.
Ответ #10 - 24. Января 2011 :: 13:30
Печать  
Почитайте SQL SREVER 2008 ОСНОВЫ T-SQL
И.Бен-Ган.
ISBN:978-5-9775-0220-7
  
Наверх
 
IP записан
 
Neo
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 327
Зарегистрирован: 12. Ноября 2007
Re: Аналогичные запросы выполняются поразному.
Ответ #11 - 31. Января 2011 :: 11:03
Печать  
Цитата:
Or для скуля - это жути.
Практически всегда Or сваливает план выполнения в Table Scan - будь это поле хоть трижды индексированно.


Почему ты так решил? Вроде у меня везде где OR используется, в индекс без проблем попадает. Разницы между IN и OR практически не ощущается.
  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Аналогичные запросы выполняются поразному.
Ответ #12 - 31. Января 2011 :: 12:06
Печать  
Neo писал(а) 31. Января 2011 :: 11:03:
Разницы между IN и OR практически не ощущается.

А разницы и нет в этом случае. Совсем.  Круглые глаза
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
Leierkastenmann
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 114
Зарегистрирован: 30. Марта 2007
Re: Аналогичные запросы выполняются поразному.
Ответ #13 - 31. Января 2011 :: 15:13
Печать  
Neo писал(а) 31. Января 2011 :: 11:03:
Цитата:
Or для скуля - это жути.
Практически всегда Or сваливает план выполнения в Table Scan - будь это поле хоть трижды индексированно.


Почему ты так решил? Вроде у меня везде где OR используется, в индекс без проблем попадает. Разницы между IN и OR практически не ощущается.


Насчет "всегда" да еще и в Table Scan это было слишком сильное утверждение. Разницы между OR и IN действительно скорее всего не будет, по крайней мере я не сталкивался. А вот если OR стоит между условиями на разные поля таблицы, то разницу вполне можно ощутить.
А лучше не гадать, а смотреть в план запроса  Улыбка
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Аналогичные запросы выполняются поразному.
Ответ #14 - 01. Февраля 2011 :: 07:04
Печать  
Сейчас на работе 2005 скуль - сходу написать запрос, который бы показывал кардинальную разницу не получается. Видимо, планировщик запроса кардинально поумнел.

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