sql - postgres 上这个 delayed_job 查询的最佳索引是什么?

标签 sql postgresql delayed-job multiple-columns database-indexes

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”)

出于解释分析:

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)

最佳答案

由于您有一个 LIMIT 子句,您可能需要一个排序索引而不是过滤索引,在 (priority, run_at) 上。

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

关于sql - postgres 上这个 delayed_job 查询的最佳索引是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10723102/

相关文章:

java - 如何在存储过程中将架构名称作为参数传递

postgresql - 使用 CSV 包含反斜杠或双引号的 Postgres 数组语法

Postgresql 9.2 - 为什么速度不同 - SQL Subselect 和 JOIN?

ruby-on-rails - Rails 3 中 delayed_job 的自动缩放工作人员

sql - ZF 子查询问题

自上个月以来获得最多评论的 SQL 查询

ruby-on-rails - 什么可能导致预定的 Rails 事件作业消失?

ruby-on-rails - delayed_job 命名队列的单独日志

sql - 在 Db2 中处理 BOOLEAN 值的最佳方式是什么?

postgresql GET STACKED DIAGNOSTICS 不能用数组类型?