哪個索引對postgresql 9.3中integer類型的外鍵執行效果更好?我應該在postgresql 9.3中使用散列或btree作爲外鍵索引嗎?
我會假設一個哈希索引,因爲外鍵comparisson總是與=
作出或做了B樹用於JOINS外鍵的時候一樣快的比較結果爲哈希?
因爲在postgresql主鍵使用btree的,這將暗示他們也更好的外鍵。
哪個索引對postgresql 9.3中integer類型的外鍵執行效果更好?我應該在postgresql 9.3中使用散列或btree作爲外鍵索引嗎?
我會假設一個哈希索引,因爲外鍵comparisson總是與=
作出或做了B樹用於JOINS外鍵的時候一樣快的比較結果爲哈希?
因爲在postgresql主鍵使用btree的,這將暗示他們也更好的外鍵。
從manual:
注意散列索引操作目前未WAL-記錄,所以哈希 索引可能需要一個數據庫崩潰 如果有不成文的變化之後用REINDEX重建。此外,在初始 基本備份之後,對流式傳輸或基於文件的複製進行的散列索引更改不是 ,因此它們給後續 使用它們的查詢提供了錯誤的答案。由於這些原因,目前不推薦使用散列索引。
也沒有證據表明散列索引比btree具有任何性能優勢。
很奇怪。你會認爲一個散列索引會快得多,但是很多基準測試表明它最多隻會稍快一點。對於典型的內存數據結構(例如Java的'HashMap' vs'TreeMap'),Hash比基於樹的快得多。任何它在Postgres中速度慢的原因,還是僅僅因爲Postgres的哈希索引實現沒有得到很好的維護? – sudo 2016-06-16 00:32:55
您能解釋一下外鍵是如何在內部創建的嗎?當我創建約束時運行iostat時,沒有寫入磁盤,而是讀取了很多內容。對於單線程PostgreSQL系統,創建外鍵的過程非常I/O(讀取)和CPU密集型。
忘記存在散列索引。使用B樹。總是。我們認爲每個版本都只是刪除散列索引,但有幾個角落案例和升級問題讓他們生存下來。 – 2014-10-10 16:17:31