Здравствуйте!
Поделитесь пожалуйста немного по оптимизации запросов с 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?