在大型表上优化`IN(x,y,z)`查询

时间:2014-03-05 21:13:10

标签: sql postgresql

我有一张包含数百万行的表格。它有十几个列,其中很多都很长。这是一张大桌子。

我有很多常见的操作,我需要根据其中一列选择2列中的数据作为查找。

我有几个索引调到少数几个操作;包括仅包含ID和一些布尔字段的那些。这在很大程度上取得了很好的效果。

我遇到了一个问题,其中包含另一个字段的md5总和的字段上的“IN()”选择成为瓶颈;推迟顺序扫描并忽略其中包含md5总和的所有索引。

正常扫描需要45秒。关闭enable_seqscan需要几毫秒。

在玩了一下之后,我意识到这个索引会起作用:

CREATE INDEX speed_idx_YAY ON table( field_md5 );

但索引中的任何其他字段都会失败:

CREATE INDEX speed_idx_BOO ON table( field_md5 , field_other );

随着数据库的增长,从使用多列索引到顺序扫描的转变发生在“一夜之间”。有一段时间它有效,然后却没有。

有没有人有关于如何最好地为这种潜在情况做准备的提示?我的一部分很想为某些表上的每个索引字段创建单列索引作为备份。

引用:

1 个答案:

答案 0 :(得分:0)

您是否考虑过基于md5_field创建索引并包含其他字段

CREATE NONCLUSTERED INDEX IX_speed_idx
ON speed_idx (md5_field)
INCLUDE (field_a,field_b,field_c);