2013-10-01 3 views
1

기록 레코드를 보유하는 테이블이 있습니다. 카운트가 업데이트 될 때마다 새 값이 그 시점에 페치되었음을 지정하는 레코드가 추가됩니다. 테이블 스키마는 다음과 같습니다.Postgres 쿼리 튜닝

Column  |   Type   |        Modifiers 
---------------+--------------------------+-------------------------------------------------------------------- 
id   | integer     | not null default nextval('project_accountrecord_id_seq'::regclass) 
user_id  | integer     | not null 
created  | timestamp with time zone | not null 
service  | character varying(200) | not null 
metric  | character varying(200) | not null 
value   | integer     | not null 

이제는 지난 7 일 동안 매일 업데이트되는 총 레코드 수를 얻고 싶습니다. 다음은 내가 생각해 낸 것입니다.

SELECT 
    created::timestamp::date as created_date, 
    count(created) 
FROM 
    project_accountrecord 
GROUP BY 
    created::timestamp::date 
ORDER BY 
    created_date DESC 
LIMIT 7; 

천천히 실행됩니다 (11406.347ms). 설명 분석 결과 :

Limit (cost=440939.66..440939.70 rows=7 width=8) (actual time=24184.547..24370.715 rows=7 loops=1) 
    -> GroupAggregate (cost=440939.66..477990.56 rows=6711746 width=8) (actual time=24184.544..24370.699 rows=7 loops=1) 
     -> Sort (cost=440939.66..444340.97 rows=6802607 width=8) (actual time=24161.120..24276.205 rows=92413 loops=1) 
       Sort Key: (((created)::timestamp without time zone)::date) 
       Sort Method: external merge Disk: 146328kB 
       -> Seq Scan on project_accountrecord (cost=0.00..153671.43 rows=6802607 width=8) (actual time=0.017..10132.970 rows=6802607 loops=1) 
Total runtime: 24420.988 ms 

이 테이블에는 680 만 개가 넘는 행이 있습니다. 이 쿼리의 성능을 높이려면 어떻게해야합니까? 이상적으로는 캐시를 한 두 번 백그라운드에서 업데이트 할 수 있도록 잠시 후에 실행하고 싶습니다.

+2

'created :: date'에 색인을 생성하고 where 절을 추가하십시오 (current_date - 7과 current_date 사이의 created :: date). Btw : 타임 스탬프에'created '를 캐스팅하는 목적은 무엇입니까? 이미 * 타임 스탬프입니다. –

+0

@a_horse_with_no_name 흥미로운 것은 내가 그 일을하고 있다는 것을 알지 못했다. 나는 지금 'created :: date'와'WHERE' 절에 색인을 추가하여 –

+0

이 머리를 맞대고 왜 project_accountrecord (created :: date DESC)에 색인을 생성하는지 알려주고,'ERROR : "또는"근처에서 구문 오류가 발생했습니다. –

답변

2

이제 전체 테이블을 검색하고 결과를 계산하고 최근 7 일로 제한해야합니다. (매일 기록을 갱신하지 않는 경우 또는 그 이상)에서만 최근 7 일 검색하여 쿼리 속도를 빠르게 할 수 있습니다

where created_date>now()::date-'7 days'::interval 

또 다른 aproach는 현재 날짜 추가 테이블의 역사적 결과를 캐시하고 계산하는 것입니다.