在 NVarchar(50) 与 NVarchar(255) 列中使用索引?

Posted

技术标签:

【中文标题】在 NVarchar(50) 与 NVarchar(255) 列中使用索引?【英文标题】:Using indexes with NVarchar(50) vs. NVarchar(255) column? 【发布时间】:2014-02-14 02:57:27 【问题描述】:

我们有一个索引列 (ModelName),它在表中非常重要,与“目录编号”非常相似,但它不是 PK。

很多ORDER by ModelName ; WHERE ModelName 等,正在使用中。

该列最初以 NVarchar(50) 开头,但随着时间的推移将大小更改为 100,现在需要为 255。

我在"NVarchar(MAX) vs. NVarChar(N)"上找到了很多帖子,但我无法得到一个确定的答案:

使用NVarchar(255) 代替NVarchar(100) 代替NVarchar(50) 是否会对索引造成任何/显着的性能影响?

就性能而言,较短的列大小 (50) 是否比较长的 (255) 更好?是否可以对此类Index进行特殊设置以提高性能?


这是@a_horse_with_no_name 在 cmets 中提供的另一个参考:

Best practices for SQL varchar column length

注意 Ariel 的回答:https://***.com/a/8295195/1140885

上面写着:

"具体来说,在进行排序时,较大的列确实占用更多 空间,所以如果这会损害性能,那么你需要担心它 并让它们变小。”

,在 cmets 中:

“索引也有问题和限制需要考虑。你 当所有四列都是 VARCHAR(255) 时,不能有 (a,b,c,d) 索引"

没有明确的结论/参考文档等

【问题讨论】:

nvarchar(42)nvarchar(255)nvarchar(639) 在性能方面没有区别。另请参阅:***.com/q/8295131/330315 @a_horse_with_no_name,感谢您的链接,但是,NVarcharVarchar 执行相同吗?我的问题是针对NVarchar @a_horse_with_no_name,此外,您提供的问题/答案(非常有趣 +1)根本没有解决索引问题。就在 cmets 中,它建议 "there are issues and limitations on indexes to consider, too. You can't have a (a,b,c,d) index when all four columns are VARCHAR(255)""Specifically, when doing sorting, larger column do take up more space"... 只有在列中存储了更多数据时,索引才会受到影响。如果varchar(10)varchar(100) 列上的索引存储相同的数据,则它的索引将相同。您应该看到 varchar/nvarchar 列的长度限制更像是一种约束,而不是技术配置。 @a_horse_with_no_name: 但在 nvarchar(639) 列上,您将无法创建索引,因为最大值。该列的大小大于索引条目的 900 字节 限制。只是说。 ... :-) 【参考方案1】:

在可变长度数据类型上,如果您继续累积数据,索引将受到影响。大小越大,B-Tree 中组合的机会就越多,有效地增加了索引大小。在某些时候,索引大小会太大,查询会受到影响。另一方面,如果您将所有类似的数据集作为 ModelName 输入,则不会有太大问题

如果模型名称像 AAABB、AAABC、AAACC 等,它不会影响您的性能,但彼此之间的标准差会变高,由于庞大的规模,索引性能会很差

【讨论】:

以上是关于在 NVarchar(50) 与 NVarchar(255) 列中使用索引?的主要内容,如果未能解决你的问题,请参考以下文章

如何将列从 nvarchar(max) 更改为 nvarchar(50)

在 SQL CE 4.0 中将 nvarchar(50) 列转换为日期时间

sql 多条记录插入

国家省市区域数据导入

SQL导入TXT

SQL Server 2005 会因为我使用 nvarchar(50) 而不是整数作为主键而惩罚我吗?