postgres 上的这个延迟作业查询的最佳索引是啥?

Posted

技术标签:

【中文标题】postgres 上的这个延迟作业查询的最佳索引是啥?【英文标题】:What is the most optimal index for this delayed_job query on postgres?postgres 上的这个延迟作业查询的最佳索引是什么? 【发布时间】:2012-05-30 04:30:28 【问题描述】:

delayed_job 定期执行这样的查询:

SELECT  "delayed_jobs".*
FROM "delayed_jobs"
WHERE ((run_at <= '2012-05-23 15:16:43.180810' AND (locked_at IS NULL OR locked_at < '2012-05-23 11:16:43.180841') OR locked_by = 'host:foo pid:1') AND failed_at IS NULL)
ORDER BY priority ASC, run_at ASC LIMIT 5

我在我相当大的数据库机器上的日志报告说它需要四分之一秒才能运行。我可以在所有被选中的列上添加一些索引,但我可能会从多列索引中获得更高的性能。

我可以为此查询创建的最佳多列索引是什么?有什么工具可以帮我计算吗?

更新

postgres 版本:9.1.3

一个现有索引:priority, run_at(命名为“delayed_jobs_priority”)

explain analyze:

Limit  (cost=0.00..219.65 rows=5 width=1154) (actual time=0.727..0.727 rows=0 loops=1)
   ->  Index Scan using delayed_jobs_priority on delayed_jobs  (cost=0.00..351.43 rows=8 width=1154) (actual time=0.725..0.725 rows=0 loops=1)
         Filter: ((failed_at IS NULL) AND (((run_at <= '2012-05-23 18:11:03.980113'::timestamp without time zone) AND ((locked_at IS NULL) OR (locked_at < '2012-05-23 14:11:03.98014'::timestamp without time zone))) OR ((locked_by)::text = 'host:foo pid:1'::text)))
 Total runtime: 0.754 ms
(4 rows)

【问题讨论】:

有没有现成的索引? 目前的解释计划是什么,你是什么版本的PG? @JustBob 我现在将此信息添加到我的问题中 @swasheck 只有一个索引,优先,run_at 我认为优先级和 datetime+flag 子句字段或多或少是正交的,所以无论哪种方式你都会失败。 (索引太多,或最终排序 + 限制)。优先级的取值范围可能很小? 【参考方案1】:

由于您有一个LIMIT 子句,因此您可能希望在(priority, run_at) 上使用排序索引而不是过滤索引。

您的表中满足WHERE 条件的记录的百分比是多少?

【讨论】:

该计划预计索引扫描有 10 个元组,但统计可能有误。【参考方案2】:

我认为多列索引在这种情况下没有多大用处。使用多个单列索引。

【讨论】:

以上是关于postgres 上的这个延迟作业查询的最佳索引是啥?的主要内容,如果未能解决你的问题,请参考以下文章

Postgres:具有(延迟)读写访问权限的大表

Mysql 索引:查询生成器的最佳实践

Postgres 上的索引

日期字段上的 Postgres DESC 索引

使用 rSpec 测试延迟作业链的最佳方法是啥?

最佳实践:优化Postgres查询性能(上)