我有一張大約2000萬行的表格。出於理由,可以說表中有兩列 - 一個id和一個時間戳。我試圖計算每天的項目數量。這是我目前所擁有的。在postgres的大桌子上加速按日期查詢
SELECT DATE(timestamp) AS day, COUNT(*)
FROM actions
WHERE DATE(timestamp) >= '20100101'
AND DATE(timestamp) < '20110101'
GROUP BY day;
沒有任何索引,這需要大約30秒才能在我的機器上運行。這裏的解釋分析輸出:
GroupAggregate (cost=675462.78..676813.42 rows=46532 width=8) (actual time=24467.404..32417.643 rows=346 loops=1)
-> Sort (cost=675462.78..675680.34 rows=87021 width=8) (actual time=24466.730..29071.438 rows=17321121 loops=1)
Sort Key: (date("timestamp"))
Sort Method: external merge Disk: 372496kB
-> Seq Scan on actions (cost=0.00..667133.11 rows=87021 width=8) (actual time=1.981..12368.186 rows=17321121 loops=1)
Filter: ((date("timestamp") >= '2010-01-01'::date) AND (date("timestamp") < '2011-01-01'::date))
Total runtime: 32447.762 ms
因爲我看到一個順序掃描,我試圖指數上約50%的切割速度的日期總
CREATE INDEX ON actions (DATE(timestamp));
。
HashAggregate (cost=796710.64..796716.19 rows=370 width=8) (actual time=17038.503..17038.590 rows=346 loops=1)
-> Seq Scan on actions (cost=0.00..710202.27 rows=17301674 width=8) (actual time=1.745..12080.877 rows=17321121 loops=1)
Filter: ((date("timestamp") >= '2010-01-01'::date) AND (date("timestamp") < '2011-01-01'::date))
Total runtime: 17038.663 ms
我是新來的整個查詢優化業務,我不知道下一步該怎麼做。任何線索如何讓這個查詢運行得更快?
- 編輯 -
它看起來像我打指標的限制。這幾乎是在該表上運行的唯一查詢(儘管日期的值會更改)。有沒有辦法分割桌子?或者用所有計數值創建一個緩存表?還是有其他選擇?
您是否在此告訴我們整個故事?它看起來像改變了第一個和第二個計劃之間的內存設置。這是我的建議。 ;-) – 2011-01-13 07:29:13
內存設置沒有變化,雖然我一直在每個模式更改之間進行真空分析。不知道我是否應該這樣做,但它確實會嚴重影響結果。 – zaius 2011-01-13 08:00:20