1

我们有一个从主从简单模式中检索一些数据的查询。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 正在进行顺序扫描以满足查询。

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

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

4

2 回答 2

3

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

SET ENABLE_SEQSCAN TO OFF;

查询运行后:

SET ENABLE_SEQSCAN TO ON;

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

您是否vacuum analyze在相关表上运行过?计划程序可能没有正确或当前的查询统计信息。

于 2012-06-05T23:13:46.307 回答
1

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

也许像这样一个奇怪的结构

Where ticket.type_id in ( 2, 3, 4, 5, 7 ) and
      (
         nvl(ticket.color_id,1) in ( 1, 2 , 8 )
      )
于 2012-06-05T21:40:56.583 回答