2012-02-24 3 views
0

Postgres 9..0 쿼리 계획을 수정하는 방법에 대한 자세한 정보를 찾고 있습니다.Postgres 9.0 쿼리 계획 수정

"Aggregate (cost=1518.56..1518.57 rows=1 width=8) (actual time=410.459..410.459 rows=1 loops=1)" 
" -> Bitmap Heap Scan on statistics_loged_users (cost=993.96..1518.55 rows=1 width=8) (actual time=410.025..410.406 rows=210 loops=1)" 
"  Recheck Cond: ((group_id = 3) AND (usr_id = 243431))" 
"  Filter: (school_id = 338)" 
"  -> BitmapAnd (cost=993.96..993.96 rows=133 width=0) (actual time=409.521..409.521 rows=0 loops=1)" 
"    -> Bitmap Index Scan on statistics_loged_users_idx2 (cost=0.00..496.85 rows=26669 width=0) (actual time=375.770..375.770 rows=3050697 loops=1)" 
"     Index Cond: (group_id = 3)" 
"    -> Bitmap Index Scan on statistics_loged_users_idx (cost=0.00..496.85 rows=26669 width=0) (actual time=0.077..0.077 rows=210 loops=1)" 
"     Index Cond: (usr_id = 243431)" 
"Total runtime: 411.419 ms" 

우리는 첫 번째 필터는 GROUP_ID입니다 볼 수 있습니다 출력을 분석

SELECT 
    max(creation_date) 
FROM 
    statistics_loged_users 
WHERE 
    school_id = 338 and 
    group_id  = 3 and 
    usr_id  = 243431; 

그리고 설명 :

나는 쿼리가 있습니다. 이 테이블은 매우 큽니다 :) group_id가 같지만 동일한 usr_id를 가진 행이 훨씬 적은 행이 있습니다.

질문은 어떻게 첫 번째 필터가 usr_id 여야하는지 쿼리 계획에 알릴 수 있습니다.

내가 GROUP_ID 및 usr_id에 대한 인덱스를 생성하고 난 성능, 을 가지고 있지만, 거기에 내가 쿼리 계획을 수정하는 방법을 알고 있어야합니다, 그것은 미래 :)

+0

추정 행 26,669, 실제 3,050,697. 나는 '진공 분석'이 순서라고 생각한다. 정기적으로 그렇게합니까? –

답변

1

PostgreSQL planner는 실제로 원하는 방식으로 힌트를 받아들이지 않습니다. 원하는 것을 얻는 가장 쉬운 방법은 쿼리를 다시 작성하는 것입니다. > 비트 맵 인덱스 스캔 statistics_loged_users_idx2에 (비용 = 0.00..496.85 행 = 26669 폭 = 0 -

"

당신의 EXPLAIN ANALYZE 출력을 분석, 그것은 대부분의 시간은 다음 절에서 소비되는 것은 분명) (실제 시간 = 375.770..375.770 행 = 3050697 개 루프 = 1) "

"인덱스 COND (GROUP_ID = 3) "

처음 usr_id 만보고하기 위해 당신이 당신의 쿼리를 다시 작성하는 경우 및 school_id 당신은 당신이 원하는 것을 얻을 것입니다.

SELECT 
    max(creation_date) 
FROM 
(
    SELECT 
     group_id, creation_date 
    FROM 
     statistics_loged_users 
    WHERE 
     school_id = 338 and 
     usr_id  = 243431 
) AS cd 
WHERE 
group_id = 3; 
1

현재 쿼리가 이제 두 개의 인덱스를 사용하는, statistics_loged_users_idx 및 위해입니다 statistics_loged_users_idx2, 단일 색인이 더 빠를 수도 있습니다. usr_id, group_id 및 school_id에 단일 색인을 작성하고 색인에서 다른 컬럼 순서를 시도하십시오.

두 가지 예 :

CREATE INDEX idx_triple_index ON statistics_loged_users(usr_id, group_id, school_id); 

CREATE INDEX idx_triple_2_index ON statistics_loged_users(usr_id, school_id, group_id); 

이 그것을 시도를주고 다시 ANALYZE EXPLAIN 확인합니다.

+0

그래,이 트릭을 않습니다 - 더 perfomance :)하지만 어쨌든 - 쿼리를 실행하는 방법을 매개 변수를 설정하여 계획을 수정하는 방법입니다. 예를 들어, (하나의 인덱스가 아닌 각 컬럼의 인덱스와 함께) 필터 인덱스 순서를 지정합니까? – marechs