C-Sharp

如果某些數據少於 4000 個字元,nvarchar(max) 將如何在數據庫中儲存數據會很快嗎?

  • December 30, 2011

我必須開發一個支持兩種語言英語、阿拉伯語的 CMS。該 CMS 將是一種文章發佈網站。在設計和分析時,我發現有些文章的長度超過 8000 個字元。我的表有一些列

PageID int,
PageTitleEnglish nvarchar(200),
PageTitleArabic nvarchar(200),
PageDescEnglish nvarchar(500),
PageDescArabic nvarchar(500),
PageBodyEnglish nvarchar(max)
PageBodyArabic nvarchar(max)

如果我將 PageBody 保留為nvarchar(4000),那麼 ia 限制為 4000 個字元,如果我必須儲存阿拉伯語版本,那麼我需要 16000 個字節(因為阿拉伯語是 Unicode 並且佔用的空間比 ASCII 多 3 倍)。

所以我只剩下將**PageBody 定義為 nVarchar(max)**的選項,從性能的角度來看,這會帶來不利影響。我的實際問題是,如果 PageBody 列中的某些數據少於 4000 個字元,MS SQL 會比 inline 列中的數據儲存還是單獨儲存在數據庫中。

我也在Google上尋找了這個,但沒有找到任何相關的答案以及在這種情況下我如何提高性能。

歡迎對多語言 CMS 設計的最佳實踐提出任何建議。

我只需要支持阿拉伯語和英語兩種語言

如果一個值足夠短,nvarchar(max)它將被儲存在“行內”。

可以使用sp_tableoption修改預設行為,“行外的大值類型”選項。我不會打擾。數據庫引擎將自行有效地管理這一點。

至於設計,根據您的模型,有幾種方法可以做到這一點:

  • 你會一直同時使用英語和阿拉伯語嗎?
  • 一個可以是可選的嗎?如果是這樣,是否總是強制性的?
  • 你期待以後有更多的語言嗎?

1. 分開表格

也就是說,您可以將不同的語言拆分到不同的表中。
這允許表級排序規則而不是列級排序規則

它允許每頁允許更多的行和更多的行內 LOB 儲存機會

頁面父級

  • PageID int,
  • 頁面其他資訊…

PageEnglish(注意 varchar 在這裡可能沒問題)

  • PageID int,
  • PageTitleEnglish varchar (200),
  • PageDescEnglish varchar(500),
  • PageBodyEnglish varchar(max)

PageArabic

  • PageID int,
  • PageTitleArabic nvarchar(200),
  • PageDesc阿拉伯語 nvarchar(500),
  • PageBodyArabic nvarchar(最大)

2. 單獨的行

或者有一個 languageID 列來支持多種語言。
這有一個缺點,即所有語言的排序規則都是固定的,這意味著排序/過濾效果不佳

頁面父級

  • PageID int,
  • 頁面其他資訊..

  • PageID int,
  • 語言程式碼,
  • PageTitle nvarchar (200),
  • PageDesc nvarchar(500),
  • PageBody nvarchar(最大)

引用自:https://dba.stackexchange.com/questions/9953