оптимизация запросов с in

Здравствуйте!

Поделитесь пожалуйста немного по оптимизации запросов с in и условиями на <>.

Допустим, есть таблица t с полями a,b,c,d,e типа integer.
Имеется составной индекс abc на поля a,b,c.

1) Делается запрос: select * from t where a in (1,2) and b in (10,20,30) and c in (100,200,300,400).

Правильно ли я понимаю, что postgresql сам соптимизирует этот запрос, разбив его на серию таких запросов...
select * from t where a=1 and b=10 and c=100
select * from t where a=1 and b=10 and c=200
...
select * from t where a=2 and b=30 and c=400
И будет полноценно использовать индекс abc.

Или все же лучше самому это сделать на клиенте?

2) Делается запрос вида select * from t where a=1 and b>10 and b<100 and c=200

Правильно ли я понимаю, что будет использована только часть ab индекса abc, и что для такого запроса лучше создать индекс из полей a,c,b?

А то explain запросов не такой понятный, как mysql'евский :(.

Заранее спасибо!

Опции просмотра комментариев

Выберите предпочитаемый вами способ показа комментариев и нажмите "Сохранить настройки" для активации изменений.

Безусловно PostgreSQL

Безусловно PostgreSQL оптимизирует запрос, однако не разбитием на серию как вы пишите.
Безусловно в PostgreSQL конструкция IN работает быстрее, чем <> как и в других нормальных СУБД
Безусловно, там где это возможно будет использован индекс, но его использование зависит от многих вещей: количества данных в таблице, их разнородность, своевременная оптимизация таблиц (сбор статистики), вид самого запроса. Советую прочесть также:
http://postgresql.ru.net/FAQ_russian.html#q6.41
возможно натолкнёт на мысли

Спасибо за ответ. А не

Спасибо за ответ.

А не посоветуете ли какую толковую статью (если есть, то на русском языке), в которой описано, как расшифровывать то, что возвращает explain?

Опции просмотра комментариев

Выберите предпочитаемый вами способ показа комментариев и нажмите "Сохранить настройки" для активации изменений.

Back to top

(С) Виктор Вислобоков, 2008-2023