Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Оптимизация запроса по условию OR  [new]
=Сергей=
Member

Откуда:
Сообщений: 336
Есть скрипт:
SELECT TOP 1000 *
	FROM [Measures]
		WHERE 
--[SourceName] in (select [value] from #params where [parameter] = 'sources')
--[Source_Id] in (select [Id] from #ids)
--([SourceName] in (select [value] from #params where [parameter] = 'sources') or [Source_Id] in (select [Id] from #ids))

[SourceName] varchar(32), [Source_Id] int - оба поля проиндексированы, индексами я управлять не могу.

Третья закоментированная строка является объединением двух предыдущих по условию OR.
Если запустить скрипт с активной первой или второй строкой условия, выполняется менее секунды, а если третью - около 2 минут.
Из-за чего это происходит?
Как оптимизировать без UNION двух скриптов?
2 апр 13, 11:15    [14125253]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса по условию OR  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
in заменить exist'ом пробовали ?
2 апр 13, 11:18    [14125274]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса по условию OR  [new]
=Сергей=
Member

Откуда:
Сообщений: 336
Maxx, А как именно?
2 апр 13, 11:22    [14125301]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса по условию OR  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
SELECT TOP 1000 *
FROM [Measures]
WHERE(  exists (
   select 1 
    from #params 
   where  [parameter] = 'sources'
      and [value]  = [Measures].[SourceName]
) or exists (
   select 1
   from  #ids
   where  [Id] = [Measures].[Source_Id]
))

примерно вот так
2 апр 13, 11:26    [14125329]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса по условию OR  [new]
=Сергей=
Member

Откуда:
Сообщений: 336
Maxx, спасибо, но такая же скорость.
2 апр 13, 11:31    [14125379]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса по условию OR  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
=Сергей=,

покажите план
2 апр 13, 11:32    [14125386]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса по условию OR  [new]
=Сергей=
Member

Откуда:
Сообщений: 336
План исполнения:

К сообщению приложен файл. Размер - 22Kb
2 апр 13, 11:44    [14125468]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса по условию OR  [new]
=Сергей=
Member

Откуда:
Сообщений: 336
в таблице #ids 33 записи, а в #params - 17
2 апр 13, 11:46    [14125492]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса по условию OR  [new]
=Сергей=
Member

Откуда:
Сообщений: 336
В условии с in либо exists - план не меняется
2 апр 13, 11:49    [14125521]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса по условию OR  [new]
Ennor Tiegael
Member

Откуда:
Сообщений: 3422
=Сергей=,

В общем случае, никак. Можно создать индексы на временных таблицах, но с ростом объемов это перестанет помогать рано или поздно. Реально - только UNION ALL.

Происходит из-за того, что сиквельный оптимизатор запросов не любит OR'ы, и никогда их не любил.
2 апр 13, 11:49    [14125527]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса по условию OR  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
=Сергей=
в таблице #ids 33 записи, а в #params - 17

как вариант собрать все множество в 1 времянку и джойниться с ней
2 апр 13, 11:55    [14125571]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса по условию OR  [new]
=Сергей=
Member

Откуда:
Сообщений: 336
Maxx
как вариант собрать все множество в 1 времянку и джойниться с ней

А вот это ОТЛИЧНАЯ мысль! Попробую!
2 апр 13, 12:00    [14125614]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса по условию OR  [new]
ambarka_max
Member

Откуда: Россия
Сообщений: 517
=Сергей=
Maxx
как вариант собрать все множество в 1 времянку и джойниться с ней

А вот это ОТЛИЧНАЯ мысль! Попробую!

Только вот отбор по разным полям, как это в одном множестве уместить. Уж если временные таблицы рассматриваются то UNION [ALL] и подавно следует рассмотреть.
2 апр 13, 12:08    [14125660]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить