`
csbison
  • 浏览: 149958 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Oracle分区表的优势

阅读更多

分区表的优势

对于数据库的执行机制还是不大了解,希望专家能通过这些数据给予一些原理上的解释和说明,先谢谢了
分别在分区表和普通表上面 执行语句如下:
    SELECT COUNT(*) FROM table_name WHERE column_name='B';
        SELECT COUNT(*) FROM table_name WHERE XM LIKE '%亮%';
        select count(*) from table_name where column_name like '3702%';
        select count(*) from table_name where xm='胡延吉' and xb='1' and column_name='C4';
        select count(*) from table_name where xm='胡延吉' and column_name='C4';
        select count(*) from table_name where xm='胡延吉' and xb='1';
        select count(*) from table_name where xb='1' and column_name='C4';
        select count(*) from table_name where column_name='C4';
        insert into test select * from table_name where xm='胡延吉';
        commit;
        delete from table_name where xm='胡延吉' ;
        commit;
        insert into table_name select * from test;
        commit;
        truncate table test;
        insert into test select * from table_name where column_name='370122873293';
        commit;
        delete from table_name where column_name='370122873293';
        commit;
        insert into table_name select * from test;
        commit;
        truncate table test;
        insert into test  select * from table_name where column_name='B';
        delete from table_name where column_name='B';
        commit;
        insert into  table_name  select * from test ;
        commit;
        truncate table test;
        update table_name set csrq=csrq+1;
        commit;
        update table_name set csrq=csrq+1 where  column_name='370122873293';
        commit;
        select column_name,count(*) from table_name group by column_name;
        select column_name,count(*) from table_name group by column_name;


   (1)在分区表上面执行的时候,数据库自动的以分区为单位,逐个遍历分区,得到最后结果。遍历分区84回中,最短的为7秒,最长的为300秒,总共用时:49分钟。每次遍历平均时间大约为0.5分钟。
        table_name 共有21各分区,619928blocks,其中3个分区无数据,分区segment占用block中最大为75776,最小的为8,平均占用block 34444(没有计算无数据分区),一次遍历过程中读取block最少的是15000,最多的是74971,两次平均为45000。占用cpu大约在20%-70%之间。
   (2)在普通表上面执行的时候,数据库则根据执行计划对全表一次遍历,以表为基本单位,执行时间较短,但是占用资源较多,其中一个cpu使用率总在60%左右。执行完上面语句共耗时5小时24分钟。尤其是在批量update,delete的时候,耗时长(占用了测试时间的6个半小时),占用资源持久不能释放,在联机系统下,这个时候不可避免地会有其他用户对数据库进行增删查改操作的时候,很容易出现异常,导致无法程序正确执行。
  普通表共300000个block,每次进行遍历的时候都要读取所有的block,耗用资源多,
   (3)在执行group by分组查询的时候,分区表耗时12秒,普通表耗时3分50秒
        insert into test  select * from table_name where column_name='B';执行这个语句耗时6分钟,普通表则耗时19分钟。但是发生的物理读取block数量63236与普通表190175相比相差三倍,但是产生的redo相差不大都在47422.9万。
        delete from table_name where column_name='B';执行这个语句耗时9分钟,普通表则耗时110分钟。但是发生的物理读取block数量101549与普通表716569相比相差7倍, redo size:1049412336与普通表相比1545006788相差5亿多。
        consistent gets 74191与普通表5504652相比差近80倍。
        通过测试,发现分区表的在对批量数据进行操作时,在调节性能,减少资源竞争(从物理文件读取数据到内存、一致性读取数据、cpu使用率、分散i/o),具有明显的优势,数据库能够根据sql语句自动调节,判断是否使用分区索引的情况。但是在按照主键进行精确操作的时候,与普通表相比没有明显优势。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics