6

delayed_job делает запрос, как это регулярно:Какой самый оптимальный индекс для этого запроса delayed_job для postgres?

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 

Мои журналы на моем довольно большом отчете DB машины, что она занимает четверть секунды, чтобы бежать. Я мог бы просто добавить некоторые индексы во все столбцы, которые были выбраны, но я могу, вероятно, получить больше производительности из индекса с несколькими столбцами.

Какой оптимальный индекс для нескольких столбцов я могу сделать для этого запроса? Есть ли инструменты, которые могут рассчитать это для меня? версия

обновление

Postgres: 9.1.3

один существующий индекс: приоритет, 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) 
+0

Есть ли существующие индексы? – swasheck

+1

Каков текущий план объяснения и какая версия PG вы? – Kuberchaun

+0

@JustBob Я добавил эту информацию к моему вопросу сейчас –

ответ

0

I не думайте, что в этом случае многоколоночный индекс очень полезен. Используйте несколько индексов одного столбца.

1

Поскольку у вас есть предложение LIMIT, возможно, вам нужен индекс заказа вместо фильтрующего, на (priority, run_at).

Каков процент записей в вашей таблице, которые удовлетворяют условию WHERE?

+0

План ожидает 10 кортежей для сканирования индекса, но статистика может быть неправильной. – wildplasser

+0

@Quassnoi обычно очень маленький –

Смежные вопросы