缺省情况下,DB2表的PK是聚簇索引吗?

时间:2011-12-16 18:00:55

标签: sql db2

这可能是一个愚蠢的问题,但我想确保100%。

默认情况下,DB2表的PK是聚簇索引吗?

3 个答案:

答案 0 :(得分:8)

发件人: DB2 docs - Clustering indexes

  

虽然表可以有多个索引,但只有一个索引可以是聚簇索引。如果没有为表定义集群索引,那么DB2会在表中创建第一个索引,作为对数据行进行排序时的隐式集群索引。

所以不,默认情况下,主键不是表的聚簇索引。

第一个创建的索引(唯一或不唯一)是“隐式”聚簇索引,DB2尝试按照此索引值的顺序尽可能地插入记录。

如果稍后创建另一个索引并将其标识为群集,则DB2会将其标识为群集索引,但不会重新排列表中已有的数据。这可以通过REORG实用程序完成。

答案 1 :(得分:2)

来自Publib(这假设DB2 for z / OS,版本9)

  

当表具有集群索引时,INSERT语句会导致DB2发生   按索引顺序尽可能插入记录   值。 您在表上定义的第一个索引是隐式提供的   作为聚类索引,除非您在何时明确指定CLUSTER   创建或更改另一个索引。例如,如果您首先定义一个   DB2 EMPNO列的唯一索引,DB2插入行   按员工识别号的顺序进入EMP表   除非您明确将另一个索引定义为聚类索引。

如果您使用的是z / OS,则可以使用以下查询查看哪个索引是表的聚簇索引(在此示例中为TEST.TABLE1):

SELECT NAME
FROM SYSIBM.SYSINDEXES
WHERE TBCREATOR  = 'TEST'
  AND TBNAME     = 'TABLE1'
  AND CLUSTERING = 'Y'

这个适用于Linux / Unix / Windows(LUW):

SELECT *
FROM SYSCAT.INDEXES
WHERE TABSCHEMA = 'TEST'
  AND TABNAME   = 'TABLE1'
  AND INDEXTYPE = 'CLUS'

答案 2 :(得分:0)

默认情况下,DB2不会为PK创建聚簇索引。

  

主键

     

主键是一种特殊类型的唯一键,不能包含空值。例如,DEPT表中的DEPTNO列是主键。

     

一个表只能有一个主键。主键是可选的,可以在CREATE TABLE或ALTER TABLE语句中定义。

     

主键上的唯一索引称为主索引。在CREATE TABLE语句或ALTER TABLE语句中定义主键时,如果满足下列条件之一,DB2将自动创建主索引:

     

DB2在新功能模式下运行,并且隐式创建表空间。   DB2在新功能模式下运行,显式创建表空间,并且架构处理器正在运行。   DB2正在转换模式下运行,并且架构处理器正在运行。   如果在ALTER TABLE语句中定义主键的列上已存在唯一索引,则当DB2在新功能模式下运行并隐式创建表空间时,此唯一索引将被指定为主索引。

见:Keys DB2