Sql Server int vs nvarchar性能比较?

时间:2010-07-19 19:25:09

标签: sql-server performance database-design

为您提供数据库设计/性能专家。

我正在设计一个表,我可以选择使用int或nvarchar(128)作为列,假设空间不是问题。我的问题是哪个会带来性能

当我用int列搜索时

where ID = 12324

或者当我用nvarchar列搜索时(Key是整个值,所以我没有使用LIKE运算符)

where Key = 'my str'

我确信对于较小的数据集并不重要,但我们假设这些数据将在数百万行中。

4 个答案:

答案 0 :(得分:20)

INT会更快 - 这就是原因:

  • SQL Server将其数据和索引组织为8K
  • 的页面
  • 如果您的索引页面上有INT键,则会得到大约2'000个INT条目
  • 如果您有NVARCHAR(128)且平均使用20个字符,即每个条目40个字节,或每页大约200个条目

因此,对于相同数量的索引条目,NVARCHAR(128)情况下将使用十倍的索引页。

加载和搜索这些索引页面将导致更多的I / O操作。

所以简而言之:如果可以,请始终使用INT。

答案 1 :(得分:9)

空间总是数据库中的问题。更宽的键意味着每页的条目更少,扫描更多页面以聚合和求和值,意味着更多的IO,更低的性能。对于聚簇索引,此问题会被每个非聚集索引乘以,因为它们必须在其叶子中重现查找键(聚簇键)。因此,nvarchar(128)类型的键几乎总是比INT差。

另一方面,如果不合适,请不要使用INT密钥。始终使用适当的密钥考虑您的查询。如果您总是要通过nvarchar(128)列值进行查询,那么可能是一个好的聚簇候选键。如果你要通过nvarchar(128)密钥聚合,那么可能是一个好的聚类密钥候选者。

答案 2 :(得分:6)

与此相关的性能的主要问题是字段的大小 - int是4个字节,而nvarchar(128)将是254个字节。

所有这些都需要由SQL服务器管理,因此管理int将比nvarchar(128)快得多。

答案 3 :(得分:0)

我会将int用于性能(如果这将特别具有连接)并在数据完整性的潜在自然键上放置一个唯一索引。