【问题标题】:Sql Server int vs nvarchar comparison on performance?Sql Server int 与 nvarchar 的性能比较?
【发布时间】:2011-03-18 02:12:03
【问题描述】:

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

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

当我用 int 列搜索时

where ID = 12324

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

where Key = 'my str'

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

【问题讨论】:

    标签: sql-server performance database-design


    【解决方案1】:

    INT 会更快 - 原因如下:

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

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • +1:自然 > 人工键,但自然键 IME 很少。
      【解决方案3】:

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

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

      【讨论】:

      • +1 好点。此外,让 CPU 处理 int 而不是字符串的工作要少一些。对于数百万行,这可能会导致不可忽视的差异。我很想看看对此进行一些真正的性能测试。
      【解决方案4】:

      我会使用 int 来提高性能(如果这尤其需要连接),并在潜在的自然键上放置一个唯一索引以确保数据完整性。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-12
        • 2010-12-04
        • 1970-01-01
        • 2012-04-29
        • 2020-11-03
        • 1970-01-01
        相关资源
        最近更新 更多