在 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,感谢您的链接,但是,NVarchar
和 Varchar
执行相同吗?我的问题是针对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)