本文永久链接地址:https://www.askmac.cn/archives/oracle-11g-ocm-parallel.html
1.执行并行
1.1 简介
使用并行执行的环境:
1.多处理器,集群或大规模并行系统
2.足够的I/O带宽
3.未充分利用或间歇使用CPUs(例如。系统的CPU使用率通常少于30%)
4.有足够的内存来支持额外的密集内存处理,例如排序,哈希和I/O缓存。
如果系统却上这些特性,并行执行可能不会显著的提高性能。事实上,在系统负载很高或I/O带宽很小时,并行执行会减少系统性能。
OLTP中使用并行执行处理批处理和维护是有帮助的。一般简单的SELECT语句在OLTP应用中并行执行并不会有什么好处、
不适合使用并行的场景:
1.在典型查询或事务很短(几秒或更少)的环境
这包括了大多数在线交易系统,在这些环境中,并行并不是很有用,因为对于并行服务会有一个协调器的开销。对于很短的事务,这个协调的成本可能会超过并行带来的收益。
2.CPU,内存或I/O资源都健康的利用的环境
并行执行的目的是利用额外的硬件资源,如果没有这样的资源可以使用,那么并行执行不能产生任何好处,还可能影响性能。
1.2 dop
DOP–并行深度:
degree of parallelism ,每个单独操作分配的并行执行服务的数目。并行执行是为了有效利用多个CPUs。
Oracle 的并行框架可以让你手动指定DOP或者让Oracle 数据库自动的控制。
手动指定DOP,例如在表级别指定:
ALTER TABLES sales PARALLEL 8; ALTER TABLE customers PARALLEL 4;
如果同时访问 sales和customers 那么DOP是8,并且潜在的分配16个并行服务器(producer和consumer)。oracle只接受更高的不同的并行配置
如果PARALLER子句指定但是没有指定DOP,那么对象会获得默认的DOP。默认的并行度使用计算公式来确定系统的DOP:
对于单实例,DOP= PARALLEL_THREADS_PER_CPU x CPU_COUNT
对于RAC DOP = PARALLEL_THREADS_PER_CPU x CPU_COUNT x INSTANCE_COUNT
INSTANCE_COUNT一般是节点个数,如果使用的ORACLE RAC services来限制节点数目的话就是,实际属于的service的节点数。例如在 8 CPU,非 ORACLE RAC services,4节点的集群。默认的 DOP 为2 * 8 * 4=64
注意:PARALLEL_THREADS_PER_CPU (一般为2,也就是每个CPU可使用的并行线程数)
默认的DOP算法并设置来最大限度的利用资源。在多用户环境中,不建议使用默认的并行读。当然一个SQL语句的DOP可以通过资源管理器进行限制。
自动并行深度策略:
当参数PARALLEL_DEGREE_POLICY设置为AUTO。Oracle会自动的确定一个语句是否要使用并行,并且DOP应该为多少。确定资源能否满足并行,否则就顺序执行,直到资源足够。
下面是当并行策略设置为AUTO时,一个并行语句处理过程:
1.一个SQL 语句被发布
语句被解析,并且优化器决定执行计划
3.PARALLEL_MIN_TIME_THRESHOLD初始化参数的线程限制被检查(默认是10s)
a.如果执行时间小于线程限制,那么会顺序执行
b.如果执行时间超过了限制,那么语句会以优化器计算的DOP并行执行
为了不压倒系统,优化器在决定DOP的时候会进行限制,这个限制有参数PARALLEL_DEGREE_LIMIT指定。
默认是CPU,意味着进程数目限制是操作系统的CPUs(PARALLEL_THREADS_PER_CPU * CPU_COUNT * 可用的实例数),也就是default DOP。通过调整这个参数,你可以设置最大DOP。
1.3 使用DML,DDL 以及并行查询
并行查询的规则:
决定并行
一个select 语句只有在下列条件满足的时候才可以被并行执行:
1.查询包含了并行hint(parallel 或 parallel_index)或相关查询的方案对象被分配了PARALLEL申明
2.在查询中的至少一个表满足下列之一:
–一个全部扫描
–一个索引范围扫描跨越多个分区
3.在select的列中没有子查询。
对于DOP,查询使用所有表声明的最大的DOP,因此索引或表上的最大DOP决定查询使用的DOP。
DLL 语句的规则:
DDL可以在执行的时候指定 PARALLEL子句。并行度的声明会存储到数据字典中(这就是为什么在创建完之后,需要人工去修改)
还可以使用 ALTER SESSION FORCE PARALLEL DDL 语句覆盖在一个会话中DDL中的并行子句。
dop,被 PARALLEL子句决定,除非被ALTER SSESSION FORCE PARALLEL DDL语句覆盖。重建一个分区索引不会使用并行。
alter index … rebuild 语句只能在非分区索引上执行并行,但是 alter index .. rebuild paratition 也可以使用并行。
CREATE TABLE AS SELECT语句中查询部分可以被并行必须满足下列条件,和一般查询的条件类似:
1.查询包含 hint (PARALLEL 或 PARALLEL_INDEX)或者创建的语句有PARALLEL子句,或相关查询的对象有PARALLEL声明
2.至少一个表有全表扫描或者索引范围扫描跨多个分区。
CREATE 部分使用并行的条件:
必须使用PARALLEL 子句或者 ALTER SESSION FORCE PARALLEL DDL 语句。
DML 的并行(update,merge 和delete)
只有当在会话中启用了并行DML时,DML才能被并行:
alter session enable parallel dml;
因为 并行DML和串行DML有不同的锁,事务和磁盘空间需求。
在默认情况下并行DML在会话中是禁用的。即便使用PARALLEL hint,DML还是不会并行执行。
当然即便enable 了DML 并行,如果没有并行的hint或者表上没有并行的熟悉,那么操作仍然还是串行的。
–注意这个只是影响 DML语句,DML中其他扫描,join操作仍然是可以并行的。不影响SELECT语句,DDL和DML语句的查询部分。
在PARALLEL DML 模式开启的清下,可以使用并行子句或者使用hint 来使用并行。
当然可以使用强制语句来使用并行,即使表上没有并行属性:
ALTER SESSION FORCE PARALLEL QUERY;
–强制DML,DDL也是一样,这个语句覆盖所有随后的并行语句,但是会被hint覆盖。这种可以在OLTP环境中,表上并未设置并行,在脚本执行前运行这个,可以让脚本并行执行(并行收集数据)。从未不用来回修改表的并行度。
2 传输表空间
2.1 传输表空的要求和限制
要完成传输表空间,如果是不同的平台,那么compatibility至少为10.0.0.
平台支持查询:
COLUMN PLATFORM_NAME FORMAT A36 、
SELECT * FROM V$TRANSPORTABLE_PLATFORM ORDER BY PLATFORM_NAME;
如果源段的字节序和目标端平台不一致,那么需要进行额外的步骤,在目标端或源端进行表空间的转换,将字节序转换到目标端格式。如果有相同的字节序则不需要进行转换
使用传输表空间有如下限制:
- 源端数据库和目标数据库必须是兼容的数据库字符集,下列之一必须满足:
- 源端和目标端数据库必须有相同的字符集
2.源端数据的字符集是目标数据库字符集的严格(二进制)子集,并且下列3个条件必须满足:
-源端数据库必须在10.1.0.3版本以上
-被传输的表空间不包含有字符长度语义的表字段,或者最大字符长度在源端和目标端数据库字符集是一致的
-被传输的表空间没有CLOB数据类型的字段,或者源端和目标端数据库字符集都是单字节或者双字节的。
- 源端数据的字符集是目标数据库字符集的严格(二进制)子集,并且下列2个条件必须满足:
-源数据库的版本低于10.1.0.3
-最大字符长度在源端和目标端数据库字符集是一致
- 源端和目标端数据库使用兼容的国家字符集,特别地,下列条件之一必须满足:
1.源端和目标端数据库的国家字符集是相同的
2.源端的数据库版本在10.1.0.3以上,并且传输的表空间中不包含NCHAR,NVARVHR2或者NCLOB数据类型的字段。
- 源端和目标端的表空间名称不能一样,如果被传输的表空间名称被使用,需要在目标端或者源端首先重命名。
- 那些底层的对象(例如物化视图),或者被包含的对象(例如被分区的表)不会被传输,除非这些对象都在表空间集中
- 加密表空间有如下限制:
1.如果目标端有钱包设置,必须先拷贝wallet,传输完毕后再修改密码。
2.如果目标端已经配置了wallet,那么不能传输表空间,只能用数据泵来进行
3.不能在使用不同字节序的平台上传输加密表空间
- 没使用块加密,但是表中包含加密字段的表空间不能传输。
还有一些关于XML类型的限制
额外的限制包括:
–系统表空间对象:你不能传输SYSTEM表空间或者那些属于sys用户的对象。这些对象例如:PL/SQL,java类,视图,同义词,等等
兼容性需求,目标端的兼容性版本必须相等或者更高。
2.2 传输表空间的步骤
在2个数据库之间传输表空间的例子:
1.对于跨平台的传输,首先查询V$TRANSPORTABLE_PLATFORM 视图检查字节序。相同平台不用检查
SELECT d.PLATFORM_NAME, ENDIAN_FORMAT FROM V$TRANSPORTABLE_PLATFORM tp, V$DATABASE d WHERE tp.PLATFORM_NAME = d.PLATFORM_NAME;
2.选择一个自包含的表空间
检查自包含:
EXECUTE DBMS_TTS.TRANSPORT_SET_CHECK('sales_1,sales_2', TRUE); SELECT * FROM TRANSPORT_SET_VIOLATIONS;
–如果这个视图无消息,说明是自包含的。
3.在源数据库,将表空间置为只读模式并且生成一个传输表空间集
这个表空间集包含了表空间的源数据。使用expdp来执行。
将所有的表空间只读:
alter tablespace sales_1 read only;
调用expdp工具进行导出:
expdp system dumpfile=expdat.dmp directory=data_pump_dir transport_tablespaces=sales_1,sales_2 logfile=tts_export.log
如果你想在导出的时候进行自包含检查,还可以设置TRANSPORT_FULL_CHECK 参数。这样如果表空间不是自包含的,那么导出会时报。你必须进行第2步来解决所有的问题
在源端进行切换:
RMAN target / CONVERT TABLESPACE sales_1,sales_2 TO PLATFORM 'Microsoft Windows IA (32-bit)' FORMAT '/tmp/%U';
如果平台的字节序不同,需要进行转换
4.传输表空间集
拷贝数据文件和导出文件到目标端可访问的位置。
如果在源端没进行切换,那么在目标端进行切换
如果目标端和源端均为文件系统,你可以使用下列方式进行传输:
任何cp的工具(例如scp或ftp)DBMS_FILE_TRANSFER包,RMAN
如果源端和目标端是在ASM磁盘组上:
你可以使用DBMS_FILE_TRANSFER包,RMAN
在目标端上进行切换:
CONVERT DATAFILE 'C:\Temp\sales_101.dbf', 'C:\Temp\sales_201.dbf' TO PLATFORM="Microsoft Windows IA (32-bit)" FROM PLATFORM="Solaris[tm] OE (32-bit)" DB_FILE_NAME_CONVERT= 'C:\Temp\', 'C:\app\orauser\oradata\orawin\' PARALLELISM=4;
5.可选项。重建表空间到read/write 模式
ALTER TABLESPACE sales_1 READ WRITE; ALTER TABLESPACE sales_2 READ WRITE;
6.在目标端,导入表空间集-使用impdp导入。
impdp system dumpfile=expdat.dmp directory=data_pump_dir transport_datafiles=c:\app\orauser\oradata\orawin\sales_101.dbf,c:\app\orauser\oradata\orawin\sales_201.dbf remap_schema=sales1:crm1 remap_schema=sales2:crm2 logfile=tts_import.log
Comment