• 1. (本页无文本内容)
  • 2. Oracle数据库高级技术交流 ---大批量数据处理技术Oracle(中国)顾问咨询部 罗 敏 资深技术顾问 电话:13321161702 eMail: Michael.luo@oracle.com
  • 3. 交流内容分区技术 报表优化技术 并行处理应用经验
  • 4. Oracle的分区技术
  • 5. 分区技术内容什么是分区? 分区的好处? 如何实施分区? 如何评估分区的效果?
  • 6. Oracle的分区技术基本原理分而治之 SB_ZSXX按年度进行分区2003200420052006
  • 7. 分区概述大数据对象 (表, 索引)被分成小物理段 当分区表建立时,记录基于分区字段值被存储到相应分区。 分区字段值可以修改。(row movement enabled) 分区可以存储在不同的表空间 分区可以有不同的物理存储参数 分区支持IOT表,对象表,LOB字段,varrays等
  • 8. 分区技术的效益和目标性能 Select和DML操作只访问指定分区 并行DML操作 Partition-wise Join 可管理性:数据删除,数据备份 历史数据清除 提高备份性能 指定分区的数据维护操作 可用性 将故障局限在分区中 缩短恢复时间 分区目标优先级 高性能 –>数据维护能力->实施难度 –> 高可用性(故障屏蔽能力)
  • 9. 分区方法分区方法: 范围 --- 8 Hash --- 8i 列表 --- 9i 组合 --- 8iRange partitioningHash partitioningComposite partitioningList partitioning
  • 10. 123CREATE TABLE sales (acct_no NUMBER(5), person VARCHAR2(30), sales_amount NUMBER(8), week_no NUMBER(2)) PARTITION BY RANGE (week_no) (PARTITION P1 VALUES LESS THAN (4) TABLESPACE data0, PARTITION P2 VALUES LESS THAN (8) TABLESPACE data1, ...… PARTITION P13 VALUES LESS THAN (53)TABLESPACE data12 );分区字段:week_no. VALUES LESS THAN 必须是确定值 每个分区可以单独指定物理属性123范围分区例
  • 11. 最早、最经典的分区算法 Range分区通过对分区字段值的范围进行分区 Range分区特别适合于按时间周期进行数据的存储。日、周、月、年等。 数据管理能力强 数据迁移 数据备份 数据交换 范围分区的数据可能不均匀 范围分区与记录值相关,实施难度和可维护性相对较差范围分区特点
  • 12. Hash分区例create table CUSTOMERS (... column definitions ...) pctfree 0 nologging storage ( initial 40m next 40m pctincrease 0 ) partition by hash(customer_no) partitions 8 store in (cust_data01,cust_data02) create table CUSTOMERS (... column definitions ...) pctfree 0 nologging storage ( initial 40m next 40m pctincrease 0 ) partition by hash(customer_no) (partition cust_p01 tablespace cust_data01 ,partition cust_p02 tablespace cust_data02 ,partition cust_p03 tablespace cust_data03 ,partition cust_p04 tablespace cust_data04 ,partition cust_p05 tablespace cust_data05 ,partition cust_p06 tablespace cust_data06 ,partition cust_p07 tablespace cust_data07 ,partition cust_p08 tablespace cust_data08)
  • 13. Hash分区特点基于分区字段的HASH值,自动将记录插入到指定分区。 分区数一般是2的幂 易于实施 总体性能最佳 适合于静态数据 HASH分区适合于数据的均匀存储 HASH分区特别适合于PDML和partition-wise joins。 支持 (hash) local indexes 9i 不支持 (hash) global indexes 10g 支持(hash) global indexes HASH分区 数据管理能力弱 HASH分区对数据值无法控制
  • 14. 列表分区例create table addresses (... column definitions ...) pctfree 0 nologging storage ( initial 40m next 40m pctincrease 0 ) partition by list(city_name) (partition addr_p01 values ('WELLINGTON') tablespace addr_data01 ,partition addr_p02 values ('CHRISTCHURCH') tablespace addr_data02 ,partition addr_p03 values ('DUNEDIN','INVERCARGILL') tablespace addr_data03 ,partition addr_p04 values ('AUCKLAND') tablespace addr_data04 ,partition addr_p05 values ('HAMILTON','ROTORUA','TAURANGA') tablespace addr_data05)
  • 15. 列表分区特点List分区通过对分区字段的离散值进行分区。 List分区是不排序的,而且分区之间没有关联关系 List分区适合于对数据离散值进行控制。 List分区只支持单个字段。 List分区具有与范围分区相似的优缺点 数据管理能力强 List分区的数据可能不均匀 List分区与记录值相关,实施难度和可维护性相对较差
  • 16. 复合分区例create table daily_trans_data (...column definitions ...) partition by range(trans_datetime) subpartition by hash(customer_no) subpartitions 8 store in (dtd_data01,dtd_data02) (partition dtd_20010620 values less than (to_date('21-jun-2001','dd-mon-yyyy')) (subpartition dtd_20010620_s01 ,subpartition dtd_20010620_s02 ,subpartition dtd_20010620_s03 tablespace dtd_data03 ,subpartition dtd_20010620_s04 tablespace dtd_data04 ,subpartition dtd_20010620_s05 tablespace dtd_data05 ,subpartition dtd_20010620_s06 tablespace dtd_data06 ,subpartition dtd_20010620_s07 tablespace dtd_data07 ,subpartition dtd_20010620_s08 tablespace dtd_data08 ) ,partition dtd_20010621 values less than (to_date('22-jun-2001','dd-mon-yyyy')) ,partition dtd_20010622 values less than (to_date('23-jun-2001','dd-mon-yyyy')) subpartitions 4 )
  • 17. 复合分区图示
  • 18. 复合分区特点Oracle支持的Composite分区: Range-Hash,Range-List 既适合于历史数据,又适合于数据均匀分布 与范围分区一样提供高可用性和管理性 更好的PDML和partition-wise joins性能 实现粒度更细的操作 支持复合 local indexes 不支持复合composite global indexes?
  • 19. 分区索引 不分区 分区 不分区 分区 表索引√√√√
  • 20. Global Nonpartitioned indexLocal partitioned indexGlobal Partitioned Index不同的分区索引绍兴杭州温州03年04年…08年
  • 21. 分区索引分区表索引的分类: Local Prefixed index Local Non-prefiexed index Global Prefixed index Non Partition Index Global索引的分区不同与表分区 Local索引的分区与表分区相同 An index is prefixed if it is partitioned on a left prefix of the index columns. 分区表上的非分区索引等同于Global索引
  • 22. 分区索引Global索引必须是范围分区 --- 9i之前 Global索引可以是HASH分区 -- 10g新特性 Global索引不支持Bitmap索引 Unique索引必须是prefixed,或者包含分区字段 Local索引(non-prefixed, non-unique)可以不包含分区字段
  • 23. create index cust_idx1 on customers(customer_name) global partition by range (customer_name) (partition cust_p01 values less than (‘H’) tablespace cust_index01 ,partition cust_p02 values less than (‘N’) tablespace cust_index02 ,partition cust_p03 values less than (‘T’) tablespace cust_index03 ,partition cust_p04 values less than (MAXVALUE) tablespace cust_index04) create index cust_idx2 on customers(customer_no) local (partition cust_idx_p01 tablespace cust_index01 ,partition cust_idx_p02 tablespace cust_index02 ,partition cust_idx_p03 tablespace cust_index03 ,partition cust_idx_p04 tablespace cust_index04 ,partition cust_idx_p05 tablespace cust_index05 ,partition cust_idx_p06 tablespace cust_index06 ,partition cust_idx_p07 tablespace cust_index07 ,partition cust_idx_p08 tablespace cust_index08) create index cust_idx3 on customers(customer_type) local;分区索引举例
  • 24. 分区表索引的使用OLTP系统中的建议 Global和unique local index性能优于nonunique local index Local index提供了更好的可用性 数据仓库系统中的建议 Local index更适合于数据装载和分区维护 在大量数据统计时,能充分利用Local index并行查询能力 在性能、高可用性和可管理性之间进行平衡
  • 25. 分区索引选择策略
  • 26. 分区裁剪功能Partition pruning: Only the relevant partitions are accessed.99-May99-Apr99-Feb99-Jan99-Mar99-JunsalesSQL> SELECT SUM(sales_amount) 2 FROM sales 3 WHERE sales_date BETWEEN 4 TO_DATE(‘01-MAR-1999’, 5 ‘DD-MON-YYYY’) AND 6 TO_DATE(‘31-MAY-1999’, 7 ‘DD-MON-YYYY’);
  • 27. 分区裁剪举例1 select * from daily_trans_summ 2* where trans_datetime between to_date('25-jun-2001 08','DD-mon-yyyy hh24') and to_date('28-jun-2001 18','DD-mon-yyyy hh24') Partition Partition Operation Options Object Name Start Stop -------------------- ------------ --------------------- ------------ ------------ SELECT STATEMENT PARTITION RANGE ITERATOR 231 234 TABLE ACCESS FULL DAILY_TRANS_SUMM 231 234 1 select * from daily_trans_summ 2* where trans_datetime in ('25-jun-2001','28-jun-2001') Partition Partition Operation Options Object Name Start Stop -------------------- ------------ --------------------- ------------ ------------ SELECT STATEMENT PARTITION RANGE INLIST KEY(INLIST) KEY(INLIST) TABLE ACCESS FULL DAILY_TRANS_SUMM KEY(INLIST) KEY(INLIST)
  • 28. Nonpartition-wise joinFull partition-wise joinPartial partition-wise joinQuery slavePartitionPartitioned table123Partition-Wise Join
  • 29. Partition-wise JoinsTables and indexes that are partitioned identically are equi-partitioned. A full partition-wise join occurs when joining two equi-partitioned tables that are partitioned on the join key. Oracle splits the join into joins of pairs of partitions. A partial partition-wise join occurs when only one of the tables is partitioned on the join key. Partition-wise joins occur when joining a hash partition table to a composite partition table if the hash partitioning and sub-partitioning is on the join key. Oracle assigns parallel query slaves to process the partition joins.
  • 30. Partition-wise Joins举例1 select /*+ full(c) */ c.customer_no, count(*) 2 from customers c, daily_trans_data d 3 where c.customer_no = d.customer_no 4 and d.trans_datetime between to_date('25-jun-2001','dd-mon-yyyy') 5 and to_date('28-jun-2001','dd-mon-yyyy') 6* group by c.customer_no Partition Partition Operation Options Object Name Start Stop ------------------------- ------------ ---------------- ------------ ------------ SELECT STATEMENT PARTITION HASH ALL 1 8 SORT GROUP BY HASH JOIN PARTITION RANGE ITERATOR 50 53 TABLE ACCESS FULL DAILY_TRANS_DATA 393 424 TABLE ACCESS FULL CUSTOMERS 1 8
  • 31. 分区表设计原则表的大小:当表的大小超过1.5GB-2GB,或对于OLTP系统,表的记录超过1000万,都应考虑对表进行分区。 数据访问特性:基于表的大部分查询应用,只访问表中少量的数据。对于这样表进行分区,可充分利用分区排除无关数据查询的特性。 数据维护:按时间段删除成批的数据,例如按月删除历史数据。对于这样的表需要考虑进行分区,以满足维护的需要。 数据备份和恢复: 按时间周期进行表空间的备份时,将分区与表空间建立对应关系。 只读数据:如果一个表中大部分数据都是只读数据,通过对表进行分区,可将只读数据存储在只读表空间中,对于数据库的备份是非常有益的。 并行数据操作:对于经常执行并行操作(如Parallel Insert,Parallel Update等)的表应考虑进行分区。 表的可用性:当对表的部分数据可用性要求很高时,应考虑进行表分区。
  • 32. 分区表的管理功能分区的增加(ADD) 分区的删除(DROP) 分区的合并(MERGE) 分区的清空(TRUNCATE) 分区的交换(EXCHANGE) 分区的压缩(COALESE) 分区的移动(MOVE) 分区的分离(SPLIT) 修改分区的Default Attribute 分区的更名(RENAME)
  • 33. 分区索引的管理功能分区索引的删除(DROP) 分区索引的修改(MODIFY) 分区索引Default Attribute的修改 分区索引的重建(REBUILD) 分区索引的更名(RENAME) 分区索引的分离(SPLIT) 分区索引的Unusable
  • 34. 分区表和Local索引OCT 2002SEP 2002AUG 2002NOV 2001OCT 2001新月份数据的加载和索引的维护NOV 2002NOV 2002NOV 2002NOV 2002NOV 2002NOV 2002NOV 2002NOV 2002NOV 2002NOV 2002...“滚动窗口”操作 - 大量数据高速装载
  • 35. OCT 2002SEP 2002NOV 2002NOV 2001NOV 2001OCT 2001OCT 2002SEP 2002NOV 2002DEC 2001NOV 2001OCT 2001OCT 2002SEP 2002NOV 2002DEC 2001NOV 2001OCT 2001OCT 2002SEP 2002NOV 2002DEC 2001NOV 2001OCT 2001OCT 2002SEP 2002NOV 2002DEC 2001NOV 2001OCT 2001OCT 2002SEP 2002NOV 2002DEC 2001NOV 2001OCT 2001OCT 2002SEP 2002NOV 2002DEC 2001NOV 2001OCT 2001OCT 2002SEP 2002NOV 2002DEC 2001NOV 2001OCT 2001NOV 2002删除或归档最老月份的数据OCT 2001OCT 2001新月份数据的加载和索引的维护...分区表和Local索引“滚动窗口”操作 - 大量数据高速装载
  • 36. 分区交换功能通过交换数据段,实现分区和非分区表的数据交换。以及子分区和分区表的数据交换 非常快捷的数据移动方式。特别是没有validation和索引维护操作时 Local 索引自动维护 Global索引必须重建
  • 37. 分区交换的应用--- 全文检索12:00分区 BF_DXX_stage中间表(1)1:00数据的加载 (2)建立context 索引 (3)partition的exchangeBF_DXX表* 初始化工作* 整理工作… …2:00分区1:00分区
  • 38. 分区交换的应用--- 全文检索第一步:1:00数据的加载 insert into BF_DXX_stage(SJ,TEXT3) values(to_date('2004.03.02','YYYY.MM.DD'),'大撒反对撒'); 第二步:建立context 索引 CREATE INDEX IDX_ BF_DXX _STAGE ON BF_DXX_stage(text3) INDEXTYPE IS CTXSYS.CONTEXT PARAMETERS ('LEXER MYLEXER STORAGE MYSTORE FILTER CTXSYS.NULL_FILTER MEMORY 100M') parallel 4; 第三步:partition的交换 alter table BF_DXX exchange partition p2 with table BF_DXX_stage including indexes;
  • 39. 迁移表空间(Transportable Tablespace)技术简介 第一步:exp transport_tablespace=yes 第二步:FTP 数据文件和dmp文件 第三步:imp transport_tablespace=yes 地市系统imp卸载文件省级系统 FTP数据文件卸载文件数据文件exp
  • 40. 迁移表空间技术的作用业务系统数据向数据仓库系统的迁移 对业务系统和数据仓库系统的数据进行定期归档 数据仓库向数据集市的数据迁移 数据对外发布 按表空间进行时间点的数据恢复(TSPITR)
  • 41. 迁移表空间技术的优点性能大大高于export/import或PL/SQL编写的程序 由于Dmp文件只包含表空间的结构信息,因此该技术的真正开销在于数据文件的传输。 对源系统的影响非常小 只需要将被迁移的表空间设置为只读方式 可同时传输索引数据,避免在目的数据库中重建索引
  • 42. 分区交换的应用--- ETL在源系统中,将需要抽取的数据以如下语句形式,抽取到建立在单独表空间上的中间表中: CREATE TABLE ... AS SELECT … INSERT /*+ APPEND */ AS SELECT … 以TTS方式将中间表的表空间传输到数据仓库之中。 exp transportable_tablespace=Yes … FTP 中间表表空间的数据文件 imp transportable_tablespace=Yes … 在数据仓库中对中间表进行各种数据归并等清洗工作,并建立需要的各种索引。 通过exchange技术,将中间表数据及索引直接交换到分区表中。 Alter table <分区表> exchange partition <分区名> with table <中间表> including indexes;  
  • 43. 分区交换的应用---重复记录删除问题描述: 在使用SQL*Loader进行数据加载sor_acct_dcc_saamt_c表时,由于操作失误,重复加载,导致分区ETL_LOAD_DATE_0606出现重复记录,也使得两个唯一索引:IDX_SAACNAMT_C_1,IDX_SAACNAMT_C_2的ETL_LOAD_DATE_0606分区不可用(UNUSABLE)。 用户在试图重新创建该分区索引时,出现如下错误: SQL> alter index IDX_SAACNAMT_C_2 rebuild partition ETL_LOAD_DATE_0606; alter index IDX_SAACNAMT_C_2 rebuild partition ETL_LOAD_DATE_0606 * ORA-01452: cannot CREATE UNIQUE INDEX; duplicate keys found
  • 44. 分区交换的应用---重复记录删除在试图删除该分区的重复记录时,又出现如下错误: SQL> delete from sor_acct_dcc_saamt_c partition(ETL_LOAD_DATE_0606) where rowid not in (select min(rowid) from sor_acct_dcc_saamt_c partition(ETL_LOAD_DATE_0606) group by ETL_LOAD_DATE, CUST_ACCT_NO, SA_CURR_COD, SA_CURR_IDEN); * ORA-01502: index 'GYFX.IDX_SAACNAMT_C_1' or partition of such index is in unusable state
  • 45. 分区交换的应用---重复记录删除简单办法是彻底删除这两个唯一索引,重新创建。 数据量大,时间太长。 影响系统的可用性。 更完备的解决方式 创建一个与sor_acct_dcc_saamt_c结构一样的临时表test。 SQL> create table test as select * from sor_acct_dcc_saamt_c where 1=2; 将sor_acct_dcc_saamt_c表分区ETL_LOAD_DATE_0606数据交换到临时表test。 SQL> alter table sor_acct_dcc_saamt_c exchange partition ETL_LOAD_DATE_0606 with table test;
  • 46. 分区交换的应用---重复记录删除更完备的解决方式 删除test中的重复记录 delete from test where rowid not in (select min(rowid) from test group by ETL_LOAD_DATE, CUST_ACCT_NO, SA_CURR_COD, SA_CURR_IDEN); 因为test表没有任何索引,可避免上述ORA-01502错误。 将临时表test数据交换回sor_acct_dcc_saamt_c表分区ETL_LOAD_DATE_0606 。 alter table sor_acct_dcc_saamt_c exchange partition ETL_LOAD_DATE_0606 with table test;
  • 47. 分区交换的应用---重复记录删除更完备的解决方式 重新创建创建该分区索引IDX_SAACNAMT_C_1,IDX_SAACNAMT_C_2 alter index IDX_SAACNAMT_C_1 rebuild partition ETL_LOAD_DATE_0606 tablespace ETL0_R_LOAD_IDX_200606; alter index IDX_SAACNAMT_C_2 rebuild partition ETL_LOAD_DATE_0606 tablespace ETL0_R_LOAD_IDX_200606; 此时重复记录已经删除,可避免上述ORA-01452错误
  • 48. 现有系统实施分区的经验分区对象的确定:存储空间最大的前20个表 Select * from (Select * from dba_segments order by bytes desc) where rownum <= 20; 分析大表的操作行为 Select * from (Select sql_text,executions from v$sqlarea where upper(sql_text) like ‘%SB_ZSXX%’ order by executions desc) where rownum <= 20; 综合其它分区因素的考虑:性能,数据迁移,备份,高可用性,可维护性
  • 49. 分区的评估性能方面 相应速度 资源消耗(CPU、内存、I/O) 性能分析工具的使用:Oracle Trace, Autotrace, TKPROF 其它方面 数据迁移能力 数据备份和恢复 数据扩展性(Add, Drop, Exchange, Merge, …) 数据高可用性
  • 50. Oracle报表优化技术
  • 51. 报表处理问题报表处理是大部分IT系统是最耗时、最消耗资源的模块 报表处理,主要通过Formula One、BO等报表处理工具实现 SQL语句基本都是各种统计运算语句。…SUM… GROUP BY 各种报表的表格单元都是统计运算语句生成。统计运算语句量非常大 统计运算语句,基本都是从一些交易明细表或基表,直接进行汇总运算操作
  • 52. 其他汇总数据按月汇总的 逾期未归还贷款本金的统计查询交易 明细查询 自动重写汇总数据管理 - 物化视图 Materialized View 辽宁省和四川省逾期91-180天未归还贷款本金的贷款用户总数 ?按地区汇总的 逾期未归还贷款本金的统计
  • 53. 物化视图SQL查询的实例化 物化视图可以设置成查询重写功能 刷新类型: Complete or Fast Force or Never 刷新模式: Manual Automated (同步或异步)
  • 54. 查询重写概述查询物化视图,而不是基表,将极大提高查询统计性能。 查询重写功能对应用透明。不需要特殊权限。 查询重写 与大小写无关 不支持子查询
  • 55. 物化视图创建例SQL> CREATE MATERIALIZED VIEW sales_summary 2 TABLESPACE users 3 PARALLEL (DEGREE 4) 4 BUILD IMMEDIATE 5 ENABLE QUERY REWRITE 6 AS 7 SELECT p.prod_name, 8 SUM (s.quantity_sold), 8 SUM (s.amount_sold) 9 FROM sales s, products p 10 WHERE s.prod_id = p.prod_id 11 GROUP BY p.prod_name;
  • 56. 物化视图创建和查询重写例SQL> SELECT p.prod_name,SUM (s.quantity_sold), 2 SUM (s.amount_sold) 3 FROM sales s, products p 4 WHERE s.prod_id = p.prod_id 5 GROUP BY p.prod_name; SQL> select operation, object_name 2 from v$sql_plan 3 where object_name like 'SALES%'; OPERATION NAME ---------------------- ----------------- SELECT STATEMENT TABLE ACCESS SALES_SUMMARY
  • 57. 报表优化的基本思路 以报表为单位,分析现有报表的SQL语句。总结统计运算SQL的共同规律,作为设计物化视图的考虑对象。 定义相应的物化视图。包括SQL查询语句的编写,刷新方式的确定等 评价原有统计运算SQL语句的执行计划,是否被Oracle查询重写到相应的物化视图 评价如何在物化视图上创建索引 评估所有物化视图数据和索引的空间消耗情况,从而确定物化视图数据和索引表空间的容量
  • 58. 报表优化示例 现有统计运算语句 SELECT ts_stab.VIP_ORG_STAFF.VIP_ORGAN3_NAME, ts_stab.VIP_ORG_STAFF.VIP_ORGAN2_NAME, sum(ts_dyna.VIP_ACCT_ALL.T1)/100, sum(ts_dyna.VIP_ACCT_ALL.T29)/100 ))/100 FROM ts_stab.VIP_ORG_STAFF, ts_dyna.VIP_ACCT_ALL WHERE (ts_dyna.VIP_ACCT_ALL.STAFF_ID=ts_stab.VIP_ORG_STAFF.STAFF_ID) AND (( ( ts_stab.VIP_ORG_STAFF.VIP_ORGAN3 ) = 'org2' OR 'ALL'='org2' ) AND ( ( ts_stab.VIP_ORG_STAFF.VIP_ORGAN2 ) = 'ALL' OR 'ALL'= 'ALL' ) AND ( ( ts_dyna.VIP_ACCT_ALL.ACCOUNT_DATE ) >= '200401' AND ( ts_dyna.VIP_ACCT_ALL.ACCOUNT_DATE ) <= '200401' )) GROUP BY ts_stab.VIP_ORG_STAFF.VIP_ORGAN3_NAME, ts_stab.VIP_ORG_STAFF.VIP_ORGAN2_NAME
  • 59. 报表优化示例 物化视图定义 CREATE MATERIALIZED VIEW MV_01 TABLESPACE TS_TAB_DYN PARALLEL (DEGREE 2) BUILD IMMEDIATE REFRESH COMPLETE ON DEMAND ENABLE QUERY REWRITE AS SELECT ts_stab.VIP_ORG_STAFF.VIP_ORGAN3_NAME, ts_stab.VIP_ORG_STAFF.VIP_ORGAN2_NAME, ts_stab.VIP_ORG_STAFF.VIP_ORGAN3, ts_stab.VIP_ORG_STAFF.VIP_ORGAN2, ts_dyna.VIP_ACCT_ALL.ACCOUNT_DATE, sum(ts_dyna.VIP_ACCT_ALL.T1), sum(ts_dyna.VIP_ACCT_ALL.T29) FROM ts_stab.VIP_ORG_STAFF, ts_dyna.VIP_ACCT_ALL WHERE ( ts_dyna.VIP_ACCT_ALL.STAFF_ID=ts_stab.VIP_ORG_STAFF.STAFF_ID ) GROUP BY ts_stab.VIP_ORG_STAFF.VIP_ORGAN3_NAME, ts_stab.VIP_ORG_STAFF.VIP_ORGAN2_NAME, ts_stab.VIP_ORG_STAFF.VIP_ORGAN3, ts_stab.VIP_ORG_STAFF.VIP_ORGAN2, ts_dyna.VIP_ACCT_ALL.ACCOUNT_DATE
  • 60. 报表优化示例 TABLESPACE TS_TAB_DYN:物化视图MV_01存放的表空间。建议为物化视图单独设立表空间 PARALLEL (DEGREE 2):并行度设计为2(与目前的CPU个数相等) BUILD IMMEDIATE:创建MV_01的同时,产生汇总数据 REFRESH COMPLETE ON DEMAND:完全刷新 ENABLE QUERY REWRITE:启动查询语句重写功能
  • 61. 报表优化示例 SELECT短语应包含的字段 原SELECT语句的所有非统计运算字段。 ts_stab.VIP_ORG_STAFF.VIP_ORGAN3_NAME, ts_stab.VIP_ORG_STAFF.VIP_ORGAN2_NAME, 原SELECT语句中所有查询条件涉及到的字段。如: ts_stab.VIP_ORG_STAFF.VIP_ORGAN3, ts_stab.VIP_ORG_STAFF.VIP_ORGAN2, ts_dyna.VIP_ACCT_ALL.ACCOUNT_DATE, 原子化(Primitive)的统计运算字段。即去掉表达式的统计运算字段 sum(ts_dyna.VIP_ACCT_ALL.T1), sum(ts_dyna.VIP_ACCT_ALL.T29),
  • 62. 报表优化示例 创建物化视图上的索引 create index idx_MV_01_01 on MV_01(VIP_ORGAN3) tablespace TS_IND_DYNA; 物化视图上的刷新 定期执行如下命令,可自动进行物化视图的刷新 exec dbms_mview.refresh('TS_DYNA.MV_01');
  • 63. 报表优化示例 初始化参数的设置 query_rewrite_enabled:TRUE query_rewrite_integrity:STALE_TOLERATED 权限方面的设置 grant CREATE ANY MATERIALIZED VIEW to TS_DYNA; grant GLOBAL QUERY REWRITE to TS_DYNA;
  • 64. 并行处理经验介绍
  • 65. 并行处理概述 Oracle并行处理技术无处不在! 只要是大批量数据处理,就要考虑并行处理 并行处理的先决条件 大批量数据处理 多CPU(SMP),CPU利用率不高 足够的内存 I/O负载不高 并发用户少
  • 66. 并行SQL语句举例 insert into SUM_ACCT_DCC_SAACN_P SELECT '20050930', a.sa_acct_no, nvl(b.sa_curr_cod, '01'), nvl(b.sa_curr_iden, '0'), …. … FROM sor_acct_dcc_saacn_p_20050930 a left join sor_acct_dcc_saamt_p_20050930 b on a.sa_acct_no = b.sa_acct_no and a.etl_load_date = b.etl_load_date left join sor_acct_dcc_crcrdcrd c on a.sa_card_no = c.cr_crd_no where a.etl_load_date = '20050930' 1小时30分钟 A: 10,657,379 B: 10,548,397 C: 9,142,893
  • 67. 并行SQL语句举例 alter session enable parallel dml ; insert /*+ append parallel(d,12) */ into SUM_ACCT_DCC_SAACN_P d nologging SELECT /*+ parallel(a,12) parallel(b,12) parallel(c,12) */ '20050930', a.sa_acct_no, nvl(b.sa_curr_cod, '01'), nvl(b.sa_curr_iden, '0'), … … FROM sor_acct_dcc_saacn_p_20050930 a left join sor_acct_dcc_saamt_p_20050930 b on a.sa_acct_no = b.sa_acct_no and a.etl_load_date = b.etl_load_date left join sor_acct_dcc_crcrdcrd c on a.sa_card_no = c.cr_crd_no where a.etl_load_date = '20050930' 16分钟!
  • 68. 并行SQL语句举例 direct path insert、nologging 并行处理技术
  • 69. 数据加载中的并行处理 在控制文件(.ctl)中进行参数设置 direct path load DIRECT = TRUE 并行处理技术 PARALLEL = TRUE
  • 70. 统计信息采集效率的提高 dbms_stats.gather_table_stats(ownname=>’OSS_SA_91’,tabname=>’TF_B_WORKFLOW’,estimate_percent=>50,degree=>4,cascade=>TRUE); /* 单表统计信息采集 */ 序号 采样率 并行度 统计的记录数 统计时间 1 100 1 2832295 00:04:04.97 2 100 8 2832295 00:02:17.35 3 100 16 2832295 00:02:28.49 4 50 8 2842306 00:00:47.57 5 10 8 2822538 00:00:27.31 6 1 8 2860300 00:00:24.68
  • 71. 统计信息采集的建议 设置并行度 只对最消耗资源SQL语句(Top-Session)所涉及的表进行统计信息采集 设定采样率参数 只对当前分区数据进行采集 考虑block_sample=>TRUE,method_opt=>‘FOR ALL INDEXED COLUMNS ’等参数 编写统计信息采集工作的脚本,并在非生产时间的夜间定期执行,同时与其它后台处理错开时间
  • 72. (本页无文本内容)