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
分享到:
相关推荐
Oracle并行处理是Oracle企业版提供的一项强大功能,它允许将SQL语句的处理任务分配给多个处理器或处理器核心以及多个磁盘设备,从而充分利用现代多核处理器和分布式存储系统的能力。在多核架构和多磁盘设备环境下,...
### Oracle并行SQL指南 #### 一、理解并行SQL的概念 在Oracle数据库中,并行SQL(Parallel SQL)是一种能够显著提升SQL语句执行效率的技术。传统的串行SQL执行方式中,一个会话只能利用一个CPU核心或者一个磁盘...
Oracle 的 Parallel 并行技术案例详解 Oracle 的 Parallel 并行技术是指在数据库系统中实现并行处理的技术,通过将一个大的任务分解成多个小的任务,并利用多个进程或线程来并发执行这些小任务,从而提高系统的处理...
3. **并行DDL(Parallel DDL, PDDL)**:并行DDL使得数据库对象的创建、修改和删除可以并行执行,加速大表的重建、索引创建等操作。这对于数据库维护和结构变更非常有益。 设置并行度时,Oracle会参考`cpu_count`...
### Oracle并行性完整性一致性总结报告 #### 一、完整性 **1.1 完整性概念** 数据完整性是指确保数据库中的数据准确无误、符合实际业务需求的状态。它是数据库管理系统(DBMS)的一个核心功能,旨在防止不符合业务...
并行DDL(Parallel DDL),用于快速创建大表或重建索引;并行恢复(Parallel Recovery),在数据库恢复过程中缩短恢复时间;以及过程代码并行化(Procedural Parallel),允许存储过程和函数的并行执行。 在实际...
并行技术的发展经历了多个阶段,从早期的基本并行执行到现在的复杂并行策略,如并行查询(Parallel Query)、并行DML(数据操纵语言)和并行DDL(数据定义语言)。Oracle数据库的并行执行主要通过并行服务器...
2. **基于分区划分的并行DML/DDL**:在执行分区表和索引的并行DML(数据修改语言)或DDL(数据定义语言)操作时,Oracle尽可能为每个不同的分区分配不同的并行执行服务进程。在涉及多个分区的情况下,操作可以被并行...
理解并行查询、并行DML和并行DDL的工作原理,以及如何设计和应用分区策略,能有效提高大数据环境下的性能。 七、Oracle高级特性 Oracle还提供了许多高级特性,如物质化视图、物化查询表、数据库链接、存储过程、...
Oracle数据库是业界广泛使用的关系型数据库管理系统(RDBMS),其功能...云计算的核心概念,如分布式处理、并行处理和网格计算等,在Oracle数据库中都有所体现,它们共同组成了Oracle在处理大规模数据集时的强大能力。
总而言之,Oracle的11.2.0.1.0版本的OCI提供了强大的数据库访问能力,并且在并行处理、大型对象处理、安全性、性能监控等方面都有显著提升。oci.dll文件作为其中的核心组件,对于那些仍在使用该版本系统的组织而言,...
- 使用并行处理提高DML、DDL和SELECT语句的执行效率。 - 修改表的访问路径。 - SQL语句的重写。 HINT的语法如下:`{DELETE|INSERT|SELECT|UPDATE}/*+hint[text][hint[text]]*/` 例如:`select /*+index(emp)*...
教材将涵盖并行查询、并行DML(Data Manipulation Language)和并行DDL(Data Definition Language)的原理与实践,以及如何利用并行执行来加速处理大量数据。 调度算法和资源管理也是优化数据库性能的关键。教材会...
6. **并行执行与并发控制**:Oracle 9i的并行执行特性允许大规模数据处理,文档会讲解并行查询、并行DML(数据操纵语言)和并行DDL(数据定义语言)的原理与配置。 7. **网络与分布式数据库**:Oracle Net Services...
8. 性能优化:在大规模数据迁移时,工具应具备批量处理和并行转换的能力,以提高迁移速度并减少对业务的影响。 9. 验证和回滚:迁移完成后,验证数据的一致性和完整性至关重要。工具应提供验证机制,并在发现问题时...
§9.9.3 Oracle并行服务器 110 §9.10 Oracle数据库增长的规划 111 §9.10.1 不同增长表的配置 111 §9.10.2 对增长表进行规划和分析 112 第10章 数据库结构设计要点 113 §10.1 分析阶段的对表的理解 113 §10.2 ...
并行查询、并行DML和并行DDL都是这一机制的应用。 8. **高可用性**:Oracle提供高可用性解决方案,如RAC(实时应用集群)、Data Guard和闪回数据库,以确保即使在硬件故障或网络问题时也能保持服务连续性。 9. **...
7. **并行执行**:Oracle的并行执行特性可以显著提高大数据量操作的性能,书中会讲解并行查询、并行DML和并行DDL的使用,以及并行服务器的管理。 8. **高可用性方案**:Oracle提供了多种高可用性解决方案,如RAC...
Oracle的详细介绍包括其软件体系结构、数据库基础、SQL语法、数据字典、数据类型、体系结构、数据操作语言(DDL)、数据操作语言(DML)、约束、视图、索引、序列、同义词、PL/SQL编程、游标、存储过程、触发器、事务...