在设计数据库时,列排序是否有最佳实践?订购效果性能,空间还是ORM层?
我知道SQL Server - Does column order matter?。我正在寻找更一般的建议。
答案 0 :(得分:14)
我不相信列顺序必然会影响性能和空间。要提高性能,可以在表上创建索引,索引中定义的列的顺序将影响性能。
我已经看到表格的字段按字母顺序排列,以及“逻辑”排序(以对正在表示的数据有意义的方式)。总而言之,我可以看到两者都有好处,但我倾向于采用“逻辑”方法。
答案 1 :(得分:4)
在Oracle中,如果您的表具有多个NULLable列并且您将NULLable列放在列表的末尾,那么可以节省大量存储空间。行末尾的NULL值不占用空间。
e.g。想象一下这个表:(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完全省略。
通常这没什么区别,但是对于具有许多NULLable列的非常大的表,可以节省大量的资源 - 使用的空间更少可以转换为每个块更多的行,这意味着查询表所需的IO和CPU更少。
答案 2 :(得分:3)
我首先尝试使用最重要的列。通常,我始终将ID列保留为任何表中的第一列。然后,无论什么信息是重要的并经常更新,通常会随后更新,其余的可能会或可能不会经常更新。
我认为它不会影响性能,但是从开发人员的立场来看,更容易阅读前几个经常更新的列,而不是尝试在最后扫描那个字段的孔表。
答案 3 :(得分:3)
我认为答案是肯定的。
RDBMS服务器在内部为查询优化这些内容,因此我怀疑它并不重要。
答案 4 :(得分:3)
列顺序仅在复合索引中很重要
如果您的索引已打开(姓氏,名字),并且您始终搜索姓氏,那么即使您不包含名字,也可以继续使用
如果你的索引看起来像这样(名字,姓氏),你的where子句是
where lastname like 'smith%'
然后你必须扫描整个索引
答案 5 :(得分:1)
由于您要求实现细节而不是SQL标准,因此无法获得更多一般性建议。
不同的DBMS将以不同的方式实现这些目标。
然而,聪明的DBMS会实现内部结构,因此列排序不是重要的。
因此,我会命令我的专栏对人类读者来说是直观的。
答案 6 :(得分:1)
在设计数据库时,我可能会将最重要的列放在逻辑顺序中(例如idfield,firstname,middlename,lastname)。当您从长列列表中查找最需要的列时,它确实更容易看到它们。
但是我不会在稍后重新排列列以支持更合理的分组。