有一個非常類似的線程在這裏:
Slow select distinct query on postgres
如果你知道最小/最大日期,你會比做一個序列掃描過更好的查詢對日期的列表整桌子。假設你看起來像這應該是快上記錄的索引,東西:
with days as (
select date_trunc('day', min(recorded))::date + k * interval '1 day' as day
from records,
generate_series(0,
(select date_trunc('day', max(recorded))::date
- date_trunc('day', min(recorded)::date
from records
)) as k
)
select day
from days
where exists (
select 1
from records
where day <= recorded and recorded < day + interval '1 day'
);
可能會有一些調整做上面的查詢,但總的想法是存在的:它會更快在索引字段上執行幾千個子查詢/索引掃描,而不是掃描幾十億行並聚合它們以便識別不同日子。
如果表格每天使用一個分區進行分區,您甚至不需要日期索引,因爲約束排除將選擇正確的表格,並且從表格中讀取的第一行將滿足EXISTS。 – peufeu 2011-05-18 08:28:07