Sql server Sql Server int与nvarchar在性能上的比较?

Sql server Sql Server int与nvarchar在性能上的比较?,sql-server,performance,database-design,Sql Server,Performance,Database Design,为您提供数据库设计/性能专家 我正在设计一个表,我可以选择对列使用int或nvarchar(128),假设空间不是问题。我的问题是,哪一个将提供性能 当我用int列搜索时 其中ID=12324 或者当我使用nvarchar列搜索时(键是整个值,所以我没有使用LIKE运算符) where Key='my str' 我确信对于较小的数据集来说这并不重要,但是让我们假设这些数据将有数百万行。这方面的主要性能问题是字段的大小-一个int是4字节,而一个nvarchar(128)将是254字节 所有这些都

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

我正在设计一个表,我可以选择对列使用int或nvarchar(128),假设空间不是问题。我的问题是,哪一个将提供性能

当我用int列搜索时

其中ID=12324

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

where Key='my str'


我确信对于较小的数据集来说这并不重要,但是让我们假设这些数据将有数百万行。

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

所有这些都需要由SQL server进行管理,因此管理
int
要比管理
nvarchar(128)

空间快得多,这在数据库中总是一个问题。键越宽意味着每页的条目越少,为聚合和求和值扫描的页面越多,意味着IO越多,性能越差。对于聚集索引,此问题将乘以每个非聚集索引,因为它们必须在叶中重新生成查找键(聚集键)。因此
nvarchar(128)
类型的键几乎总是比INT更糟糕


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

INT会更快-原因如下:

  • SQL Server将其数据和索引组织到8K的页面中
  • 如果你有一个带有INT键的索引页,你会得到大约2000个INT项
  • 如果您有NVARCHAR(128),并且平均使用20个字符,那么每个条目40个字节,或者大约每页200个条目
因此,对于相同数量的索引项,NVARCHAR(128)案例将使用十倍多的索引页

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


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

我会使用INT来提高性能(如果这将特别有连接的话),并在潜在的自然键上放置一个唯一的索引以保证数据完整性。

+1:natural>人工键,但在IME中很少有自然键。+1很好的一点。另外,让CPU处理整型而不是字符串的工作量要小一些。对于数百万行,这可能会导致不可忽略的差异。我很想看到一些真正的性能测试。