SQL Server VARCHAR 列寬
在網上搜尋時,我發現在指定過寬的
VARCHAR
列時是否會對性能產生影響的建議相互矛盾,例如VARCHAR(255)
,何時VARCHAR(30)
可能會這樣做。我一致認為,如果整行超過 8060 字節,則會影響性能。除此之外,我看到了分歧。
聲稱預設為
SET ANSI PADDING ON
= 大量尾隨空格的可能性是否正確?只要總行寬小於 8060,是否存在過大VARCHAR
列的實際性能問題?證明列寬很重要的證據
CHAR 和 VARCHAR 數據類型也是如此。不要在您需要的字元列中指定更多字元。
https://www.sql-server-performance.com/w2k-filesystem-affects-performance/
- 長度是對數據的約束(如 CHECK、FK、NULL 等)
- 行超過 8060 字節時的性能
- 不能有唯一約束或索引(鍵列寬度必須 < 900)
- 預設值為
SET ANSI PADDING ON
= 大量尾隨空格的可能性列寬無關緊要的證據
如果您談論的是 varchar 和 nvarchar 則不,允許更高的欄位長度不會受到任何懲罰。
https://stackoverflow.com/questions/7025996/overstating-field-size-in-database-design
相比之下,varchar 數據類型僅消耗實際使用的空間量加上 2 個字節的成本
http://sqlfool.com/content/PerformanceConsiderationsOfDataTypes.pdf
這個問題可能更好地表述為:
“過度指定可變長度列的最大長度有什麼好處?”
一般來說,幾乎沒有優勢,並且各種連結的答案指出了幾個缺點。除了任何其他問題之外,請考慮 SQL Server 不是開源的:根據提供給系統的資訊應用了許多“幻數”和啟發式方法。如果沒有原始碼訪問權限,我們永遠無法完全確定這種做法的影響可能是什麼。
在某些情況下,當列的平均長度明顯高於 SQL Server 在計算排序/散列記憶體授予時假定的 50% 時,您可能會看到通過過度指定最大長度來提高性能。這是一個可疑的解決方法,並且可能只應通過顯式
CAST
或CONVERT
(帶有註釋!)而不是更改基本列定義來應用。有時,最好重寫查詢以排序鍵而不是整行。在最大行大小可能超過行內限制的情況下(即使實際上沒有行),如果存在觸發器,刪除行可能會導致意外的頁面拆分。更新也可能通過相同的機制導致碎片化。
SQL Server 在大多數情況下都做得很好,因為它提供了來自元數據的良好、準確的資訊。為了“方便”而妥協這一原則對我來說似乎是不明智的。一個明智的做法是根據要儲存的實際數據以及任何可預見的變化選擇一個合理的最大長度值。