为postgres查询设计索引

时间:2012-06-05 21:35:43

标签: database performance postgresql indexing profiling

我们有一个查询,它从主 - 详细信息简单模式中检索一些数据。 WHERE 子句如下所示:

-- These are just random numbers
Where ticket.type_id in ( 2, 3, 4, 5, 7 ) and
      (
         ticket.color_id is null or
         ticket.color_id in ( 1, 2 , 8 )
      )

我们已经在列中有索引:ticket.type_id和ticket.color_id,无论如何,QUERY EXPLAIN ANALYZE仍然向我们显示Postgresql正在进行顺序扫描以满足查询。

这个查询在系统中非常重要且经常出现,所以我们想专门针对这种情况创建一个索引。

什么索引可以解决这种情况?

2 个答案:

答案 0 :(得分:3)

首先,检查索引是否真的会对您有所帮助。在调用查询之前关闭序列扫描以强制使用索引:

SET ENABLE_SEQSCAN TO OFF;

查询运行后:

SET ENABLE_SEQSCAN TO ON;

重新启用序列扫描。如果这表明没有性能改进,Postgres已经选择了正确的执行计划(序列扫描)。我会为整个查询运行explain analyze <query>,同时打开和关闭序列扫描。

您是否在相关表格上运行了vacuum analyze?计划程序可能没有针对您的查询的正确或最新统计信息。

答案 1 :(得分:1)

不是很确定 - 但我认为null正在变得越来越好..

可能是像这样的奇怪的结构

Where ticket.type_id in ( 2, 3, 4, 5, 7 ) and
      (
         nvl(ticket.color_id,1) in ( 1, 2 , 8 )
      )