【问题标题】:Is there a best practice to database column ordering?数据库列排序是否有最佳实践?
【发布时间】:2010-10-20 20:40:33
【问题描述】:

在设计数据库时,是否有列排序的最佳实践?排序会影响性能、空间还是 ORM 层?

我知道SQL Server - Does column order matter?。我正在寻找更一般的建议。

【问题讨论】:

标签: database database-design


【解决方案1】:

我尝试首先坚持最重要的列。通常我总是将我的 ID 列作为任何表中的第一个列。然后是重要且经常更新的信息通常紧随其后,其余的可能会或可能不会经常更新。

我认为这不会影响性能,但从开发人员的角度来看,阅读前几列会经常更新比尝试扫描最后一个字段的孔表更容易。

【讨论】:

    【解决方案2】:

    我认为列顺序不一定会影响性能或空间。为了提高性能,您可以在表上创建索引,索引中定义的列的顺序会影响性能。

    我已经看到表格的字段按字母顺序排列,以及“按逻辑”排列(以一种对所表示的数据有意义的方式)。总而言之,我可以看到两者的好处,但我倾向于采用“逻辑”方法。

    【讨论】:

      【解决方案3】:

      我认为答案是否定的。

      RDBMS 服务器在内部为查询优化这些类型的东西,所以我怀疑这并不重要。

      【讨论】:

      • 同意。我唯一能想到定义列顺序的地方是当您在不指定列名的情况下编写 INSERT 时,这本身就是一种不好的做法。
      【解决方案4】:

      列顺序只在复合索引中很重要

      如果您的索引已打开(姓氏,名字)并且您总是搜索姓氏,那么即使您不包含名字也可以继续搜索

      如果你的索引看起来像这样 (Firstname, Lastname) 并且你的 where 子句是

      where lastname like 'smith%'
      

      那么你必须扫描整个索引

      【讨论】:

        【解决方案5】:

        因为您要求的是实现细节而不是 SQL 标准,所以实际上并没有更一般的建议。

        不同的 DBMS 会以不同的方式实现这些东西。

        但是,一个聪明的 DBMS 会实现内部结构,这样列顺序就不会产生影响。

        因此,我希望我的专栏对人类读者来说是直观的。

        【讨论】:

          【解决方案6】:

          在设计数据库时,我可能会将最重要的列按逻辑顺序放在首位(例如,idfield、firstname、middlename、lastname)。当您从长列列表中查找最需要的列时,确实可以更轻松地查看它们。

          但是,我以后不会重新排列这些列以支持更合乎逻辑的分组。

          【讨论】:

            【解决方案7】:

            在 Oracle 中,如果您的表有许多 NULLable 列并且您将 NULLable 列放在列表的末尾,则可以显着节省存储空间。行尾的 NULL 值不占用空间。

            例如想象一下这张桌子:(id NOT NULL, name VARCHAR2(100), surname VARCHAR2(100), blah VARCHAR2(100, date_created DATE NOT NULL)

            (100, NULL, NULL, NULL, '10-JAN-2000') 行需要存储值 100,三个 NULL 需要一些空间,然后是日期。

            或者,同一张表但顺序不同:(id NOT NULL, date_created DATE NOT NULL, name VARCHAR2(100), surname VARCHAR2(100), blah VARCHAR2(100))

            (100, '10-JAN-2000', NULL, NULL, NULL) 行只需要存储值 100 和日期 - 尾随 NULL 被完全省略。

            通常这几乎没有什么区别,但对于具有许多可空列的非常大的表,可以节省大量空间 - 使用的空间越少,每个块的行数就越多,这意味着查询表所需的 IO 和 CPU 更少。

            【讨论】:

            • 我认为表技巧末尾的空值节省的空间适用于很多数据库。至少 SQL Server 提到了它作为我在我的问题中链接到的问题的答案。
            猜你喜欢
            • 2022-06-15
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-09-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多