ITPUB??ì3
ITPUB论坛 » Oracle新技术/11g » Oracle 11g 快速加带默认值的列

标题: [Tips] Oracle 11g 快速加带默认值的列
离线 小人物
Small Potatoes


精华贴数 0
个人空间 0
技术积分 1943 (811)
社区积分 40 (5294)
注册日期 2003-5-8
论坛徽章:25
ITPUB元老第18届世界杯(德国)纪念徽章会员2006贡献徽章授权会员2008北京奥运纪念徽章:摔跤2008北京奥运纪念徽章:田径
2008北京奥运纪念徽章:蹦床2008北京奥运纪念徽章:跳水ITPUB新首页上线纪念徽章   

发表于 2007-8-20 18:28 
Oracle 11g 快速加带默认值的列

oracle 11g 对加带默认值速度上有很大提升,来测试一下这个特征和原理:

--11g
SQL> alter session set sql_trace=true;

Session altered.

SQL> alter table gark add name varchar2(10) default 'hello' not null;

Table altered.

--tracefile
OVERALL TOTALS FOR ALL RECURSIVE STATEMENTS

call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse       33      0.03       0.21          0          0          0           0
Execute     45      0.05       0.14          3         33         46          10
Fetch       39      0.00       0.01          0         89          0         266
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total      117      0.09       0.36          3        122         46         276

--可以看到current跟query都很小,也只有47个内部调用.耗时不到1s
--在tracefile里面没有找到update gark set name='hello'语句.

--10g
SQL> alter session set sql_trace=true;                                                                                             

Session altered.

SQL> alter table gark add name varchar2(10) default 'hello' not null;                                                               

Table altered.

--tracefile
OVERALL TOTALS FOR ALL RECURSIVE STATEMENTS

call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse       49      0.03       0.02          0          0          0           0
Execute     69      3.71       3.62          0      59546     407425      100009
Fetch       93      0.00       0.00          0        181          0          68
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total      211      3.75       3.66          0      59727     407425      100077

--主要是里面的update gark set name='hello'消耗了大部分的时间.

--可以看到11g并没有更新实际列的内容,那么查询的时候是否有别的操作

--sql_trace没能跟踪出来,改成10046看看:
alter session set events '10046 trace name context forever,level 8';
select * from gark where rownum<100;
alter session set events '10046 trace name context off';

--发现11g中除了:
SQL ID : 7u4jgnqn97ax2
select *
from
gark where rownum<100


call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse        1      0.00       0.00          0          2          0           0
Execute      1      0.00       0.00          0          0          0           0
Fetch        8      0.00       0.00          0         15          0          99
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total       10      0.00       0.00          0         17          0          99
--前面多了这条语句:
SQL ID : aa35g82k7dkd9
select binaryDefVal, length(binaryDefVal)
from
ecol$           where tabobj# = :1 and colnum = :2


call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse        1      0.00       0.00          0          0          0           0
Execute      1      0.00       0.00          0          0          0           0
Fetch        1      0.00       0.00          0          2          0           1
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total        3      0.00       0.00          0          2          0           1

--在查询前会先去ecol$ 中找到该列的默认值.

--在11g中dump一个数据库,然后更新name字段,在dump该块,结果如下.

--11g 更新前数据块内容
block_row_dump:
tab 0, row 0, @0x1f89
tl: 12 fb: --H-FL-- lb: 0x2  cc: 3
col  0: [ 2]  c1 02
col  1: [ 2]  c1 02
col  2: [ 2]  c1 02
tab 0, row 1, @0x1f7a
tl: 12 fb: --H-FL-- lb: 0x2  cc: 3
col  0: [ 2]  c1 03
col  1: [ 2]  c1 03
col  2: [ 2]  c1 03

--11g 更新后数据块内容
block_row_dump:
tab 0, row 0, @0x1f8c
tl: 12 fb: --H-FL-- lb: 0x0  cc: 3
col  0: [ 2]  c1 02
col  1: [ 2]  c1 02
col  2: [ 2]  c1 02
tab 0, row 1, @0x8bb
tl: 18 fb: --H-FL-- lb: 0x1  cc: 4
col  0: [ 2]  c1 03
col  1: [ 2]  c1 03
col  2: [ 2]  c1 03
col  3: [ 5]  77 6f 72 6c 64

--10g 更新前数据块里就已经有该列信息.
block_row_dump:
tab 0, row 0, @0x1f86
tl: 18 fb: --H-FL-- lb: 0x2  cc: 4
col  0: [ 2]  c1 02
col  1: [ 2]  c1 02
col  2: [ 2]  c1 02
col  3: [ 5]  68 65 6c 6c 6f
tab 0, row 1, @0x1f74
tl: 18 fb: --H-FL-- lb: 0x2  cc: 4
col  0: [ 2]  c1 03
col  1: [ 2]  c1 03
col  2: [ 2]  c1 03
col  3: [ 5]  68 65 6c 6c 6f

--总结:
--oracle 11g在加上默认值后数据块中并没有存储这些数据,oracle在查询的时候如果数据块中
--没有对应的列就会先去ecol$ 中查找默认值来返回.


以上是今天看到这个特征测试的结果,有什么疏漏欢迎大家指证.


只看该作者    顶部
离线 teddyboy
永远的DBA


