如果某些数据少于 4000 个字符,nvarchar(max) 如何在数据库中存储数据会很快吗?

Lea*_*ing 8 sql-server-2008 c#

我必须开发一个 CMS,它将支持两种语言英语,阿拉伯语。这个 CMS 将是一种文章发布站点。在设计和分析时,我发现有些文章的长度超过 8000 个字符。我的表有一些列

PageID int,
PageTitleEnglish nvarchar(200),
PageTitleArabic nvarchar(200),
PageDescEnglish nvarchar(500),
PageDescArabic nvarchar(500),
PageBodyEnglish nvarchar(max)
PageBodyArabic nvarchar(max)
Run Code Online (Sandbox Code Playgroud)

如果我将 PageBody 保留为nvarchar(4000),那么我限制为 4000 个字符,如果我必须存储阿拉伯语版本,那么我需要 16000 个字节(因为阿拉伯语是 Unicode,比 ASCII 多 3 倍的空间)。

所以我只剩下将PageBody定义为 nVarchar(max) 的选项,从性能的角度来看,这将是不利的。我的实际问题是,如果 PageBody 列中的某些数据少于 4000 个字符,MS SQL Store 会比内联列中的数据或单独在数据库中的数据存储。

我也在谷歌上寻找过这个,但没有找到任何相关的答案以及在这种情况下我如何提高性能。

欢迎对这种多语言 CMS 设计的最佳实践提出任何建议。

我只需要支持两种语言阿拉伯语和英语

gbn*_*gbn 9

如果nvarchar(max)值足够短,值将被存储行内”。

可以使用sp_tableoption、“行外大值类型”选项修改默认行为。我不会打扰。数据库引擎将自己有效地管理它。

至于设计,根据您的模型,有几种方法可以做到这一点:

  • 你会总是同时使用英语和阿拉伯语吗?
  • 可以选一个吗?如果是这样,是否总是强制性的?
  • 您希望以后有更多语言吗?

1.单独的表

也就是说,您可以将不同的语言拆分到不同的表中。
这允许表级排序规则而不是列级排序规则

它允许每页允许更多行和更多的行内 LOB 存储机会

页面父级

  • PageID int,
  • 页面其他信息...

PageEnglish(注意 varchar 在这里可能没问题)

  • PageID int,
  • PageTitleEnglish varchar(200),
  • PageDesc英文varchar(500),
  • PageBodyEnglish varchar(max)

页面阿拉伯语

  • PageID int,
  • PageTitleArabic nvarchar(200),
  • PageDescArabic nvarchar(500),
  • PageBodyArabic nvarchar(max)

2. 分隔行

或者有一个 languageID 列来支持多种语言。
这有一个缺点,即所有语言的排序规则都是固定的,这意味着排序/过滤不佳

页面父级

  • PageID int,
  • 页面其他信息..

  • PageID int,
  • 语言代码,
  • PageTitle nvarchar(200),
  • PageDesc nvarchar(500),
  • PageBody nvarchar(max)


小智 5

  • MS SQL Server 的固定页大小为 8KB。
  • 一行永远不会拆分为多个页面,但多个行可以共享一个页面。
  • 然而,nvarchar(max) 和其他 BLOB 数据可能存储在行/页之外。

这意味着要使所有内容都适合一行,所有大小的总和必须小于 8K。如果没有,SQL Server 会将 BLOB 存储在行/页之外。

数据量如此之大,真的会导致性能问题吗?

作为另一种选择,您也许可以更改数据库结构,为英语和阿拉伯语页面提供单独的行,并改为包含语言代码列。然后,您不必将英语和阿拉伯语文本放在同一行中,这在获取数据时也有意义,因为您可能不需要同时获取英语和阿拉伯语。