我们有一个查询,它从主 - 详细信息简单模式中检索一些数据。 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正在进行顺序扫描以满足查询。
这个查询在系统中非常重要且经常出现,所以我们想专门针对这种情况创建一个索引。
答案 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 )
)