ITPub博客

首页 > Linux操作系统 > Linux操作系统 > [20120607]多余的空格-画蛇添足.txt

[20120607]多余的空格-画蛇添足.txt

原创 Linux操作系统 作者:lfree 时间:2012-06-07 10:16:15 0 删除 编辑
在10.2.0.4下,给表增加字段,一般情况下仅仅执行:

alter table t add (x number);

11G下新特性可以给增加的字段赋予一个缺省值,例子如下:

alter table t add (x number default 1);

会马上返回,执行很快.

但是如果在10g下执行如何呢?
alter table t add (x number default 1);
如果表很大,执行会很慢.

但是如果这样执行结构如何呢.

alter table t add (x1 number default NULL);
alter table t add (x2 number default NULL );

做一个测试看看.

1.建立测试环境:

SQL> select * from v$version ;
BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bi
PL/SQL Release 10.2.0.4.0 - Production
CORE    10.2.0.4.0      Production
TNS for Linux: Version 10.2.0.4.0 - Production
NLSRTL Version 10.2.0.4.0 - Production

drop table t purge ;
create table t as select rownum id, 'test' name from dual connect by level <=1e6;

--alter table t add (x number default 1); =>忽略测试

2.执行如下:
set timing on
alter table t add (x1 number );
alter table t add (x2 number default NULL);
alter table t add (x3 number default NULL ); <= 注意)前面有空格
alter table t add ( x4 number default NULL); <= 注意( 后有空格
alter table t add ( x5 number default NULL ); <= 注意( 后有空格,)前面有空格.

SQL> alter table t add (x1 number );
Table altered.
Elapsed: 00:00:00.11

SQL> alter table t add (x2 number default NULL);
Table altered.
Elapsed: 00:00:00.04

SQL> alter table t add (x3 number default NULL );
Table altered.
Elapsed: 00:02:26.98

SQL> alter table t add ( x4 number default NULL);
Table altered.
Elapsed: 00:00:00.03

SQL> alter table t add ( x5 number default NULL );
Table altered.
Elapsed: 00:01:30.75

--可以发现添加字段X3消耗了2分28秒,添加字段x5消耗了1:30秒.why?
--两种的区别仅仅是)前的空格有无!

3.做10046跟踪看看.

drop table t purge ;
create table t as select rownum id, 'test' name from dual connect by level <=1e5;

alter session set events '10046 trace name context forever, level 12';
alter table t add (x3 number default NULL );
alter session set events '10046 trace name context off';

查看跟踪文件可以发现如下:

update "T" set "X3"=NULL

call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse        1      0.00       0.01          0          1          0           0
Execute      1     11.45      11.53         35        470     244646      100000
Fetch        0      0.00       0.00          0          0          0           0
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total        2     11.45      11.54         35        471     244646      100000

Misses in library cache during parse: 1
Optimizer mode: ALL_ROWS
Parsing user id: 5     (recursive depth: 1)

Rows     Row Source Operation
-------  ---------------------------------------------------
      0  UPDATE  T (cr=508 pr=28 pw=0 time=9057310 us)
 214094   TABLE ACCESS FULL T (cr=451 pr=35 pw=0 time=214178 us)

Elapsed times include waiting on following events:
  Event waited on                             Times   Max. Wait  Total Waited
  ----------------------------------------   Waited  ----------  ------------
  db file scattered read                          9        0.00          0.00
  db file sequential read                         3        0.00          0.00
  log file switch completion                      3        0.16          0.32
********************************************************************************

看来oracle在分析sql语句时有点问题.切记不要这样写,特别是在10.2.0.4.其他版本我没有测试.

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

请登录后发表评论 登录
全部评论
熟悉oracle相关技术,擅长sql优化,rman备份与恢复,熟悉linux shell编程。

注册时间:2008-01-03

  • 博文量
    2286
  • 访问量
    6027535