ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 创建主键约束时使用已有索引的好处

创建主键约束时使用已有索引的好处

原创 Linux操作系统 作者:lsq_008 时间:2009-02-21 11:23:53 0 删除 编辑

1. 在创建主键约束时,如果在主键列上没有索引,则会自动创建一个唯一索引:

SQL>  alter table test add constraint p_test primary key (empno);

Table altered.

SQL>  select table_name,index_name,uniqueness,status from user_Indexes where table_name='TEST';

TABLE_NAME INDEX_NAME UNIQUENES STATUS
---------- ---------- --------- --------
TEST       P_TEST     UNIQUE    VALID

在这种情况下,如果把主键约束disable后,则相应的索引被删除:

SQL> alter session set events '10046 trace name context forever,level 12';

Session altered.

SQL> alter table scott.test disable constraint p_test;

Table altered.

SQL> select table_name,index_name,uniqueness,status from dba_indexes where wner='SCOTT' and table_name='TEST';

no rows selected

SQL>  alter table scott.test enable constraint p_test;

Table altered.

SQL> select table_name,index_name,uniqueness,status from dba_indexes where wner='SCOTT' and table_name='TEST';

TABLE_NAME                     INDEX_NAME                     UNIQUENES STATUS
------------------------------ ------------------------------ --------- --------
TEST                           P_TEST                         UNIQUE    VALID

此时查看10046的trace文件,会发现如下sql:
....
....
=====================
PARSING IN CURSOR #3 len=27 dep=1 uid=0 ct=10 lid=0 tim=1206281434026658 hv=0 ad='b70eb7c8'
drop index "SCOTT"."P_TEST"
END OF STMT
PARSE #3:c=18997,e=18639,p=0,cr=77,cu=0,mis=1,r=0,dep=1,og=4,tim=1206281434026652
BINDS #3:
=====================
....
....
=====================
PARSING IN CURSOR #3 len=74 dep=1 uid=0 ct=9 lid=0 tim=1206281468333327 hv=1800847174 ad='326c9c0c'
CREATE UNIQUE INDEX "SCOTT"."P_TEST" on "SCOTT"."TEST"("EMPNO") NOPARALLEL
END OF STMT
PARSE #3:c=1000,e=822,p=0,cr=1,cu=0,mis=1,r=0,dep=1,og=4,tim=1206281468333320
BINDS #3:
=====================

很显然,在执行disable之后,随之执行了drop index的动作,而enable 之后,随之执行了create unique index的动作。


2.如果在创建主键之前,在主键列上先创建一个索引,则在disable和enable过程中避免drop index 和create unique index的出现:

SQL> alter table scott.test drop constraints p_test;

Table altered.

SQL> drop index idx_test;

Index dropped.

SQL> select owner,table_name,index_name,uniqueness,status from dba_indexes where table_name='TEST';

no rows selected

SQL> create index scott.idx_test on scott.test(empno);

Index created.

SQL>  alter table scott.test add constraint p_test primary key (empno) using index;

Table altered.

SQL>  select owner,table_name,index_name,uniqueness,status from dba_indexes
  2  where table_name='TEST' and wner='SCOTT';

OWNER                          TABLE_NAME                     INDEX_NAME                     UNIQUENES STATUS
------------------------------ ------------------------------ ------------------------------ --------- --------
SCOTT                          TEST                           IDX_TEST                       NONUNIQUE VALID

SQL> alter table scott.test disable constraint p_test;

Table altered.

SQL> select owner,table_name,index_name,uniqueness,status from dba_indexes
  2  where table_name='TEST' and wner='SCOTT';

OWNER                          TABLE_NAME                     INDEX_NAME                     UNIQUENES STATUS
------------------------------ ------------------------------ ------------------------------ --------- --------
SCOTT                          TEST                           IDX_TEST                       NONUNIQUE VALID

SQL> alter table scott.test enable constraint p_test;

Table altered.

SQL> select owner,table_name,index_name,uniqueness,status from dba_indexes
  2   where table_name='TEST' and wner='SCOTT';

OWNER                          TABLE_NAME                     INDEX_NAME                     UNIQUENES STATUS
------------------------------ ------------------------------ ------------------------------ --------- --------
SCOTT                          TEST                           IDX_TEST                       NONUNIQUE VALID

通过现在主键列上创建索引,再创建主键约束的方法,可以避免对大表主键进行disable和enable过程中产生的额外创建索引的工作。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10972173/viewspace-557273/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
十余年大型金融及电信系统数据库管理经验,曾服务于中国建设银行、中国移动。对oracle,mysql数据库有深入了解。 擅长python开发,独立开发了开源数据库自动化监控运维平台Power Monitor。

注册时间:2008-02-29

  • 博文量
    325
  • 访问量
    1255217