如果要在表上面创建一个主键约束、唯一约束、非空约束等等,一般情况下我们会采用如下语句操作:
- SQL>alter table table_name
- add constraint constraint_name primary key [unique] (field_name);
- SQL>alter table table_name modify (field_name) not null;
以上两个语句在表不大的情况下,以及业务不繁忙的情况下,一般不会有什么问题,但是,如果遇到一个业务繁忙的大表,需要做如上的操作,我们就要小心了,严重的情况下,将堵塞select操作,引发严重的性能问题,如:
- session1 T1>alter table table_name
- add constraint constraint_name primary key (field_name);
- session2 T2>select * from table_name where field_name = <:value> ;
–其中T2 > T1
–这里将阻塞,直到session1结束才开始执行
这是因为shaerd pool语句解析的时候,不能获得对象的句柄,所以将发生大量的library cache pin的等待事件,语句处于等待解析,所以阻塞了读。
但是,数据的唯一性校验是不阻塞读的,如创建唯一索引,validate等等
只有表约束的状态改变是阻塞读的,如
- SQL>alter table ... add constraint;
- SQL>alter table ... modify constraint enable validate;
根据这样的情况,我们应当怎么样正确的创建约束呢,以创建唯一约束例子说明,我们可以采用如下两种方法:
方法一
1、创建唯一索引
- SQL>create unique index index_name on table_name (field_name) online;
2、创建唯一约束(其实创建不创建也没有关系,索引可以保持唯一),这样创建的约束删除的时候,会删除索引,两者有点等价
- SQL>alter table table_name
- add constraint constraint_name primary key (field_name)
- using index index_name;
注意后面的using index语句
方法二
1、创建普通索引
- SQL>create index index_name on table_name (field_name) online;
2、采用不校验以前数据的方式创建约束
- SQL>alter table table_name
- add constraint constraint_name primary key (field_name)
- using index index_name novalidate;
注意后面的novalidate语句
3、合并检查以前的数据
- SQL>alter table table_name modify constraint constraint_name validate;
这里主要是针对以前的记录
上一篇: « 怎么使用object与record类型返回表类型数据
下一篇: 查看IBM主机常见配置信息 »
- 发表评论


