数据库:表开头的主键列

时间:2013-02-20 16:17:48

标签: sql-server oracle db2

它会影响表格开头的所有主键列吗?

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

4 个答案:

答案 0 :(得分:4)

在Oracle中,表的列顺序对性能影响很小

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

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

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

  • 当你有>表中有255列,这些行将分为两个块(或更多)。访问前255列可能比访问其余列更便宜。
  • 行的最后一列如果是NULL,则占用0个字节的空间。因此,如果可能的话,包含许多NULL值的列最好留在行的末尾,以减少空间使用量,从而减少IO。通常,影响将是最小的,因为其他NULL列每个占用1个字节,因此节省的空间很小。
  • 启用压缩时,压缩效率可能取决于列顺序。一个好的经验法则是,应该对具有少量不同值的列进行分组,以增加它们被压缩算法合并的可能性。
  • Index Organized Table(IOT)与overflow clause一起使用时,您应该考虑列的顺序。使用此子句,确定的分隔列之后的所有列都将存储在线外,访问它们将产生额外的成本。主键始终物理存储在IOT中行的开头。

答案 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来说也很重要吗?