设为首页 收藏本站
查看: 2007|回复: 0

[经验分享] oracle 行链接与行迁移

[复制链接]

尚未签到

发表于 2016-7-25 08:34:59 | 显示全部楼层 |阅读模式
表里的一行对于一个数据块太大的情况有二种(一行在一个数据块里放不下)

第一种情况:
INSERT的时候,INSERT时候行的大小就超一个块的大小。Oracle把这行的数据存储在一连串的数据块里(Oracle Stores the data for the row in a chain of data blocks),这种情况称为行链接(Row Chain),一般不可避免(除非使用更大的数据块)。

第二种情况:
UPDATE的时候,UPDATE之后导致行的大小超过一个块的大小,Oracle将迁移这行数据(整行)到一个新的数据块(假设更新的行在新的数据块下放得下,否则这里发生一次行链接),在行迁移之前的地方有一个指向迁移后数据块的指针,行的rowid不会改变。

view source
-- 行链接
SQL> create table t01
  2  (
  3     col01 varchar2(4000),
  4     col02 varchar2(4000),
  5     col03 varchar2(2000)
  6  )
  7  /

Table created.

SQL> insert into t01 values(lpad('*',4000,'*'),lpad('*',4000,'*'),lpad('*',2000,'*'));

1 row created.

SQL> commit;

Commit complete.

SQL> select rowid from t01;

ROWID
------------------
AAASpTAAEAAAALdAAA

SQL> select * from t01 where rowid='AAASpTAAEAAAALdAAA';

Execution Plan
----------------------------------------------------------
Plan hash value: 2326159110

-----------------------------------------------------------------------------------
| Id  | Operation                  | Name | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------------
|   0 | SELECT STATEMENT           |      |     1 |  5018 |     1   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY USER ROWID| T01  |     1 |  5018 |     1   (0)| 00:00:01 |
-----------------------------------------------------------------------------------

Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
          2  consistent gets
          0  physical reads

-- 行迁移
SQL> show parameter block_size

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_block_size                        integer     8192

SQL> create table t01
  2  (
  3     col01 varchar2(4000),
  4     col02 varchar2(4000),
  5     col03 varchar2(2000)
  6  )
  7  /

Table created.

SQL> insert into t01
  2    values(lpad('*',3000,'*'),lpad('*',3000,'*'),lpad('*',1000,'*'));

1 row created.

SQL> insert into t01
  2    values('a','a','a');

1 row created.

SQL> commit;

Commit complete.

SQL> select rowid from t01 where col01='a';

ROWID
------------------
AAASpWAAEAAAALrAAB

SQL> select * from t01 where rowid='AAASpWAAEAAAALrAAB';

Execution Plan
----------------------------------------------------------
Plan hash value: 2326159110

-----------------------------------------------------------------------------------
| Id  | Operation                  | Name | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------------
|   0 | SELECT STATEMENT           |      |     1 |  5018 |     1   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY USER ROWID| T01  |     1 |  5018 |     1   (0)| 00:00:01 |
-----------------------------------------------------------------------------------

Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
          1  consistent gets
          0  physical reads

SQL> update t01
  2     set col01 = lpad(col01, 3000, 'a'),
  3         col02 = lpad(col02, 3000, 'a'),
  4         col03 = lpad(col03, 1000, 'a')
  5    where col01 = 'a';

1 row updated.

SQL> commit;

Commit complete.

SQL> select rowid from t01 where col01 like 'a%';

ROWID
------------------
AAASpWAAEAAAALrAAB

SQL> select rowid from t01 where col01 like 'a%';

ROWID
------------------
AAASpWAAEAAAALrAAB

SQL> set autot trace
SQL> select * from t01 where rowid='AAASpWAAEAAAALrAAB';

Execution Plan
----------------------------------------------------------
Plan hash value: 2326159110

-----------------------------------------------------------------------------------
| Id  | Operation                  | Name | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------------
|   0 | SELECT STATEMENT           |      |     1 |  5018 |     1   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY USER ROWID| T01  |     1 |  5018 |     1   (0)| 00:00:01 |
-----------------------------------------------------------------------------------

Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
          2  consistent gets
          0  physical reads

-- 检查行迁移的记录
SQL> truncate table chained_rows;

Table truncated.

SQL> analyze table t01 list chained rows into chained_rows;

Table analyzed.

SQL> exec print_table('select * from chained_rows')
OWNER_NAME                    : YAO
TABLE_NAME                    : T01
CLUSTER_NAME                  :
PARTITION_NAME                :
SUBPARTITION_NAME             : N/A
HEAD_ROWID                    : AAASpWAAEAAAALrAAB
ANALYZE_TIMESTAMP             : 2012-12-24 11:31:51
-----------------

PL/SQL procedure successfully completed.

-- 消除行迁移

SQL> alter table t01 move;

Table altered.

SQL> select rowid from t01 where col01 like 'a%';

ROWID
------------------
AAASpZAAEAAAAL8AAA

SQL> set autot trace

SQL> select * from t01 where rowid='AAASpZAAEAAAAL8AAA';

Execution Plan
----------------------------------------------------------
Plan hash value: 2326159110

-----------------------------------------------------------------------------------
| Id  | Operation                  | Name | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------------
|   0 | SELECT STATEMENT           |      |     1 |  5018 |     1   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY USER ROWID| T01  |     1 |  5018 |     1   (0)| 00:00:01 |
-----------------------------------------------------------------------------------

Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
          1  consistent gets
          0  physical reads

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-248893-1-1.html 上篇帖子: oracle-sql (常用关于日期计算) 下篇帖子: ibatis2.x调用oracle存储过程
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表