我很难在一张非常大的桌子上优化查询。基本上所有这些都按日期过滤结果集:
SELECT FROM bigtable WHERE date >= '2015-01-01' AND date <= '2016-01-01' ORDER BY date desc;
添加以下日期索引实际上会让事情变得更糟:
CREATE INDEX CONCURRENTLY bigtable_date_index ON bigtable(date(date));
也就是说,如果没有索引,运行大约需要1秒,运行它需要大约10秒。但是对于更大的范围和过滤,即使没有该索引也会非常缓慢。
我正在使用postgresql 9.4,我看到9.5对排序有一些改进可能会有所帮助吗?
在这种情况下,BRIN索引应该有用吗?
答案 0 :(得分:0)
要使索引有效,它需要索引您要过滤的相同内容。在这种情况下,您按date
进行过滤,但您似乎已编入索引date(date)
,因此无法使用该索引。
使用date(date)
过滤您的表格:
SELECT FROM bigtable
WHERE date(date) >= '2015-01-01' AND date(date) <= '2016-01-01'
ORDER BY date(date) desc;
或者为裸date
索引:
CREATE INDEX CONCURRENTLY bigtable_date_index ON bigtable(date);