2012-02-24 39 views
0

我在查找更多信息如何修改Postgres 9..0查詢計劃。修改Postgres 9.0查詢計劃

我有查詢:

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

和解釋分析輸出:

"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。 這個表格非常大:) 所以有很多行,其中group_id是相同的,但是具有相同usr_id的行少得多。

問題是我怎麼能告訴查詢計劃,第一個過濾器必須是usr_id。

我創建GROUP_ID和usr_id指數和我的表現, 但我需要知道如何修改查詢計劃,這對未來:)

+0

估計行26,669,實際3,050,697。我認爲「真空分析」是有序的。你經常這樣做嗎? – 2012-02-28 01:01:37

回答

1

PostgreSQL計劃器並不真正接受你想要的提示。實現你想要的最簡單的方法是重寫你的查詢。

分析你的EXPLAIN ANALYZE輸出,很明顯,大部分時間在下面的部分是花:

「 - >位圖索引掃描,statistics_loged_users_idx2(成本= 0.00..496.85行數= 26669寬度= 0 )(實際時間= 375.770..375.770行= 3050697個循環= 1)」

「指數電導率:(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); 

給它一個嘗試,並檢查EXPLAIN重新分析。

+0

是的,這是訣竅 - 得到更多的表演:)但無論如何 - 有辦法通過設置一些參數如何執行查詢來修改計劃。例如那裏(每個列的索引,而不是單個索引)指定過濾器索引順序? – marechs 2012-02-24 10:56:58