2016-10-08 22 views
0

更好的性能(在读)我有130万行为INT型比SMALLINT

smallint(索引)列此表,当我乳宁非常简单的查询:

select * from table where field = x order by id limit 100 

有时(当我用不同的值更改x时)查询非常慢(有时10-20秒)。

然后,我用int类型更改了此列,并且还在此列上创建了索引。

现在,相同的查询比以前快得多,几乎总是要花不超过1秒。

所以,smallint占用磁盘空间较少,但在int类型上读取,性能要好得多。

是吗?如果是这样,为什么?

+0

你可以发布一个可重复的测试用例,所以我可以试试吗? –

回答

0

原因可能是数据歪斜或陈旧的索引统计。

首先是价值的分配。如果列中只有少数值,Postgres足够聪明,不会使用索引。所以,这取决于指数的选择性。

如果索引统计信息需要更新,会发生同样的情况。

数据类型的差异不太可能导致这种情况。更有可能的是,创建的新索引具有最新的统计数据。

+0

字段中有大约5000个唯一值。对于这两种情况,有时使用索引,有时不使用索引,但“int”类型比“smallint”快得多。此外,我刷新旧的(smallint)索引(删除和重新创建),但无论如何,有些查询对于smallint类型仍然很慢 – RIKI

+0

索引大小和可能的值对齐的差异可能会导致性能差异。但它不会导致数量级的变化,其中较慢的版本需要几秒钟。真正的问题是索引是否被使用。 –