精华贴数 0
个人空间 0
技术积分 4724 (277)
社区积分 210 (2249)
注册日期 2002-6-13
论坛徽章:6
ITPUB元老会员2007贡献徽章会员2006贡献徽章授权会员ITPUB新首页上线纪念徽章数据库板块每日发贴之星
      

发表于 2007-8-20 22:54 
顶,支持!终于看到你一篇大作!

就是说在update该默认值的字段的时候才存储实际的列。


__________________
只看该作者    顶部
离线 vongates
开门


精华贴数 3
个人空间 0
技术积分 19432 (47)
社区积分 10046 (147)
注册日期 2002-11-28
论坛徽章:81
现任管理团队成员2008年新春纪念徽章    
      

发表于 2007-8-21 08:57 
谢谢分享。


__________________
只看该作者    顶部
离线 xzh2000
仙人抚我须 结发授长生



精华贴数 13
个人空间 0
技术积分 46375 (14)
社区积分 5097 (276)
注册日期 2002-7-17
论坛徽章:29
现任管理团队成员ITPUB元老授权会员2008北京奥运纪念徽章:柔道2008北京奥运纪念徽章:帆船生肖徽章2007版:虎
ITPUB新首页上线纪念徽章数据库板块每日发贴之星数据库板块每日发贴之星数据库板块每日发贴之星数据库板块每日发贴之星数据库板块每日发贴之星

发表于 2007-8-21 09:43 
http://xzh2000.itpub.net/post/96/374754
看看偶的博客,这个新特性主要是依赖于数据字典...


__________________
过目即忘  插柳成荫
只看该作者    顶部
离线 xzh2000
仙人抚我须 结发授长生



精华贴数 13
个人空间 0
技术积分 46375 (14)
社区积分 5097 (276)
注册日期 2002-7-17
论坛徽章:29
现任管理团队成员ITPUB元老授权会员2008北京奥运纪念徽章:柔道2008北京奥运纪念徽章:帆船生肖徽章2007版:虎
ITPUB新首页上线纪念徽章数据库板块每日发贴之星数据库板块每日发贴之星数据库板块每日发贴之星数据库板块每日发贴之星数据库板块每日发贴之星

发表于 2007-8-21 09:44 


QUOTE:
最初由 teddyboy 发布
顶,支持!终于看到你一篇大作!

就是说在update该默认值的字段的时候才存储实际的列。


以前为空的它一直都不会update当前的默认值,如果select到它为null,就从字典中取该字段的默认值来翻译就是啦...


__________________
过目即忘  插柳成荫
只看该作者    顶部
离线 小人物
Small Potatoes


精华贴数 0
个人空间 0
技术积分 1943 (811)
社区积分 40 (5294)
注册日期 2003-5-8
论坛徽章:25
ITPUB元老第18届世界杯(德国)纪念徽章会员2006贡献徽章授权会员2008北京奥运纪念徽章:摔跤2008北京奥运纪念徽章:田径
2008北京奥运纪念徽章:蹦床2008北京奥运纪念徽章:跳水ITPUB新首页上线纪念徽章   

发表于 2007-8-21 10:14 


QUOTE:
最初由 xzh2000 发布
http://xzh2000.itpub.net/post/96/374754
看看偶的博客,这个新特性主要是依赖于数据字典...


谢谢


只看该作者    顶部
离线 bitmap
一般会员


精华贴数 0
个人空间 0
技术积分 182 (10111)
社区积分 1 (41496)
注册日期 2006-8-5
论坛徽章:0
      
      

发表于 2007-8-28 17:33 
oracle11G还不算熟悉呢,学习中,学习


__________________
bitmap      此致    谢谢!
只看该作者    顶部
离线 Hopewell_Go
LSXM FOREVER



精华贴数 0
个人空间 0
技术积分 1731 (940)
社区积分 8 (12197)
注册日期 2007-6-15
论坛徽章:1
ITPUB新首页上线纪念徽章     
      

发表于 2007-11-2 12:50 
都是高手啊。。。


__________________
和她一起努力!!幸福在后头! LSXM FOREVER
只看该作者    顶部
离线 cyr1974
淡泊明志 宁静志远


精华贴数 2
个人空间 0
技术积分 6670 (184)
社区积分 892 (982)
注册日期 2003-2-12
论坛徽章:7
ITPUB元老会员2007贡献徽章生肖徽章2007版:猴生肖徽章2007版:鼠  
      

发表于 2007-11-6 10:26 
以前如果表很大 增加一列非常之慢,现在会很快了,但是如果在该列上增加索引,估计还得耗费很长时间


__________________
cyongrui@hotmail.com业余台球爱好者互相交流 共同进步
只看该作者    顶部
离线 beiphiju
中级会员



精华贴数 0
个人空间 0
技术积分 887 (2068)
社区积分 72 (3979)
注册日期 2005-9-14
论坛徽章:2
授权会员ITPUB新首页上线纪念徽章    
      

发表于 2007-11-20 17:27 
studying
3Qing


只看该作者    顶部
 
    

相关内容


CopyRight 1999-2006 itpub.net All Right Reserved.
北京皓辰广域网络信息技术有限公司. 版权所有
E-mail:Webmaster@itpub.net
京ICP证:010037号 联系我们 法律顾问