如何在多列上正确使用索引

时间:2015-08-20 06:00:43

标签: sql postgresql

我在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_paramINTEGERsecond_paramDATE - 两者都与表B的字段相关

此查询会将数据生成到我的主工作屏幕,以便多次使用。

我的困境是由于查询的结构,因为first_paramsecond_param处于"不同的级别"我不知道我是否应该在两个列上创建索引或分别在每个列的索引中查询?此外,second_param可以从公用表表达式访问,而不是直接从B

访问

换句话说......选择:

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

OR:

CREATE INDEX name_aa
  ON B
  USING btree
  (userid);

CREATE INDEX name_ab
  ON B
  USING btree
  (issuedate);

索引指南说如果我们多次使用2列,那么我们应该将它们一起索引,但在这种情况下,我不太确定......

你可以建议吗?

2 个答案:

答案 0 :(得分:1)

我可能会使用两个单独的索引,它更灵活,在大多数情况下只是表现更好或更多。看看例如: 2 PostgreSQL indices on the same column of the same table - redundant?

例如,我认为在您的查询中,2列索引对于issate比较而言相对无用。

一般来说,除非您有一个非常具体的案例和使用它们的理由,否则请避免使用多列索引。

答案 1 :(得分:1)

你是对的。您应该选择两个单独的索引。如果您使用同一连接中的列(即FROM tableA JOIN tableB ON tableA.columnA1 = tableB.columnB1 AND tableA.columnA2 = tableB.columnB2

,则可以使用多列索引