如果我在SQL Server数据库上使用nvarchar(n)列作为聚簇索引,那么与数字(int)索引相比,我是否会遭受重大的性能损失?另外,复合指数的表现如何比较?
答案 0 :(得分:8)
Sql并不关心你的索引是否是数字,但是你需要考虑一些事情,具体取决于列中的内容以及你如何使用该表。
通常,您希望保持索引尽可能小,因此nvarchar(4000)(最多8000字节)确实很糟糕,但varchar(3)(最多3个字节)将小于int(4个字节)。您还希望(在可能的情况下)将索引插入插入到索引的末尾,这样可以防止索引碎片化并导致性能问题。
如果针对表运行的查询仅包含索引中的列,则复合索引可以极大地提高性能。这意味着当索引满足查询时,甚至都不会触及实际的表。
请参阅Sql server index basics以获取有关索引的概述。
如果您提供有关表格本身以及如何使用它的更多具体细节,可能会更有帮助?
答案 1 :(得分:2)
科林,
nvarchar使用varchar列的两倍空间。如果nvarchar列是表上唯一的索引,则命中可能不会那么多,但如果您在该表上也有非聚集索引,那么是,您将获得性能损失。这是因为聚簇索引也包含在非聚簇索引的所有行中,并且非聚簇索引将非常宽。另一方面,int列只占用4个字节,并且有一个很大的范围来存储从-2,147,483,648到2,147,483,647的值,并且往往很窄。对于4个字节,nvarchar列只能存储varchar(2)使用的空间,因为它使用varchar列的两倍空间。你看到你浪费了多少空间吗?
答案 2 :(得分:1)
几乎肯定是的。
窄,数字和严格单调是一个很好的聚类键。 nvarchar不是这些。
每个非聚集索引条目都引用聚簇索引,因此您也会使NC索引膨胀。
这是在整理/比较问题之前。
答案 3 :(得分:0)
我认为这也取决于你桌子的大小。对于较小的表我怀疑你会注意到差异,但对于较大的表,比如100万行甚至更多,你可能会看到nvarchar略微减速。我要说它还取决于该字段实际包含的内容......即,它们是否是电子邮件等。
答案 4 :(得分:0)
在谈论索引时,您必须将“性能”分为两个主题。
在插入,更新和删除时,索引会降低数据库速度 - 使用聚簇索引比非聚集索引更多,因为它可能必须在底层数据存储中移动数据。在这里,我同意John的观点,即顺序int将比nvarchar表现更好。
但是如果你需要查询nvarchar字段,那么这个字段上的聚簇索引会做更多的事情来加速你的读取。
因此,您的问题的答案实际上取决于您是否担心插入或读取的性能。