oracle如何批量查询行迁移

oracle如何批量查询行迁移

 

总结:

       1.行迁移消耗更多的资源导致性能下降,尽量避免行迁移

2.Oracle找出批量行迁移的表的方法:

              chained_rows

       3.解决行迁移的方法:数据重建

 

chained_rows                 

SQL> @?/rdbms/admin/utlchain.sql <=sys

SQL> grant select,insert,delete on sys.chained_rowsto doudou; <=sys;分析doudou用户下的表,所以要给doudou用户授权

select 'analyze table '||table_name||' list chainedrows into sys.chained_rows ;' from user_tables; <=生成分析并插入SQL,执行即可

select table_name,count(table_name) fromsys.chained_rows group by table_name; <=查看行迁移的表和行数

 

 

建议实验表

SQL> create table doudou as select * fromscott.emp;

 

Table created.

 

SQL> desc doudou

 Name                                     Null?    Type

 ------------------------------------------------- ----------------------------

 EMPNO                                             NUMBER(4)

 ENAME                                             VARCHAR2(10)

 JOB                                                VARCHAR2(9)

 MGR                                               NUMBER(4)

 HIREDATE                                           DATE

 SAL                                               NUMBER(7,2)

 COMM                                              NUMBER(7,2)

 DEPTNO                                            NUMBER(2)

 

为制作行迁移做准备

SQL> alter table doudou modify ENAMEvarchar2(2000);

 

Table altered.

 

SQL> alter table doudou modify JOB varchar2(2000);

 

Table altered.

 

开启autotracereport

SQL> set autot on

SQL> select * from doudou;

Execution Plan

----------------------------------------------------------

Plan hash value: 845489848

 

----------------------------------------------------------------------------

| Id  |Operation         | Name   | Rows | Bytes | Cost (%CPU)| Time     |

----------------------------------------------------------------------------

|   0 | SELECTSTATEMENT  |        |   14 | 29092 |     3   (0)| 00:00:01 |

|   1 |  TABLE ACCESS FULL| DOUDOU |    14 | 29092 |     3  (0)| 00:00:01 |

----------------------------------------------------------------------------

 

Note

-----

   - dynamicsampling used for this statement (level=2)

 

 

Statistics

----------------------------------------------------------

          0  recursive calls

          0  db block gets

          4  consistent gets

          0  physical reads

          0  redo size

       1454  bytes sent via SQL*Net to client

        415  bytes received via SQL*Net from client

          2 SQL*Net roundtrips to/from client

          0  sorts (memory)

          0  sorts (disk)

         14  rows processed

 

 

制作行迁移

把10个字节左右的字节扩大到2000个字节,并填满数据,这必然导致原先大量行迁移产生

SQL> update doudou setename=LPAD('1',2000,'*'),job=LPAD('1',2000,'*');

 

14 rows updated.

 

Execution Plan

----------------------------------------------------------

Plan hash value: 845489848

 

----------------------------------------------------------------------------

| Id  |Operation         | Name   | Rows | Bytes | Cost (%CPU)| Time     |

----------------------------------------------------------------------------

|   0 | SELECTSTATEMENT  |        |   14 | 29092 |     8   (0)| 00:00:01 |

|   1 |  TABLE ACCESS FULL| DOUDOU |    14 | 29092 |     8  (0)| 00:00:01 |

----------------------------------------------------------------------------

 

Note

-----

   - dynamicsampling used for this statement (level=2)

 

 

Statistics

----------------------------------------------------------

          0  recursive calls

          0  db block gets

         24  consistent gets

          0  physical reads

          0  redo size

      57660  bytes sent via SQL*Net to client

        415  bytes received via SQL*Net from client

          2  SQL*Net roundtrips to/from client

          0  sorts (memory)

          0  sorts (disk)

         14  rows processed

 

分析2次select * from doudou;

Select * from doudou;

consistent gets

cost

没有行迁移

4

3

有行迁移

24

8

 

显然,行迁移带来更多的性能消耗!所以我们应该尽量的减少行迁移!

 

如果发现行迁移呢?

 

使用utlchain.sql创建chained_rows相关表

SQL> conn /as sysdba

Connected.

SQL> @?/rdbms/admin/utlchain.sql

 

Table created.

 

使用下面的sql,分析并把表的相关信息插入chained_rows

select'analyze table '||table_name||' list chained rows into sys.chained_rows ;' fromuser_tables;

select table_name,count(table_name) fromsys.chained_rows group by table_name;

 

授予doudou用户对chained_rows权限

SQL>  grantselect,insert,delete on sys.chained_rows to doudou;

 

Grant succeeded.

 

SQL> select table_name,count(table_name) fromsys.chained_rows group by table_name;

 

TABLE_NAME                     COUNT(TABLE_NAME)

------------------------------ -----------------

DOUDOU                                        13

 

解决行迁移的方法:重构数据

SQL> drop table doudou purge;

 

Table dropped.

 

SQL> create table doudou as select * fromscott.emp;

 

Table created.

 

 

参考:《收获,不止ORACLE》

 这本书,适合做事思路混乱的人看,培养成一种学习ORACLE的思维!让你清晰的认识到自己学习中方法的不足!

       继续参读……

Chained and Migrated Rows

http://docs.oracle.com/cd/E11882_01/server.112/e40540/logical.htm#BABEEAAE

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值