Tag Archives: DEFAULT

非空字段空值的产生

上一篇讨论了非空字段中如果存在空值对于查询的影响,这里描述一下导致问题的原因。 非空字段空值对查询的影响:https://yangtingkun.net/?p=1481 书接上文,其实CBO的判断本身是没有问题的,问题在于,为什么一个空值会存在非空约束的字段中。 重新看一下问题: SQL> select * from t_def; ID NAME TYPE ———- —————————— ——– 1 a SQL> select * from t_def where type is null; no rows selected SQL> select * from t_def where type is not null; ID … Continue reading

Posted in BUG, ORACLE | Tagged , , | Leave a comment

11.2使用KEEP池导致ENQ: KO – Fast Object Checkpoint等待

前一段时间在客户测试TPCC的时候碰到这个问题,今天在MOS上找到问题的原因,简单记录一下。 在11.2中,如果表设置了KEEP池,而在初始化参数中没有指定DB_KEEP_CACHE_SIZE的值,就可能会造成数据库中出现明显的ENQ: KO – Fast Object Checkpoint的等待,同时还伴有reliable message的等待。 MOS文档ENQ: KO – Fast Object Checkpoint And Reliable Message Causing Bad Performance [ID 1377830.1]描述了这个问题,给出的解决方案是不使用KEEP池,改为使用DEFAULT池,或者设置DB_KEEP_CACHE_SIZE的值为非0。 而当时测试的过程中,问题与当前的现象很像,版本是11.2.0.2,在执行完压力测试后,所有程序断开后。如果执行关闭操作SHUTDOWN IMMEDIATE,此时就可以发现,数据库经历漫长的ENQ: KO – Fast Object Checkpoint等待,然后数据库才可以正常关闭。不过唯一的不同之处在于,当时测试环境中设置了DB_KEEP_CACHE_SIZE的值,因此问题和当前问题描述很像,但并不一样。 由于环境已经消失,现在无法验证这个问题,但是根据印象判断,这个问题可能确实和使用了KEEP池有关,在使用KEEP池之前使用默认的DEFAULT池时,数据库关闭并没有经历如此严重的等待。因此,在11.2中使用非DEFAULT池,可能会引发异常  

Posted in BUG | Tagged , , , , | Leave a comment

默认值和触发器的顺序

今天在写触发器的时候突然想到这一点,为了验证想法,做了一个简单的例子。 如果一个字段拥有默认值,且包含一个BEFORE的行级触发器,当不指定值时,二者的生效顺序如何: SQL> CREATE TABLE t_trigger_default (id NUMBER, col varchar2(30) DEFAULT ‘default’); TABLE created. SQL> CREATE TRIGGER t_b_tri_def 2 BEFORE INSERT ON t_trigger_default 3 FOR each ROW 4 BEGIN 5 :NEW.col := ‘trigger’; 6 END; 7 / TRIGGER created. SQL> … Continue reading

Posted in ORACLE | Tagged , , | Leave a comment

快速增加表的默认值的方法

看到ITPUB上有人提到,如何快速的在一个3亿条记录的表中增加一个包含DEFAULT值的新字段。描述一下如何快速的添加表的默认值。 Oracle11新特性——在线操作功能增强(二) :http://yangtingkun.itpub.net/post/468/401293 对于这个问题,常规的方法有三个: 一、直接ALTER TABLE ADD COLUMN,这种方法的好处是简单,一个命令就可以完成,缺点是耗时非常长,而且在漫长的执行过长中都会锁定表,导致应用无法修改数据,并且在完成后容易造成大量的行迁移,从而影响后续访问的性能; 二、CREATE TABLE AS SELECT的方式,这种方式相对第一种而言,效率更高,如果是非归档模式,那么完成速度会更快。但是缺点同样很明显,首先需要大量的停机时间,而且表上的索引、约束、触发器以及权限等都需要手工处理,比较麻烦; 三、在线重定义,这种方式应该算是这三种中最佳的,锁表时间非常短,对业务影响最小,但是缺点是整个操作的时间并不会变短,和第二种方式一样,都需要2倍的存储空间,而且操作相对复杂。 如果数据库的版本是11g,那么这就不是问题了,以前写过专门的文章,描述11g是如何快速添加一个包含非空DEFAULT值的列的。那么对于10g及以前版本的数据库而言,增加一个包含默认值的字段难道就真的要忍受漫长的执行时间和大量的REDO、UNDO的占用吗。 其实完全可以仿照11g的方式,来自己实现10g中字段的快速添加。记得Tom在描述数据库的解析时提到过,软解析要优于硬解析,软软解析要优于软解析,而速度最快的莫过于不解析。提高速度的最高境界就是根本不做。 那么对于添加默认值的方式也可以才有这种方法,对于已经存在的记录的默认值,我们根本不去添加,一个简单的例子如下: SQL> CREATE TABLE T_ADD_COLUMN (ID NUMBER, NAME VARCHAR2(30)); TABLE created. SQL> INSERT INTO T_ADD_COLUMN 2 SELECT ROWNUM, OBJECT_NAME 3 FROM DBA_OBJECTS; 11955 ROWS created. … Continue reading

Posted in ORACLE | Tagged , , , , | Leave a comment