1

它会影响将所有主键列放在表的开头吗?

我知道部分索引读取很可能涉及将整行带入缓冲池以进行谓词匹配的表扫描。我很想知道在表顶部具有主键的任何性能提升会提供。

4

4 回答 4

4

在 Oracle 中,表的列顺序通常对性能几乎没有影响

原因是行的所有列通常包含在单个块中,并且与查找/读取块相比,查找块中行的第一列和最后一列之间的时间差异是无限小的。

此外,当您到达数据库块读取一行时,主键可能不是最重要的列。

以下是列顺序可能会产生影响的一些例外情况:

  • 当您的表中有 > 255 列时,这些行将分成两个块(或更多块)。访问前 255 列可能比访问其余列便宜。
  • 一行的最后一列如果是 则占用 0 字节空间NULL。因此,NULL如果可能,最好将包含许多值的列放在行尾,以减少空间使用,从而减少 IO。一般来说,影响很小,因为其他 NULL 列每个占用 1 个字节,因此节省的空间很小。
  • 启用压缩时,压缩效率可能取决于列顺序。一个好的经验法则是应该对具有很少不同值的列进行分组,以提高它们被压缩算法合并的机会。
  • 当您将索引组织表(IOT) 与溢出子句一起使用时,您应该考虑列的顺序。使用此子句,确定的分隔列之后的所有列都将被存储在行外,访问它们将产生额外的成本。主键始终物理存储在 IOT 中行的开头。
于 2013-02-20T16:28:55.203 回答
0

至少在 SQL Server 中,基于表中列的顺序(主键与否)没有性能优势。将主键列放在列表顶部的唯一好处是有组织性。有点像有一个包含这些列 Id、FirstName、LastName、Address1、Address2、City、State、Zip 的表。与 Address2、State、Firstname、Id、Address1、Lastname、Zip、City 相比,按此顺序进行操作要容易得多。我对 Oracle 或 DB2 了解不多,但我相信它们是一样的。

于 2013-02-20T16:26:57.750 回答
0

在 DB2 中,(我认为关于其他数据库管理器系统的答案应该检查答案)修改较少的列应该位于每行的开头,因为在执行更新时,它需要从第一个修改的列到结尾行,将其写入事务日志中。

它只影响更新操作,插入、删除或选择没有问题。其影响是 IO 减少了一点,因为如果只需要写入最后一列,则应该写入的信息更少。当对具有大量记录的大行表上的几个小列执行更新时,这可能很重要。如果修改了第一列,DB2 将写入整行。

排序列以最小化更新日志记录:http: //publib.boulder.ibm.com/infocenter/db2luw/v9r7/topic/com.ibm.db2.luw.admin.dbobj.doc/doc/c0024496.html

于 2013-02-20T20:30:55.447 回答
0

(对于 ORACLE)那么公平地说,任何和所有主键列,即使只有 1,也应该是第一列或在一行中的前几列中。此外,在行的末尾标记它们是不好的做法,尤其是在一系列可能/可能为空的属性字段之后?

因此,像这样的一行:

pkcol(s)、att1、att2、att3、varchar2(2000)

由于上述所有原因,组织得更好

att1, att2, att3, varchar2(2000), pkcol(s)

我为什么要问?好吧,不要判断,但我们正在简化一些表的 PK,开发人员很高兴将新的 GUID pk(不要判断 #2)标记到行的末尾。我对此感到困扰,但需要一些反馈来证明我的恐惧。这对 SQL Server 也有影响吗?

于 2015-04-22T12:28:43.713 回答