6

delayed_job 쿼리 정기적으로 다음과 같이 수행합니다postgres에 대한 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 

내 로그가 실행하는 분기 초 걸린다 내 꽤 큰 DB 머신 보고서. 내가 선택한 모든 열에 일부 색인을 던질 수 있지만 아마 다중 열 인덱스 밖으로 더 많은 성능을 얻을 수 있습니다.

이 쿼리에 가장 적합한 다중 열 인덱스는 무엇입니까? 나를 위해 이것을 계산할 수있는 도구가 있습니까?

갱신

포스트 그레스 버전 : 9.1.3

하나의 기존 인덱스 :

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 : 우선 순위, run_at는

explain analyze 중 ("delayed_jobs_priority"라는 이름의) 이 경우 여러 열 인덱스가 많이 사용된다고 생각하지 마십시오. 여러 단일 열 인덱스를 사용하십시오.

1

LIMIT 조항이 있으므로 (priority, run_at)에 필터링 대신 주문 색인을 사용할 수 있습니다.

WHERE 조건을 만족하는 테이블의 레코드 백분율은 얼마입니까?

+0

플랜은 인덱스 스캔에 대해 10 개의 튜플을 예상하지만 통계가 잘못되었을 수 있습니다. – wildplasser

+0

@Quassnoi 일반적으로 매우 작음 –