AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 9953
Accepted
Learning
Learning
Asked: 2011-12-31 02:46:03 +0800 CST2011-12-31 02:46:03 +0800 CST 2011-12-31 02:46:03 +0800 CST

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

  • 772

我必须开发一个支持两种语言英语、阿拉伯语的 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 列中的数据存储还是单独存储在数据库中。

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

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

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

sql-server-2008 c#
  • 2 2 个回答
  • 3423 Views

2 个回答

  • Voted
  1. Best Answer
    gbn
    2011-12-31T02:50:51+08:002011-12-31T02:50:51+08:00

    如果一个值足够短,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(最大)
    • 10
  2. Arjan Einbu
    2011-12-31T03:05:06+08:002011-12-31T03:05:06+08:00
    • MS SQL Server 的页面大小固定为 8KB。
    • 一行永远不会拆分为多个页面,但几行可以共享一个页面。
    • 但是,nvarchar(max) 和其他 BLOB 数据可能存储在行/页之外。

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

    数据量是否如此之大以至于这真的会导致性能问题?

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

    • 4

相关问题

  • 连接不同地理区域的数据库的最佳实践

  • 死锁的主要原因是什么,可以预防吗?

  • 我在索引上放了多少“填充”?

  • 是否有开发人员遵循数据库更改的“最佳实践”类型流程?

  • 从 SQL Server 2008 降级到 2005

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    您如何显示在 Oracle 数据库上执行的 SQL?

    • 2 个回答
  • Marko Smith

    如何选择每组的第一行?

    • 6 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    我可以查看在 SQL Server 数据库上运行的历史查询吗?

    • 6 个回答
  • Marko Smith

    如何在 PostgreSQL 中使用 currval() 来获取最后插入的 id?

    • 10 个回答
  • Marko Smith

    如何在 Mac OS X 上运行 psql?

    • 11 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Marko Smith

    将数组参数传递给存储过程

    • 12 个回答
  • Martin Hope
    Manuel Leduc PostgreSQL 多列唯一约束和 NULL 值 2011-12-28 01:10:21 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Stuart Blackler 什么时候应该将主键声明为非聚集的? 2011-11-11 13:31:59 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    BrunoLM Guid vs INT - 哪个更好作为主键? 2011-01-05 23:46:34 +0800 CST
  • Martin Hope
    bernd_k 什么时候应该使用唯一约束而不是唯一索引? 2011-01-05 02:32:27 +0800 CST
  • Martin Hope
    Patrick 如何优化大型数据库的 mysqldump? 2011-01-04 13:13:48 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve