2015-08-20 2 views
0

У меня есть этот запрос в PostgreSQL:Как правильно использовать индекс на несколько столбцов

SELECT cte.* 
FROM (

       select ...... 
       from A a 
       left join B b using (id) 
       left join C c on (c.cid=a.cid) 
       left join D d on (d.did=c.did) 
       left join E e on (e.eid=d.eid) 
       left JOIN (F f 
          JOIN (SELECT func() AS funcid) x ON f.fid = x.fid) ON a.id = f.id 
       left join G g on (g.gid=c.gid) 
       left join H h on (h.hid=c.hid) 
       where b.userid= first_param 
       order by ..... 
) as cte 
where cte.issuedate=second_param 

Этот запрос работает с 2-мя параметрами: first_param является INTEGER и second_param является DATE - Оба они связаны с полями таблицы B

Этот запрос генерирует данные на моем основном рабочем экране, поэтому его можно использовать много раз.

Моя дилемма из-за структуры запроса, так как first_param и second_param в «различном уровне» из запроса, я не знаю, должен ли я создать индекс на обоих столбцы вместе или индекса каждого столбца по отдельности? Кроме того, second_param доступ из общих табличных выражений, а не непосредственно из B

Другими словами ... выбор между:

CREATE INDEX name_a 
    ON B 
    USING btree 
    (userid,issuedate); 

ИЛИ:

CREATE INDEX name_aa 
    ON B 
    USING btree 
    (userid); 

CREATE INDEX name_ab 
    ON B 
    USING btree 
    (issuedate); 

Руководящие принципы индексов говорит что если мы будем использовать 2 столбца вместе много раз, тогда мы должны проиндексировать их вместе, но в этом случае я не уверен ...

Can вы советуете?

ответ

1

Я бы, вероятно, использовал два отдельных индекса, более гибкий и в большинстве случаев такой же, как исполнитель или даже больше. см., например: 2 PostgreSQL indices on the same column of the same table - redundant?

Например, я думаю, что в вашем запросе индекс столбца 2 был бы относительно бесполезным для опубликованного сравнения.

Вообще говоря, избегайте многоколоночных индексов, если у вас нет особого случая и причины использовать их.

1

Вы правы. Вы должны выбрать два отдельных индекса. Вы бы использовали индекс с несколькими столбцами, если вы использовали столбцы в одном соединении (то есть FROM tableA JOIN tableB ON tableA.columnA1 = tableB.columnB1 AND tableA.columnA2 = tableB.columnB2)