2016-10-08 20 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

索引大小和可能的值對齊的差異可能會導致性能差異。但它不會導致數量級的變化,其中較慢的版本需要幾秒鐘。真正的問題是索引是否被使用。 –