它会影响表格开头的所有主键列吗?
我知道部分索引读取很可能涉及表扫描,它将整行带入缓冲池以进行谓词匹配。我很想知道在桌面顶部有主键可以提供任何性能提升。
答案 0 :(得分:4)
在Oracle中,表的列顺序对性能影响很小。
原因是一行中的所有列通常都包含在单个块中,并且与查找/读取块相比,查找块中第一列和最后一列之间的时间差异是无穷小的。
此外,当您到达数据库块以读取行时,主键可能不是最重要的列。
以下是列顺序可能会产生影响的一些例外情况:
NULL
,则占用0个字节的空间。因此,如果可能的话,包含许多NULL
值的列最好留在行的末尾,以减少空间使用量,从而减少IO。通常,影响将是最小的,因为其他NULL列每个占用1个字节,因此节省的空间很小。答案 1 :(得分:0)
至少在SQL Server中,根据表中主列的顺序与否,没有性能优势。将主键列放在列表顶部的唯一好处是组织。有点像有一个表有这些列Id,FirstName,LastName,Address1,Address2,City,State,Zip。按顺序关注比Address2,State,Firstname,Id,Address1,Lastname,Zip,City要容易得多。我对Oracle或DB2了解不多,但我相信它是一样的。
答案 2 :(得分:0)
在DB2中,(我认为其他数据库管理器系统的答案应该检查答案)具有较少修改的列应该位于每行的开头,因为在执行更新时,它需要从第一个修改的列开始直到行的末尾,将其写入事务日志中。
它只影响更新操作,插入,删除或选择没有问题。而影响是IO略有减少,因为如果只需要编写最后一列,就应该写入更少的信息。当对具有大量记录的大行的表上的几个小列执行更新时,这可能很重要。如果第一列被修改,DB2将写入整行。
订购列以最小化更新日志记录:http://publib.boulder.ibm.com/infocenter/db2luw/v9r7/topic/com.ibm.db2.luw.admin.dbobj.doc/doc/c0024496.html
答案 3 :(得分:0)
(适用于ORACLE) 那么说,任何和所有主键列,即使只有1,也应该是第一列或连续的前几列。此外,在行的END上标记它们是不好的做法,特别是在一系列可能/可能的空属性字段之后?
因此,一行如下:
pkcol(s),att1,att2,att3,varchar2(2000)
由于上述所有原因,组织得更好
att1,att2,att3,varchar2(2000),pkcol(s)
我为什么要问?好吧,不要判断,但我们正在简化一些表格的PK,并且开发人员乐意将新的GUID标记(不要判断#2)标记到行的末尾。我对此感到困扰,但需要一些反馈来证明我的恐惧。这对SQL Server来说也很重要吗?