`
liwenshui322
  • 浏览: 512262 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Oracle 并行DDL介绍

 
阅读更多

 

     Oracle并行中最有用的就是并行DDL。我们都知道,并行执行通常不适用于OLTP系统。实际上,对于数据仓库,并行查询也变得越来越没有意义。因为目前数据仓库,可能会基于一个web前端,通常也会有数以百计的用户同时进行访问。

     那么,唯一的好处就是体现在DBA维护数据库方面了。因为,DBA维护数据库的时候,通常都能保证服务器有足够的资源能够使用(CPU,I/O通道等等)。比如,DBA要做一件事情:加载某个数据,重组表,再重建索引。这些操作可以并行执行,最大限度利用硬件的全部能力。以下一些DDL命令允许并行操作:

     1. create index:创建索引

     2. create table as select:select查询可以并行操作,新表插入数据也可以并行

     3. alter index rebuild:重建索引

     4. alter table move:表迁移

     5. alter table split/coalesce partition:单个表分区可以并行地分解或合并

     6. alter index split partition:索引分区可以并行地分解

 

     下面我们以create table as select 为例进行说明

 

      1. 原理介绍

      假设执行一个并行create table as select,并行度为4。那么,每一个并行服务都会分配自己的区段,向其写入数据,写满之后,再分配一个新区段。 每一个并行服务不会使用另外一个并行服务的区段,如下图所示:

 

      P003加载了4个区段,P000加载了5个区段,他们各自互不影响。看上去一切很美好,但是这里面隐含一个表空间“过度浪费”问题。假设我们要加载1010M数据,用10个并行执行服务器来加载这个数据,每一个并行服务器加载101M数据,而每一个区段是100M。那么,每一个并行服务器会分配两个区段,第一个用完,第二个都只用1M空间。也就是总共有990M空间已分配未使用,虽然下次加载的时候会被用到,但是对于现在而言,就有990M的死空间。这个时候,是否可以将这些只用了很小一部分的区段截断开来,取决于表空间的管理机制。

 

     二. 表空间创建

     1. 不支持区段截断表空间

 

create tablespace lmt_uniform
 datafile 'D:\oraclelws\product\10.2.0\oradata\orcl\lmt_uniform.dbf' size 1048640K reuse
 autoextend on next 100m
 extent management local
 uniform size 100m;
 

    2. 支持区段截断表空间

 

create tablespace lmt_auto
 datafile 'D:\oraclelws\product\10.2.0\oradata\orcl\lmt_auto.dbf' size 1048640K reuse
 autoextend on next 100m
 extent management local
autoallocate;

 

     3. 创建big_table 表,参考我的如下一篇文章 http://liwenshui322.iteye.com/blog/1741132

 

 

     三. 并行创建表

     1. 不支持区段截断的表

 

create table uniform_test
 parallel
 tablespace lmt_uniform
 as
 select * from big_table;
 

     2. 支持区段截断的表

 

create table autoallocate_test
 parallel
 tablespace lmt_auto
 as
 select * from big_table;
 

    四. 表空间利用情况

    1. 查看这两个表使用块情况

 

select segment_name, blocks, extents
 from user_segments
 where segment_name in ( 'UNIFORM_TEST', 'AUTOALLOCATE_TEST' );
 

    结果如下图所示:

   

 

    由于我的机器块大小是8kB,二者相差45432个块,也就是45432*8/1024=355M

 

    2. 查看表具体使用空间情况

    首先创建一个存储过程

create or replace procedure show_space   
( p_segname in varchar2,   
  p_owner   in varchar2 default user,   
  p_type    in varchar2 default 'TABLE',   
  p_partition in varchar2 default NULL )   
-- This procedure uses AUTHID CURRENT USER so it can query DBA_*   
-- views using privileges from a ROLE and so it can be installed   
-- once per database, instead of once per user who wanted to use it.   
AUTHID CURRENT_USER   
as   
    l_free_blks                 number;   
    l_total_blocks              number;   
    l_total_bytes               number;   
    l_unused_blocks             number;   
    l_unused_bytes              number;   
    l_LastUsedExtFileId         number;   
    l_LastUsedExtBlockId        number;   
    l_LAST_USED_BLOCK           number;   
    l_segment_space_mgmt        varchar2(255);   
    l_unformatted_blocks number;   
    l_unformatted_bytes number;   
    l_fs1_blocks number; l_fs1_bytes number;   
    l_fs2_blocks number; l_fs2_bytes number;   
    l_fs3_blocks number; l_fs3_bytes number;   
    l_fs4_blocks number; l_fs4_bytes number;   
    l_full_blocks number; l_full_bytes number;   
  
    -- Inline procedure to print out numbers nicely formatted   
    -- with a simple label.   
    procedure p( p_label in varchar2, p_num in number )   
    is   
    begin   
        dbms_output.put_line( rpad(p_label,40,'.') ||   
                              to_char(p_num,'999,999,999,999') );   
    end;   
begin   
   -- This query is executed dynamically in order to allow this procedure   
   -- to be created by a user who has access to DBA_SEGMENTS/TABLESPACES   
   -- via a role as is customary.   
   -- NOTE: at runtime, the invoker MUST have access to these two   
   -- views!   
   -- This query determines if the object is an ASSM object or not.   
   begin   
      execute immediate   
          'select ts.segment_space_management   
             from dba_segments seg, dba_tablespaces ts   
            where seg.segment_name      = :p_segname   
              and (:p_partition is null or   
                  seg.partition_name = :p_partition)   
              and seg.owner = :p_owner   
              and seg.tablespace_name = ts.tablespace_name'   
             into l_segment_space_mgmt   
            using p_segname, p_partition, p_partition, p_owner;   
   exception   
       when too_many_rows then   
          dbms_output.put_line   
          ( 'This must be a partitioned table, use p_partition => ');   
          return;   
   end;   
  
  
   -- If the object is in an ASSM tablespace, we must use this API   
   -- call to get space information; else we use the FREE_BLOCKS   
   -- API for the user managed segments.   
   if l_segment_space_mgmt = 'AUTO'   
   then   
     dbms_space.space_usage   
     ( p_owner, p_segname, p_type, l_unformatted_blocks,   
       l_unformatted_bytes, l_fs1_blocks, l_fs1_bytes,   
       l_fs2_blocks, l_fs2_bytes, l_fs3_blocks, l_fs3_bytes,   
       l_fs4_blocks, l_fs4_bytes, l_full_blocks, l_full_bytes, p_partition);   
  
     p( 'Unformatted Blocks ', l_unformatted_blocks );   
     p( 'FS1 Blocks (0-25)  ', l_fs1_blocks );   
     p( 'FS2 Blocks (25-50) ', l_fs2_blocks );   
     p( 'FS3 Blocks (50-75) ', l_fs3_blocks );   
     p( 'FS4 Blocks (75-100)', l_fs4_blocks );   
     p( 'Full Blocks        ', l_full_blocks );   
  else   
     dbms_space.free_blocks(   
       segment_owner     => p_owner,   
       segment_name      => p_segname,   
       segment_type      => p_type,   
       freelist_group_id => 0,   
       free_blks         => l_free_blks);   
  
     p( 'Free Blocks', l_free_blks );   
  end if;   
  
  -- And then the unused space API call to get the rest of the   
  -- information.   
  dbms_space.unused_space   
  ( segment_owner     => p_owner,   
    segment_name      => p_segname,   
    segment_type      => p_type,   
    partition_name    => p_partition,   
    total_blocks      => l_total_blocks,   
    total_bytes       => l_total_bytes,   
    unused_blocks     => l_unused_blocks,   
    unused_bytes      => l_unused_bytes,   
    LAST_USED_EXTENT_FILE_ID => l_LastUsedExtFileId,   
    LAST_USED_EXTENT_BLOCK_ID => l_LastUsedExtBlockId,   
    LAST_USED_BLOCK => l_LAST_USED_BLOCK );   
  
    p( 'Total Blocks', l_total_blocks );   
    p( 'Total Bytes', l_total_bytes );   
    p( 'Total MBytes', trunc(l_total_bytes/1024/1024) );   
    p( 'Unused Blocks', l_unused_blocks );   
    p( 'Unused Bytes', l_unused_bytes );   
    p( 'Last Used Ext FileId', l_LastUsedExtFileId );   
    p( 'Last Used Ext BlockId', l_LastUsedExtBlockId );   
    p( 'Last Used Block', l_LAST_USED_BLOCK );   
end; 

 

    查看uniform_test表使用空间情况

    先执行这条SQL:set serveroutput on

exec show_space('UNIFORM_TEST');

    结果如下图所示:

   

    对比autoallocate_test表使用空间情况

 

exec show_space('AUTOALLOCATE_TEST' );  


   

 

    我们发现,不使用区段截断的表空间,除开里面unformatted blocks数量,差不多就跟使用区段截断表空间块的数量相等了。这些unformatted blocks就是那些已分配未使用的块。

 

 

 

 

 

 

 

 

 

  • 大小: 33.7 KB
  • 大小: 4.1 KB
  • 大小: 6.5 KB
  • 大小: 6.3 KB
0
0
分享到:
评论

相关推荐

    Oracle并行度.docx

    Orale在ddl、dml中的并行度,如何调整并行度代码。 对于一个大的任务,一般的做法是利用一个进程,串行的执行,如果系统资源足够,可以采用parallel技术,把一个大的任务分成若干个小的任务,同时启用n个进程/线程...

    Oracle并行操作之并行查询实例解析

    Oracle数据库的并行操作特性,其本质上就是强行榨取除数据库服务器空闲资源(主要是CPU资源),对一些高负荷大数据量数据进行分治处理。并行操作是一种非确定性的...Parallel DDL:并行DDL操作。如进行大容量数据表构建

    ORACLE9i_优化设计与系统调整

    §9.9.3 Oracle并行服务器 110 §9.10 Oracle数据库增长的规划 111 §9.10.1 不同增长表的配置 111 §9.10.2 对增长表进行规划和分析 112 第10章 数据库结构设计要点 113 §10.1 分析阶段的对表的理解 113 §10.2 ...

    让Oracle跑得更快 Oracle 10g性能分析与优化思路.part2.rar

    8.5.2 并行ddl操作 195 8.5.3 并行dml操作 203 8.6 并行执行的设定 210 8.6.1 并行相关的初始化参数 210 8.6.2 并行度的设定 211 8.7 直接加载 213 8.7.1 直接加载和redo 216 8.7.2 直接加载和索引 219 8.7.3 直接...

    Oracle高级sql学习与练习

    17、扩展DDL和DML语句 18、MODEL语句 19、10G闪回查询 20、专题-行列转换 21、专题-连续值和累计值问题 22、专题-NULL和DUAL详解 23、专题-时间、数字、字符格式详解 24、专题-ORACLE字符集问题 25、专题-随机值查询

    Oracle 9i&10g编程艺术:深入数据库体系结构(全本)含脚本

    14.4.1 并行DDL和使用外部表的数据加载 632 14.4.2 并行DDL和区段截断 634 14.5 并行恢复 643 14.6 过程并行化 643 14.6.1 并行管道函数 644 14.6.2 DIY并行化 648 14.7 小结 652 第15章 数据加载和卸载 655 ...

    让Oracle跑得更快 Oracle 10g性能分析与优化思路.part1.rar

    8.5.2 并行ddl操作 195 8.5.3 并行dml操作 203 8.6 并行执行的设定 210 8.6.1 并行相关的初始化参数 210 8.6.2 并行度的设定 211 8.7 直接加载 213 8.7.1 直接加载和redo 216 8.7.2 直接加载和索引 219 8.7.3 直接...

    Oracle Database 11g初学者指南--详细书签版

    CruiseYoung提供的带有详细书签的电子书籍目录 ... Oracle Database 11g初学者指南 基本信息 原书名: Oracle Database 11g, A Beginner's Guide 原出版社: McGraw-Hill Osborne Media ... 9.4 使用并行处理改善性能...

    OCPOCA认证考试指南全册:Oracle Database 11g(1Z0-051,1Z0-052,1Z0-053)--详细书签版(第2/2部分)

    9.1.1 SQL SELECT语句的介绍 306 9.1.2 DESCRIBE表命令 306 9.1.3 SELECT语句的功能 307 9.1.4 数据规范化 308 9.2 创建演示模式 311 9.2.1 HR和WEBSTORE模式 311 9.2.2 演示模式的创建 314 9.3 执行基本的...

    Oracle编程艺术

    第 1章 开发成功的Oracle应用程序...................................................... 61 1.1 我的方法................................................................................ 63 3 / 976 1.2 ...

    oracle学习经典教程

    1.1 ORACLE OLAP 与OLTP 介绍..................24 1.1.1 什么是OLTP ....25 1.1.2 什么是OLAP....26 1.1.3 在OLAP 系统中,常使用分区技术、并行技术....26 1.1.4 分开设计与优化..........................

    Oracle9i的init.ora参数中文说明

    Oracle9i初始化参数中文说明 Blank_trimming: 说明: 如果值为TRUE, 即使源长度比目标长度 (SQL92 兼容) 更长, 也允许分配数据。 值范围: TRUE | FALSE 默认值: FALSE serializable: 说明: 确定查询是否获取表级...

    收获不知Oracle

    2.3.2.7 并行设置,飞船速度 79 2.3.3 精彩的总结与课程展望 80 2.3.3.1 最大的收获应该是思想80 2.3.3.2 老师的课程展望与规划81 第3章神奇,走进逻辑体系世界 84 3.1 长幼有序的逻辑体系 84 3.2 逻辑体系从老余...

    TianleSoftware Oracle中文学习手册

    1.1 ORACLE OLAP 与 OLTP 介绍 .............................................................................. 1.1.1 什么是 OLTP .............................................................................

    OCPOCA认证考试指南全册:Oracle Database 11g(1Z0-051,1Z0-052,1Z0-053)--详细书签版(第1/2部分)

    9.1.1 SQL SELECT语句的介绍 306 9.1.2 DESCRIBE表命令 306 9.1.3 SELECT语句的功能 307 9.1.4 数据规范化 308 9.2 创建演示模式 311 9.2.1 HR和WEBSTORE模式 311 9.2.2 演示模式的创建 314 9.3 执行基本的...

    数据库系统实验报告.pdf

    实验一 SQL语言 一、实验目的 (1)通过上机实践,熟悉Oracle的SQL * Plus环境及使用方法 (2)掌握SQL语言,能熟练运用SQL语言进行数据定义和数据操纵 (3)加深对关系数据模型的数据结构和约束的理解 二、实验环境 硬件...

    SQL性能优化

    7. 频繁 DDL 的表,不要建立太多的索引 8. 删除无用的索引,避免对执行计划造成负面影响 9. 让 SQL 语句用上合理的索引,合理让 SQL 语句使用索引的原则如下:  首先,看是否用上了索引,对于该使用索引而没有用上...

Global site tag (gtag.js) - Google Analytics