SQL Server有三種類型的存儲:行內LOB和行溢出,請參閱Table and Index Organization。行內存儲是訪問速度最快的。 LOB和Row-Overflow彼此相似,都比行中稍慢。
如果您有一列NVARCHAR(4000),它將被存儲在行中(如果可能),如果不存在,它將存儲在行溢出存儲中。擁有這樣一個列並不意味着未來的性能問題,但它引發了一個問題:爲什麼nvarchar(4000)?您的數據可能總是接近4000個字符?它可以是4001,在這種情況下你的應用程序將如何處理它?爲什麼不用nvarchar(max)?你是否測量過性能,發現nvarchar(max)對你來說太慢了?
我的建議是要麼使用一個小的nvarchar長度,適合真實的數據,要麼nvarchar(max)如果預計很大。 nvarchar(4000)聞起來像不合理,未經過測試的過早優化。
更新
對於XML,使用XML data type。它比varchar或nvarchar具有許多優點,例如它支持XML indexes,它支持XML methods,並且可以實際驗證XML是否符合特定模式或至少符合格式良好的XML合規性。
XML將存儲在行外的LOB存儲中。
即使數據不是XML,我仍會推薦長度爲1500的LOB存儲(nvarchar(max))。與檢索LOB存儲數據相關的成本,但成本超過通過將表縮小爲來補償。表格行的寬度是性能的主要因素,因爲更寬的表格適合每頁更少的行,所以任何必須掃描一行或整個表格的操作都需要將更多頁面存取到內存中,並且這會顯示在查詢成本(實際上是,驅動因素的總成本)。一個LOB存儲的列只擴展了行的大小,如果我沒有記錯的話,這個行的寬度是'page id',如果我沒有記錯的話,這個寬度是8個字節,所以你可以得到每頁更好的行密度,因此查詢速度更快。
我正在使用2k5。我不需要nvarchar,但我認爲nvarchar總是會比varchar更好。對不起,我沒有很好的SQL經驗。 謝謝 – burnt1ce 2009-10-26 20:24:25
啊,沒關係。是的,我可以使用varchar - 這個應用程序不需要支持多種語言 – burnt1ce 2009-10-26 20:26:55
沒問題,你只需要nvarchar,如果你打算支持多lang應用程序(unicode支持)。否則varchar應該是你的正確選擇。 – JonH 2009-10-27 11:54:48