查看: 7698|回复: 9

[Tips] Oracle 11g 快速加带默认值的列

[复制链接]
论坛徽章:
32
授权会员
日期:2005-10-30 17:05:332010年世界杯参赛球队:阿根廷
日期:2010-04-20 23:13:402010年世界杯参赛球队:葡萄牙
日期:2010-01-25 10:21:04生肖徽章2007版:蛇
日期:2009-08-10 18:06:54生肖徽章2007版:鸡
日期:2009-01-21 21:16:32奥运会纪念徽章:跳水
日期:2008-04-25 22:46:42生肖徽章2007版:鸡
日期:2008-01-02 17:35:53生肖徽章:龙
日期:2007-01-25 16:57:53生肖徽章:虎
日期:2007-01-25 16:57:33生肖徽章:鸡
日期:2006-09-26 17:35:06
跳转到指定楼层
1#
发表于 2007-8-20 18:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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$ 中查找默认值来返回.


以上是今天看到这个特征测试的结果,有什么疏漏欢迎大家指证.
论坛徽章:
7
ITPUB元老
日期:2005-09-18 11:00:10授权会员
日期:2005-10-30 17:05:33数据库板块每日发贴之星
日期:2005-12-21 01:01:31会员2006贡献徽章
日期:2006-04-17 13:46:34会员2007贡献徽章
日期:2007-09-26 18:42:10ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44蛋疼蛋
日期:2012-02-13 13:03:57
2#
发表于 2007-8-20 22:54 | 只看该作者
顶,支持!终于看到你一篇大作!

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

使用道具 举报

回复
论坛徽章:
124
生肖徽章:马
日期:2007-09-26 12:36:24生肖徽章:马
日期:2007-09-26 17:03:45生肖徽章:马
日期:2007-09-26 17:03:35生肖徽章:马
日期:2007-09-26 17:02:38生肖徽章:马
日期:2007-09-26 17:02:07生肖徽章:马
日期:2007-09-26 17:02:01生肖徽章:马
日期:2007-09-26 17:02:00生肖徽章:马
日期:2007-09-26 17:01:53生肖徽章:马
日期:2007-09-26 12:38:07生肖徽章:马
日期:2007-09-26 12:37:55
3#
发表于 2007-8-21 08:57 | 只看该作者
谢谢分享。

使用道具 举报

回复
招聘 : 数据库管理员
论坛徽章:
66
ITPUB元老
日期:2005-07-16 18:49:11授权会员
日期:2005-10-30 17:05:33ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44现任管理团队成员
日期:2011-05-07 01:45:08版主3段
日期:2012-05-15 15:24:11
4#
发表于 2007-8-21 09:43 | 只看该作者
http://xzh2000.itpub.net/post/96/374754
看看偶的博客,这个新特性主要是依赖于数据字典...

使用道具 举报

回复
招聘 : 数据库管理员
论坛徽章:
66
ITPUB元老
日期:2005-07-16 18:49:11授权会员
日期:2005-10-30 17:05:33ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44现任管理团队成员
日期:2011-05-07 01:45:08版主3段
日期:2012-05-15 15:24:11
5#
发表于 2007-8-21 09:44 | 只看该作者
最初由 teddyboy 发布
[B]顶,支持!终于看到你一篇大作!

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


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

使用道具 举报

回复
论坛徽章:
32
授权会员
日期:2005-10-30 17:05:332010年世界杯参赛球队:阿根廷
日期:2010-04-20 23:13:402010年世界杯参赛球队:葡萄牙
日期:2010-01-25 10:21:04生肖徽章2007版:蛇
日期:2009-08-10 18:06:54生肖徽章2007版:鸡
日期:2009-01-21 21:16:32奥运会纪念徽章:跳水
日期:2008-04-25 22:46:42生肖徽章2007版:鸡
日期:2008-01-02 17:35:53生肖徽章:龙
日期:2007-01-25 16:57:53生肖徽章:虎
日期:2007-01-25 16:57:33生肖徽章:鸡
日期:2006-09-26 17:35:06
6#
 楼主| 发表于 2007-8-21 10:14 | 只看该作者
最初由 xzh2000 发布
[B]http://xzh2000.itpub.net/post/96/374754
看看偶的博客,这个新特性主要是依赖于数据字典... [/B]

谢谢

使用道具 举报

回复
论坛徽章:
1
生肖徽章2007版:龙
日期:2009-07-15 16:03:09
7#
发表于 2007-8-28 17:33 | 只看该作者
oracle11G还不算熟悉呢,学习中,学习

使用道具 举报

回复
论坛徽章:
4
ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:442010新春纪念徽章
日期:2010-03-01 11:19:502011新春纪念徽章
日期:2011-02-18 11:43:362012新春纪念徽章
日期:2012-01-04 11:53:29
8#
发表于 2007-11-2 12:50 | 只看该作者
都是高手啊。。。

使用道具 举报

回复
论坛徽章:
16
ITPUB元老
日期:2006-12-29 17:11:00秀才
日期:2015-12-25 15:31:102015年新春福章
日期:2015-03-06 11:57:31沸羊羊
日期:2015-03-04 14:43:432012新春纪念徽章
日期:2012-01-04 11:49:54ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412010新春纪念徽章
日期:2010-03-01 11:21:02祖国60周年纪念徽章
日期:2009-10-09 08:28:002009新春纪念徽章
日期:2009-01-04 14:52:28生肖徽章2007版:鼠
日期:2008-01-02 17:35:53
9#
发表于 2007-11-6 10:26 | 只看该作者
以前如果表很大 增加一列非常之慢,现在会很快了,但是如果在该列上增加索引,估计还得耗费很长时间

使用道具 举报

回复
求职 : 数据库管理员
论坛徽章:
6
授权会员
日期:2007-08-23 08:30:28ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44ITPUB元老
日期:2009-03-06 11:56:31ITPUB社区千里马徽章
日期:2013-06-09 10:15:34ITPUB社区千里马徽章
日期:2013-08-22 09:58:03
10#
发表于 2007-11-20 17:27 | 只看该作者
studying
3Qing

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表