Sql Server int vs nvarchar性能比较?

Ray*_*Ray 9 sql-server performance database-design

对于你的数据库设计/性能专家.

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

当我用int列搜索时

where ID = 12324

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

where Key = 'my str'

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

mar*_*c_s 20

INT会更快 - 这就是为什么:

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

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

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

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


Rem*_*anu 9

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

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

  • +1:自然>人工键,但IME很少有自然键. (2认同)

Ode*_*ded 6

性能的主要问题是字段的大小 - 一个int是4个字节,而一个nvarchar(128)是254个字节.

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