【问题标题】:Is it worth the trouble to use tinyint instead of int for SqlServer lookup tables?为 SqlServer 查找表使用 tinyint 而不是 int 值得麻烦吗?
【发布时间】:2008-11-19 20:06:29
【问题描述】:

在 SqlServer 2005 中设计查找表(枚举)时,如果您知道条目数永远不会很高,是否应该使用 tinyint 而不是 int?我最关心的是性能,尤其是索引的效率。

假设您有这些代表性表格:

Person
------
PersonId int  (PK)
PersonTypeId tinyint  (FK to PersonTypes)

PersonTypes
-----------
PersonTypeId tinyint
PersonTypeName varchar(50)

显而易见的因素是数据大小和编码麻烦。当我们在 person 表中达到 1 亿行时,与 int 相比,使用 tinyint 存储的字节数减少了 3 亿字节,再加上索引占用的空间。不是大量的数据,但如果将设计决策应用于数十个大表,则意义重大。当然,编码麻烦来自 ASP.NET C#/VB 代码中的所有这些转换问题。

如果我们抛开这两个问题,还有什么可以发挥作用?由于索引页的大小减小,查询会更有效吗?或者是否有某种填充会抵消好处?还有其他问题吗?

我个人一直只使用 int,但我正在考虑使用 tinyint 来对一些大型表进行重新设计/迁移,所以我很想得到一些建议。

[编辑]

在对此进行试验后,我预料到的编码麻烦被证明不是问题。从 int 更改为 tinyint 根本没有导致任何转换问题。

【问题讨论】:

    标签: sql sql-server database-design


    【解决方案1】:

    表(或索引节点条目)越窄,单个 IO 页面上可以容纳的记录(或索引节点)就越多,任何查询所需的物理(和逻辑)读取 IO 操作就越少。此外,单个页面上的索引节点越多,索引中可能存在的级别越少,从根级别到叶级别,如果通过使表更窄,您通过了索引可以小一级的阈值,这可以对性能产生巨大影响。

    如果通过切换到 TinyInt,您将表从 200 字节宽更改为 197 字节宽,它可能不会有任何区别...但是如果您将其从 20 字节更改为 14,(假设您有 2 个整数那里),那么它可能是戏剧性的......

    【讨论】:

    • 据我估计,对于我想到的主要表格之一,效果将是 88 -> 70。
    • 那么可能没什么大不了...不知道您使用的是哪个数据库,但在 SQL Server 上,IO 页面为 8K,因此对于表扫描/搜索,您将从 93每页 117 条记录...索引呢?这些 int 列是否在您的索引中?它可能在那里产生更大的影响。
    • 是的,该表有十几个索引,并且大量用于 OLTP。磁盘上的索引大小是数据大小的 10 倍。这些列实际上来自一个单独的表,被非规范化以减少所需的连接数量。几乎所有索引都将被修改以包含这些新字段。
    • 那么,如果索引只有一个或两个这样的字段,并且你将它们从 int(4 字节)更改为 TinyInt(1 字节),那么索引大小将减少近三倍并增加每个 IO Page 的索引节点数
    【解决方案2】:

    内存 101:更小的东西意味着一次在 RAM 中保存更多,因此硬盘读取更少。如果数据库足够大并且您正在运行某些类型的查询,这可能是一个非常严重的因素。但这可能不会有太大的不同。

    【讨论】:

    • 除了大多数时候,任何小于 int 的东西都会在内存中扩展为 int - 如果不是,接下来的项目将被对齐以浪费你的 2 个字节无论如何都要保存。
    【解决方案3】:

    还有其他问题吗?

    我不确定这是否是您所说的那种“陷阱”,但我遇到过使用 datetime 而不是 smalldatetime 会产生不正确的功能行为的情况,因为精度较低的 smalldatetime 没有比较为相当于两个“相同”日期的更高精度日期时间。

    这里不可能发生这种情况,因为对于相同的整数值,tinyint / smallint / int / bigint 都会比较为相同。因此,您显然在这一点上是安全的,而不是它完全回答了您的问题。

    【讨论】:

      【解决方案4】:

      我怀疑使用 smallint 而不是 int 会带来很多性能优势,除非在极少数情况下。不过,您可以轻松地为此构建一个测试应用程序,创建一些测试表并执行一百万次插入/更新/选择并比较性能。

      【讨论】:

        【解决方案5】:

        还有维护索引/磁盘备份/磁带备份的因素也会占用空间,但我想说最重要的是IO和内存性能。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-02-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-07-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多