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

Откуда: Киев
Сообщений: 98
Здравствуйте!

Подскажите, пожалуйста, есть ли методики оптимизации запросов вида:

select
    name, age, ...
from Users
where
     cityId = A or cityId = B or cityId = C
     and
     vacancy = D or vacancy = E
     and
     age > 20;


Т.е., как видите, запрос содержит несколько(например, не более 3-х) условий выбора по конкретному полю. Запрос сложный, как по мне: мало того, что много условий, так ещё попробуй пойми как правильно организовать индексы для таблицы.

Посему вопросы:

1) Есть ли способ как-то оптимизировать такие запросы? — может можно как-то перестроить запрос, или попросту записать его иначе?

2) Я бы построил индекс для таблицы, например, так; что скажете?:

create nonclustered index IndexName on Users(cityId) include(vacancy, age);


Спасибо за советы.
23 июл 13, 19:26    [14606408]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запросов с большим количеством условий  [new]
Добрый Э - Эх
Guest
есть подозрение, что ты скобки порастерял в OR-условиях...
23 июл 13, 19:32    [14606429]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запросов с большим количеством условий  [new]
Crimean
Member

Откуда:
Сообщений: 13147
1. скобочки бы расставить
2. union [all] / option ( recompile ) / if else в руки.. в зависимости от сложности выборки разные комбинации помогают
3. сильно влияет "мощность" возвращаемого датасета. если 1-2 строки (условно) - одни подходы, а если лямы - другие
23 июл 13, 19:33    [14606433]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запросов с большим количеством условий  [new]
roman_lenko
Member

Откуда: Киев
Сообщений: 98
Спасибо!

Добрый Э - Эх
есть подозрение, что ты скобки порастерял в OR-условиях...

Crimean
1. скобочки бы расставить


Это запросто может быть ..

Вот правильная версия, тогда:

select
    name, age, ...
from Users
where
     (cityId = A or cityId = B or cityId = C)
     and
     (vacancy = D or vacancy = E)
     and
     age > 20;


Crimean
в зависимости от сложности выборки разные комбинации помогают


Выборка будет, примерно, как указанная мною. Т.е., например, я запрещу делать запросы, где больше чем 3(три) условия на одну колонку.

Crimean
union [all] / option ( recompile )


А поподробнее можно? — IF/ELSE, думаю, мне тут не помогут. А вот union и option recompile — хотелось бы детальнее.

Crimean
3. сильно влияет "мощность" возвращаемого датасета. если 1-2 строки (условно) - одни подходы, а если лямы - другие


Ну, скажем так, размер возвращаемого датасета я буду нарочно лимитировать по 25 результатов (типа, страничная навигация) с помощью offset и fetch next.
23 июл 13, 20:27    [14606593]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запросов с большим количеством условий  [new]
Добрый Э - Эх
Guest
roman_lenko
Crimean
union [all] / option ( recompile )

А поподробнее можно?

А чего подробнее-то? Переписывание OR-условий в UNION - один из способов их оптимизации.

Было:
Select * from t where f1 = 1 or f2 = 2
, стало
Select * from t where f1 = 1 
union 
Select * from t where f2 = 2
23 июл 13, 20:33    [14606606]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запросов с большим количеством условий  [new]
roman_lenko
Member

Откуда: Киев
Сообщений: 98
Добрый Э - Эх
А чего подробнее-то? Переписывание OR-условий в UNION - один из способов их оптимизации.


Спасибо — я этого не знал. Чисто на вскидку — за счёт чего достигается такая оптимизация? (конвертация OR в UNION). Запросы выполняются параллельно(в разных системных потоках), или просто за счёт индексов таблицы(если они есть, конечно) улучшается производительность?
23 июл 13, 20:48    [14606665]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запросов с большим количеством условий  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31868
roman_lenko
Чисто на вскидку — за счёт чего достигается такая оптимизация? (конвертация OR в UNION). Запросы выполняются параллельно(в разных системных потоках), или просто за счёт индексов таблицы(если они есть, конечно) улучшается производительность?
Второе.
23 июл 13, 21:59    [14606917]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запросов с большим количеством условий  [new]
Crimean
Member

Откуда:
Сообщений: 13147
оптимизатор у нас тупенький. ему надо все по полочкам. чем проще тем стабильнее планы. чем стабильнее тем безпроблемнее в эксплуатации. а напишите громадье в where - получите сканы и море фильтров в плане пожизненно. а оно вам надо? ) хотя - да - иногда надо
23 июл 13, 22:47    [14607119]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запросов с большим количеством условий  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
Добрый Э - Эх
roman_lenko
пропущено...

А поподробнее можно?

А чего подробнее-то? Переписывание OR-условий в UNION - один из способов их оптимизации.

Было:
Select * from t where f1 = 1 or f2 = 2
, стало
Select * from t where f1 = 1 
union 
Select * from t where f2 = 2

А в вашем примере не поможет разве такой вариант?
Select * from t where f1 between 1 and 2
24 июл 13, 10:40    [14608779]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запросов с большим количеством условий  [new]
Ivan Durak
Member

Откуда: Minsk!!!
Сообщений: 3685
да без битмап индексов страдаем....
они умеют складываться по or.

А так юнионы + блоки if
24 июл 13, 11:42    [14609188]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запросов с большим количеством условий  [new]
Добрый Э - Эх
Guest
Minamoto
Добрый Э - Эх
пропущено...

А чего подробнее-то? Переписывание OR-условий в UNION - один из способов их оптимизации.

Было:
Select * from t where f1 = 1 or f2 = 2
, стало
Select * from t where f1 = 1 
union 
Select * from t where f2 = 2

А в вашем примере не поможет разве такой вариант?
Select * from t where f1 between 1 and 2
Если внимательно посмотреть, то не трудно увидеть, что в моем примере условия накладываются на разные поля таблицы... Потому как f1 и f2 - ни есть одно и то же поле, ежели чего
24 июл 13, 11:54    [14609284]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запросов с большим количеством условий  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
Добрый Э - Эх
Minamoto
пропущено...

А в вашем примере не поможет разве такой вариант?
Select * from t where f1 between 1 and 2
Если внимательно посмотреть, то не трудно увидеть, что в моем примере условия накладываются на разные поля таблицы... Потому как f1 и f2 - ни есть одно и то же поле, ежели чего
Ой. не заметил, тогда вопрос снимаю.
24 июл 13, 12:04    [14609367]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить