之前吐槽了很多年的統計信息自動更新閾值演算法(操蛋的500 + (0.20 * n)),其實早在SQLServer 2016中就有優化過了,一直沒有註意這個細節,汗顏!https://www.cnblogs.com/wy123/p/5790855.htmlhttps://www.cnblogs.com ...
之前吐槽了很多年的統計信息自動更新閾值演算法(操蛋的500 + (0.20 * n)),其實早在SQLServer 2016中就有優化過了,一直沒有註意這個細節,汗顏!
https://www.cnblogs.com/wy123/p/5790855.html
https://www.cnblogs.com/wy123/p/5875237.html
最顯著的變化,在SQLServer 2016之後,表行數大於500之後:MIN ( 500 + (0.20 * n), SQRT(1,000 * n) ),也即取原演算法和1000倍的二次方根的最小值,作為觸發閾值。
Table type | Table cardinality (n) | Recompilation threshold (# modifications) |
---|---|---|
Temporary | n < 6 |
6 |
Temporary | 6 <= n <= 500 |
500 |
Permanent | n <= 500 |
500 |
Temporary or permanent | n > 500 |
MIN ( 500 + (0.20 * n), SQRT(1,000 * n) ) |
根據上述演算法,可以發現,
1,演算法修改之前,觸發統計信息自動更新的值,是隨著表的行數的變化為一條嚴格的一次函數500 + (0.20 * n)
2,演算法修改之後,在表的行數超過200W之後,會採用SQRT(1,000 * n)這一新的演算法
3,演算法修改之後,統計信息自動更新閾值的演算法SQRT(1,000 * n)是一條隨著表的行數的變化,波動率較低的曲線,也就是意味著更傾向於在一個較小的變化之後觸發統計信息自動更新。
4,二次方根(SQRT)是一個非常有魔力的計算規則!!!
根據 500 + (0.20 * n),和SQRT(1,000 * n) 兩個公式計算出來觸發統計信息自動更新的閾值