Postgresql
Postgresql 可以在計劃中利用“意外”集群嗎?
假設我有一個包含列
customer_id
(隨機生成的字元串)和的僅附加表x
,並且查找總是在customer_id
.假設數據如下所示,就好像我們在客戶最初註冊某項時獲得了一批行,然後再也沒有為該客戶註冊。
customer_id=XCVFY0001, x=... customer_id=XCVFY0001, x=... (continues for ~1 page with same customer_id) customer_id=HUMBN0001, x=... customer_id=HUMBN0001, x=... (continues for ~1 page with same customer_id) (and so on...)
因此,雖然
customer_id
的字母順序與物理行無關,但我們可以做出如下陳述:
- 每頁很少有不同的客戶 ID
- 每個 ID 有幾頁
- 有很長的“執行”ID,或者,如果您需要一個
customer_id
,您可能會在幾個連續的頁面上找到它- 就資訊論而言,我認為他們會說沒有相關性,但存在很高的“互資訊”
如果沒有明確執行,查詢規劃器可以在估計中使用這樣的資訊
CLUSTER
嗎?我假設如果correlation
報告中的低pg_stats
,它會猜測行在整個頁面中均勻分佈,並且可能對各種計劃持悲觀態度。(在我的現實世界模擬中,一個普通的非聚集索引無論如何都能讓事情變得又好又快,但是當我注意到數據中的模式時我只是好奇。)
規劃者不知道這種類型的分群,因此無法根據它做出決策。
ANALYZE 使用的兩步採樣方法在這種情況下會產生傾斜的樣本,可能導致對 n_distinct 的嚴重低估。如果不深入研究單個查詢的細節,就很難預測這可能會產生什麼後果。