`
liwenshui322
  • 浏览: 518999 次
  • 性别: 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 Parallel 并行处理

    Oracle并行处理是Oracle企业版提供的一项强大功能,它允许将SQL语句的处理任务分配给多个处理器或处理器核心以及多个磁盘设备,从而充分利用现代多核处理器和分布式存储系统的能力。在多核架构和多磁盘设备环境下,...

    ORACLE并行SQL指南

    ### Oracle并行SQL指南 #### 一、理解并行SQL的概念 在Oracle数据库中,并行SQL(Parallel SQL)是一种能够显著提升SQL语句执行效率的技术。传统的串行SQL执行方式中,一个会话只能利用一个CPU核心或者一个磁盘...

    oracle的Parallel_并行技术案例详解

    Oracle 的 Parallel 并行技术案例详解 Oracle 的 Parallel 并行技术是指在数据库系统中实现并行处理的技术,通过将一个大的任务分解成多个小的任务,并利用多个进程或线程来并发执行这些小任务,从而提高系统的处理...

    Oracle并行度.docx

    3. **并行DDL(Parallel DDL, PDDL)**:并行DDL使得数据库对象的创建、修改和删除可以并行执行,加速大表的重建、索引创建等操作。这对于数据库维护和结构变更非常有益。 设置并行度时,Oracle会参考`cpu_count`...

    Oracle并行性完整性一致性总结报告

    ### Oracle并行性完整性一致性总结报告 #### 一、完整性 **1.1 完整性概念** 数据完整性是指确保数据库中的数据准确无误、符合实际业务需求的状态。它是数据库管理系统(DBMS)的一个核心功能,旨在防止不符合业务...

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

    并行DDL(Parallel DDL),用于快速创建大表或重建索引;并行恢复(Parallel Recovery),在数据库恢复过程中缩短恢复时间;以及过程代码并行化(Procedural Parallel),允许存储过程和函数的并行执行。 在实际...

    Oracle数据库并行技术概要.pptx

    并行技术的发展经历了多个阶段,从早期的基本并行执行到现在的复杂并行策略,如并行查询(Parallel Query)、并行DML(数据操纵语言)和并行DDL(数据定义语言)。Oracle数据库的并行执行主要通过并行服务器...

    充分利用Oracle8并行处理能力提高系统性能.pdf

    2. **基于分区划分的并行DML/DDL**:在执行分区表和索引的并行DML(数据修改语言)或DDL(数据定义语言)操作时,Oracle尽可能为每个不同的分区分配不同的并行执行服务进程。在涉及多个分区的情况下,操作可以被并行...

    oracle 从入门到精髓

    理解并行查询、并行DML和并行DDL的工作原理,以及如何设计和应用分区策略,能有效提高大数据环境下的性能。 七、Oracle高级特性 Oracle还提供了许多高级特性,如物质化视图、物化查询表、数据库链接、存储过程、...

    Oracle教程

    Oracle数据库是业界广泛使用的关系型数据库管理系统(RDBMS),其功能...云计算的核心概念,如分布式处理、并行处理和网格计算等,在Oracle数据库中都有所体现,它们共同组成了Oracle在处理大规模数据集时的强大能力。

    oracle的11.2.0.1.0版本的oci

    总而言之,Oracle的11.2.0.1.0版本的OCI提供了强大的数据库访问能力,并且在并行处理、大型对象处理、安全性、性能监控等方面都有显著提升。oci.dll文件作为其中的核心组件,对于那些仍在使用该版本系统的组织而言,...

    Oracle执行计划介绍与测试.pdf

    - 使用并行处理提高DML、DDL和SELECT语句的执行效率。 - 修改表的访问路径。 - SQL语句的重写。 HINT的语法如下:`{DELETE|INSERT|SELECT|UPDATE}/*+hint[text][hint[text]]*/` 例如:`select /*+index(emp)*...

    Oracle OCM原厂培训教材

    教材将涵盖并行查询、并行DML(Data Manipulation Language)和并行DDL(Data Definition Language)的原理与实践,以及如何利用并行执行来加速处理大量数据。 调度算法和资源管理也是优化数据库性能的关键。教材会...

    Oracle 9i官方文档

    6. **并行执行与并发控制**:Oracle 9i的并行执行特性允许大规模数据处理,文档会讲解并行查询、并行DML(数据操纵语言)和并行DDL(数据定义语言)的原理与配置。 7. **网络与分布式数据库**:Oracle Net Services...

    mysql-oracle数据转换工具

    8. 性能优化:在大规模数据迁移时,工具应具备批量处理和并行转换的能力,以提高迁移速度并减少对业务的影响。 9. 验证和回滚:迁移完成后,验证数据的一致性和完整性至关重要。工具应提供验证机制,并在发现问题时...

    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 Concepts 中文版 (10g R2).zip

    并行查询、并行DML和并行DDL都是这一机制的应用。 8. **高可用性**:Oracle提供高可用性解决方案,如RAC(实时应用集群)、Data Guard和闪回数据库,以确保即使在硬件故障或网络问题时也能保持服务连续性。 9. **...

    Oracle专家高级编程-Expert_one-on-one

    7. **并行执行**:Oracle的并行执行特性可以显著提高大数据量操作的性能,书中会讲解并行查询、并行DML和并行DDL的使用,以及并行服务器的管理。 8. **高可用性方案**:Oracle提供了多种高可用性解决方案,如RAC...

    oracle 详细讲解教程

    Oracle的详细介绍包括其软件体系结构、数据库基础、SQL语法、数据字典、数据类型、体系结构、数据操作语言(DDL)、数据操作语言(DML)、约束、视图、索引、序列、同义词、PL/SQL编程、游标、存储过程、触发器、事务...

Global site tag (gtag.js) - Google Analytics