我剛剛重組了我的數據庫,使用PostgreSQL 8.2中的partitioning。現在我遇到查詢性能問題:多分區Postgres表的高效查詢
SELECT *
FROM my_table
WHERE time_stamp >= '2010-02-10' and time_stamp < '2010-02-11'
ORDER BY id DESC
LIMIT 100;
表中有4500萬行。在分區之前,這將使用反向索引掃描並在達到極限時立即停止。
分區後(在time_stamp範圍內),Postgres會對主表和相關分區執行完整索引掃描,併合並結果,對它們進行排序,然後應用限制。這需要太長時間。
我可以解決這個問題:
SELECT * FROM (
SELECT *
FROM my_table_part_a
WHERE time_stamp >= '2010-02-10' and time_stamp < '2010-02-11'
ORDER BY id DESC
LIMIT 100) t
UNION ALL
SELECT * FROM (
SELECT *
FROM my_table_part_b
WHERE time_stamp >= '2010-02-10' and time_stamp < '2010-02-11'
ORDER BY id DESC
LIMIT 100) t
UNION ALL
... and so on ...
ORDER BY id DESC
LIMIT 100
這跑得快。時間戳超出範圍的分區甚至不包括在查詢計劃中。
我的問題是:是否有某種暗示或語法,我可以在Postgres的8.2用於阻止查詢籌辦者通過掃描整個表,但仍使用簡單的語法,只是指主表?
基本上,我是否可以避免動態構建每個正在被定義的分區的UNION查詢的痛苦?
編輯:我已經啓用(感謝@Vinko Vrsalovic)
8.2?真?在做任何事情之前,你應該考慮升級到支持(和當前)的Postgres版本(9.2是當前的版本) – 2013-04-01 15:57:50