• 1. 性能调整时间:2004.06.23
  • 2. 计划任务模块调整
  • 3. 计划任务(现状)现在的解决方法 小表:采用了snapshot的方法 大表:KHTKHXL0和KHTXLJG0 采用了通过dblink插入的方式 db_link_xx分别是不同的服务器,每个服务器的连接有2M带宽的限制。 目前串行运行 所有的表没有进行Statistics Collection
  • 4. 南平地区县市1县市2县市n……计划任务(现状)12…xx
  • 5. KHTKHXL0的索引KHTKHXL0_GSKHNYJY GSDM00,KHDM00, NYUE00, JYDM00 GSDM00只有一个值 NYUE00只有一个值 KHTKHXL0_KHDM KHDM00
  • 6. 表KHTKHXL0及索引大小SEGMENT_NAME SUM(BYTES)/1048576 ------------------------------ ------------------ KHTKHXL0 13.9453125 KHTKHXL0_GSKHNYJY 13.4765625 KHTKHXL0_KHDM 6.2890625
  • 7. KHTXLJG0的索引KHTXLJG_KH_SP_INDEX GSDM00,KHDM00,SPDM00 GSDM00只有一个值 KHTXLJG0_KHDM_INDEX KHDM00 KHTXLJG0_SPDM_INDEX SPDM00
  • 8. 表KHTXLJG0及索引大小SEGMENT_NAME SUM(BYTES)/1048576 ------------------------------ ------------------ KHTXLJG0 143.554688 KHTXLJG0_KHDM_INDEX 69.1796875 KHTXLJG0_SPDM_INDEX 57.5390625 KHTXLJG_KH_SP_INDEX 130.195313
  • 9. 时间测试使用 SET ECHO ON SET TIMING ON SPOOL 文件名.log 结果 南平地区:一般12分钟
  • 10. 计划任务(调整思路)采用并行方式 KHTKHXL0和KHTXLJG0使用并行方式(union all)进行插入 将表空间变成Local Management方式,可以降低recursive sql 的调用试次,有利于提高insert的速度 建议用分区表和分区索引。 部分索引需要调整
  • 11. 建db link在crm用户下建好指向各个地市的db link 调整open_links的参数为16
  • 12. 建LOCAL表空间CREATE TABLESPACE CRM_DATA_TEST DATAFILE ‘…’ EXTENT MANAGEMENT LOCAL UNIFORM SIZE 2M CREATE TABLESPACE CRM_INDX_TEST DATAFILE ‘…’ EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1M
  • 13. 建分区表PARTITION BY RANGE (KHDM00) ( PARTITION P900 VALUES LESS THAN ('901'), PARTITION P902 VALUES LESS THAN ('903'), PARTITION P903 VALUES LESS THAN ('904'), PARTITION P921 VALUES LESS THAN ('922'), PARTITION P922 VALUES LESS THAN ('923'), PARTITION P923 VALUES LESS THAN ('924'), PARTITION P924 VALUES LESS THAN ('927'), PARTITION P927 VALUES LESS THAN ('928'), PARTITION P928 VALUES LESS THAN ('929'), PARTITION P929 VALUES LESS THAN ('930') ) TABLESPACE CRM_DATA_TEST;
  • 14. KHTXLJG0INSERT /*+ append */ INTO CRM.khtxljg0 NOLOGGING SELECT /*+ FULL(a) */ '135021000000', '900'||SUBSTRB(a.khdm00,4,9), a.spdm00, a.zgxl00, a.zdxl00, a.yzgxl0, a.yzdxl0, a.jycljg, a.zzs000 FROM CRM.khtxljg0@db_link_01 a UNION ALL SELECT /*+ FULL(a) */ '135021000000', '902'||SUBSTRB(a.khdm00,4,9), a.spdm00, a.zgxl00, a.zdxl00, a.yzgxl0, a.yzdxl0, a.jycljg, a.zzs000 FROM CRM.khtxljg0@db_link_02 a UNION ALL …
  • 15. KHTKHXL0INSERT /*+ append */ INTO CRM.KHTKHXL0 NOLOGGING SELECT /*+ FULL(a) */ '135021000000', '928'||SUBSTRB(KHDM00,4,9),NYUE00,JYDM00,RXL000,DPZXL0,YXL000,SYYXL0,DPZYGL FROM CRM.KHTKHXL0@DB_LINK_09 a WHERE NYUE00>=TO_CHAR(SYSDATE,'YYYYMM') UNION ALL SELECT /*+ FULL(a) */ '135021000000', '929'||SUBSTRB(KHDM00,4,9),NYUE00,JYDM00,RXL000,DPZXL0,YXL000,SYYXL0,DPZYGL FROM CRM.KHTKHXL0@DB_LINK_10 a WHERE NYUE00>=TO_CHAR(SYSDATE,'YYYYMM'); UNION ALL …
  • 16. 调整索引KHTKHXL0 KHTKHXL0_KHJYDM( KHDM00, JYDM00) KHTXLJG0 KHTXLJG0_KHSPDM(KHDM00,SPDM00) 采用分区(Local Prefixed)方式 采用索引组织表
  • 17. 创建索引组织表Create table name ( col1 varchar2(10) not null, …… ) Organization index Tablespace …..
  • 18. 时间测试使用 SELECT SYSDATE FROM DUAL; SET ECHO ON SET TIMING ON SPOOL 文件名.log 结果 南平地区:一般9分钟 主要是取KHTXLJG0时节约了约3分钟
  • 19. 调整总结调整难点(在v$system_event中查询) 事件 SQL*Net more data from dblink SELECT EVENT,TOTAL_WAITS,TIME_WAITED FROM V$SESSION_EVENT WHERE TOTAL_WAITS>0 AND SID= (SELECT DISTINCT SID FROM V$MYSTAT) 用crm, crm1, crm01, crm02, crm03, crm04, crm05, crm06, crm07, crm08, crm09, crm10定期进行5%的Statistics Collection 建议使用LOCAL表空间,以降低Recursive SQL的调用,采用分区表,合理选择索引的列和顺序
  • 20. 服务器调整
  • 21. 调整工具Windows 性能管理器,任务管理器 Unix topas,vmstat,sar
  • 22. 服务器端调优Page IN/OUT的情况 CPU的使用情况 DISK I/O信息 Alert.log中的信息 $ORACLE_HOME/admin//bdump STATSPACK
  • 23. 内存(南平)总共2G物理内存 Oracle的SGA为1.1G,使用pre_page_sga参数常驻内存 总连接数为30左右,峰值时内存为1.5G 总结:内存方面不存在问题
  • 24. CPU(南平)显示有4个CPU 一般利用率在20%左右 总结:CPU方面不存在问题
  • 25. DISK I/O (南平)只有一个60G的硬盘 操作系统、Oracle程序、数据库所有的文件在一个物理磁盘上 总结:DISK I/O方面不够理想,应当选择多个小硬盘。
  • 26. DISK I/O (福州)通过topas和sar观查 disk2非常忙 通过v$filestat和v$datafile进行关联,在/u02和/u03上的Oracle数据文件读写很高: SELECT SUBSTR(F.NAME,1,4) DISK,SUM(S.PHYRDS),SUM(S.PHYWRTS) FROM V$DATAFILE F,V$FILESTAT S WHERE F.FILE#=S.FILE# GROUP BY SUBSTR(F.NAME,1,4) 可以进一步通过lslv,lsvg,lspv命令看/u02和/u03在那块盘上
  • 27. Alert.log文件在alert.log中显示大量的checkpoint not completed信息 log_buffer只有64k 有三个日志组,每组一个成员,每个成员只有1M 应当调整log_buffer的大小到1m,增加日志组的大小和数量,如(5组,每个20m) ORA-00600错误
  • 28. STATSPACK的使用
  • 29. STATSPACKInstance Efficiency Percentages (Target 100%) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Buffer Nowait %: 100.00 Redo NoWait %: 100.00 Buffer Hit %: 95.97 In-memory Sort %: 99.74 Library Hit %: 99.69 Soft Parse %: 99.31 Execute to Parse %: -3.23 Latch Hit %: 99.99 Parse CPU to Parse Elapsd %: 39.59 % Non-Parse CPU: 98.65 Top 5 Wait Events ~~~~~~~~~~~~~~~~~ Wait % Total Event Waits Time (cs) Wt Time -------------------------------------------- ------------ ------------ ------- SQL*Net more data from dblink 56,250 36,386 57.88 direct path read 7,073 4,549 7.24 db file parallel write 1,540 3,666 5.83 db file scattered read 7,859 3,123 4.97 control file parallel write 1,225 2,755 4.38 -------------------------------------------------------------
  • 30. 如何安装创建一个120M左右的表空间,如perfstat 在服务器端用sqlplus(登录到sys as sysdba用户)运行 @?/rdbms/admin/spcreate 如何生成report? @?/rdbms/admin/spreport 如何清除过多的数据? @?/rdbms/admin/sppurge 如何运行收集? exec statspack.snap dbms_job.submit(,’begin statspack.snap; end;’,..)
  • 31. 效率 Buffer Nowait数值大(>95%)表示数据缓冲区足够大 否则需要增加数据缓冲区的大小,或调整数据文件IO的速度
  • 32. 效率 Redo Nowait数据大(>99%)表示log_buffer足够 否则调整log_buffer的大小
  • 33. 效率 Buffer Hit足够大(>95%)表示命中率较高 否则可以调整数据缓冲区的大小
  • 34. 效率 In-memory Sort数字大(>95%)表示大部分数据在内存中进行排序 否则调整sort_area_size的值,或pga_aggregate_target的值
  • 35. 效率 Library Hit数据大(>95%)表示SQL的命中率较高 否则需要调整shared_pool_size的值,或者需要调整SQL,使用bind variable
  • 36. 效率 Soft Parse数字大(>95%)表示SQL的缓冲情况比较好 否则需要增加shared_pool_size的值
  • 37. 效率 Execute to parse =100 * (1 - Parses/Executions) 数据大表示重新解释的次数较多,在snapshot较多的系统中值可能很低,因为完全刷新后很多SQL语句执行时需要重新解释,动态的创建表或索引等也会增加Parse的次数.
  • 38. 效率 Latch Hit数字大(>99%)表示内部锁比较好 否则需要查询Oracle有关版本的bug说明
  • 39. 效率 Parse CPU to Parse elapsed做SQL解释时CPU的利用率 数据越大表示解释的效率高
  • 40. 效率 Non-Parse CPU表示用于SQL Parse的CPU的比重 数值越大越好
  • 41. 事件 Buffer Busy Wait访问的块正在读取中 其他他进程正在将数据读到Cache中 访问的块正在修改中 其他进程正在修改Cache中的数据 调整思路: 将数据文件放在读取速度更快的设备上
  • 42. 事件 Checkpoint Completed等待Checkpoint操作结束 调整思路: 减小一些log buffer的大小 增加Checkpoint的频率 将log文件放在更快的磁带设备上,如RAID
  • 43. 事件 Control File Parallel Write等待向所有的控制文件写数据 调整思路: 减少control file的个数 将不同control file分布到不同的磁盘驱动器
  • 44. 事件 Control File Sequential Read 从Control File中读取信息 调整思路: 将Control File放在比较空闲的磁盘上 将Control File放在速度更快的磁盘上
  • 45. 事件 Control File Single Write某一个进程需要向Control File写东西, 如:创建数据文件等
  • 46. 事件 DB File Parallel Read一般在并行恢复时发生 调整思路: 调整文件在不同磁盘驱动上的分布 选用访问速度更快的磁盘
  • 47. 事件 DB File Parallel WriteDBWn进程将数据写入数据文件 调整思路: 调整文件在多个磁盘控制器之间的分布 采用条带化技术,提高写速度。
  • 48. 事件 DB File Scattered Read读取大量的数据块到Cache中 调整思路: 调整大表上的索引 收集更集统计信息
  • 49. 事件 DB File Sequential Read一般指读取索引的数据 调整思路: 调整索引的设计 Rebuild索引,提高索引效率
  • 50. 事件 Direct Path Read指直接从文件中读取,主要发生在检查Direct Path Writer写是否完成 调整思路: 调整文件分布 选用更快的磁盘设备
  • 51. 事件 Direct Path Write直接向数据文件写数据,发生在Direct Insert中 Insert /*+ append */ … sqlldr中设置direct=true 调整思路: 调整文件分布 选用更快的磁盘设备
  • 52. 事件 EnqueueEmqueue是Oracle内部的一种锁,用来进行串行操作 调整思路: 增大enqueue_resources参数
  • 53. 事件 Free Buffer Wait寻找可用Cache块,如大量的数据被修改,或没有可用的空闲块 调整思路 增加db_block_buffers或db_cache_size的值
  • 54. 事件 IO Done等待写文件操作结束,在不支持异步I/O的操作系统中经常发生 调整思路 查询有关平台可否使用异步I/O 调整文件分布 采用更快的磁盘设备
  • 55. 事件 Log Buffer Space生成日志的速度大于将日志写到磁盘的速度 调整思路 增加log_buffer的值 将log文件放到空闲的磁盘设备上
  • 56. 事件 Log File Parallel Write等待log写操作结束,如日志组有的成员在快的设备上,有的在慢的设备上 调整思路 将log的成员分布到不同的磁盘上 用更快的磁盘设备
  • 57. 事件 Log File Switch (…)Archiving needed 等待归档完成 调整思路:增加log_archive_processes的数量 Checkpoint not completed 等待切换到下一个日志 调整思路:增加日志组的数据,调整大小 Completion 等待日志切换完成 调整思路:将log放到更快的磁盘设备上
  • 58. 事件 Log File Sync在用户commit时,等待将日志写入文件的过程 调整思路 将日志放到更快的磁盘设备上 将各个成员放到不同的磁盘设备上
  • 59. 事件 SQL*NET more data from dblink等待dblink远程数据库的数据 调整思路 dblink的速度太慢
  • 60. 事件 SQL*NET more data to dblink通过dblink向远程数据库插入数据 调整思路 dblink的速度太慢
  • 61. 事件 transaction等待回滚死掉的或阻塞(如死锁)进程中的任务
  • 62. 事件 Undo Segment Extension等待动态扩展回滚段 调整思路 增加回滚段的初始大小,增加optimal的值 对于大事务指定使用大的回滚段 DBMS_TRANSACTION.USE_ROLLBACK_SEGMENT('RBS99');
  • 63. 事件 Undo Segment Recovery等待PMON处理死锁时的情况
  • 64. 事件 Undo Segment tx slot等待获得回滚段 调整思路 增加回滚段的个数 增加回滚段的初始extent的数量
  • 65. 事件 Write Completed用户在commit时等待保存修改过的block
  • 66. STATSPACK中的其他信息Logical read 大于一定块数的SQL Physical read大于一定块数的SQL 从v$sqltext中查询整个sql select sql_text from v$sqltext where hash_value=? Order by piece
  • 67. STATSPACK实验安装STATSPACK 收集一天的数据,白天每小时一次,从8点到18点 生成一份报告,并进行服务器性能分析 找出几个logical read和physical read比较多的语句进行分析和调整
  • 68. Oracle的优化器
  • 69. Oracle优化器的类型Cost Based Optimizer(简称CBO) 基于统计信息的优化 Rule Based Optimizer(简称RBO) 基于数据字典的优化,在以后的版本中将不支持
  • 70. RBO根据数据字典 查询有无可用的索引,如果有则使用,否则不使用 不同的访问方法有预定好的优先级,选择优先级高的执行方法
  • 71. RBO中访问数据Rowid -> Cluster Join(SR) -> Hash Cluster Key (SR) -> UK或PK(SR) -> Cluster Join -> Hash Cluster Key -> Index Cluster Key -> Composite Index -> Single Column Index -> Bound Range Index Scan -> Unbound Range Index Scan -> Sort Merge Join -> Max or Min on Indexed Column -> Order on Indexed Column -> Full Table Scan
  • 72. CBO需要收集统计信息 表有多少行,占用多少数据块 列有多少个Null值、不同值 列的最大值和最小值,及值的分布情况 索引的层次、结点数、叶结点数,及行的分布状况(Cluster) 根据一定算法算出一个成本值,选择成本值最低的执行方法,不一定使用索引。
  • 73. CBO的新功能Partition Table 和 Partition Index Index Organized Table Reserve Key Index Function Index Bitmap Index 和 Bitmap Join Index Index Skip Scan Parallel Query 和 Parallel DML Hash Join 基于实体化视图的Query Rewrite
  • 74. 使用CBO新的应用应当基于CBO开发 用dbms_stats收集信息 在语句中用hint指定 rule choose first_rows all_rows 在session中用alter session指定optimizer_mode参数 在参数文件中指定optimizer_mode参数
  • 75. CBO几个概念Selective 结果记录的比例 Histograms 列值的分布情况 Cardinality 结果记录数 Cost 执行成本
  • 76. CBO : Selective指结果记录的比例 用于决定使用索引访问还是使用全表扫描 例子: 表T的COL1字段上有10个不同值,当执行select * from T where col1=?时,这个查询的selective=1/10 * 100=10%
  • 77. CBO : Histograms用于描述列值的分布情况 在分布不平均的例上,需要用Histograms来记录列值的分布情况 例子: 在表T的COL1字段上,有100个值,它分的分布如下 10 20 5 5 40 10 10
  • 78. CBO : CardinalityCBO对查询将返回的记录数的一个估计,在最简单的情况下: Cardinality = Table rows * Selective
  • 79. CBO : CostCBO根据所收集的统计信息或猜测信息给某一个SQL语句算出的执行成本 具体计算方法很复杂 没有统计信息或过时的统计信息,会导至CBO产生和使用错误的执行方法 CBO还不是十分完善,可以使用Hint影响CBO选择执行方法
  • 80. 全表扫描和索引扫描索引扫描不一定是最快的(如小表) CBO中经常会选择全表扫描(如小表) 当Selective < 15%时,选择索引扫描比较有利,否则使用全表扫描更好 记录的Cluster情况A B C DA B C DA B C DA B C DA A A AB B B BC C C CD D D D
  • 81. CBO中的访问方法Full Table Scans Rowid Scans Index Scans Cluster Scans Hash Scans Sample Table Scans
  • 82. CBO中Index访问Index Unique Scan Index Range Scan [Descending] Index Skip Scan Full Scan Fast Full Index Scan Index Join Bitmap Join
  • 83. CBO中的JOIN方法NEST LOOP MERGE JOIN HASH JOIN
  • 84. 收集统计信息定时收集 在数据大量变更后收集 使用Analyze命信收集或dbms_stats包收集 在optimizer_mode=choose时,收集信息后会采用CBO进行优化,在dblink应用较多时,需要注意。
  • 85. DBMS_STATSGather_database_stats 收集数据库下所有对象的统计信息 Gather_schema_stats 收集某一用户下所有对象的统计信息 Gather_table_stats 收集某一个表或分区的统计信息 Gather_index_stats 收集某一个索引或分区的统计信息
  • 86. gather_database_statsestimate_percent=>比例 比例越大,收集越耗时 method_opt=>选项 for all [ indexed | hidden ] columns size { 1 - 254 } degree=>并行度 默认为表的并行度
  • 87. gather_schema_statsownname=>用户名 estimate_percent=>比例 比例越大,收集越耗时 method_opt=>选项 for all [ indexed | hidden ] columns size { 1 - 254 } degree=>并行度 默认为表的并行度
  • 88. gather_table_statsownname=>用户名 tabname=>表名 partname=>分区名 estimate_percent=>比例 比例越大,收集越耗时 method_opt=>选项 for all [ indexed | hidden ] columns size { 1 - 254 } degree=>并行度 默认为表的并行度
  • 89. gather_index_statsownname=>用户名 tabname=>表名 partname=>分区名 estimate_percent=>比例 比例越大,收集越耗时 degree=>并行度 默认为表的并行度
  • 90. 查看表的统计信息{ USER | ALL | DBA }_TABLES num_rows / blocks / avg_row_len / last_analyzed
  • 91. 查看索引的统计信息{ USER | ALL | DBA }_INDEXES NUM_ROWS / DISTINCT / LEAF_BLOCKS / CF / ALFBKEY CF=一个索引叶块对应的数据块的数量,越小表示一索引越有效 ALFBKEY=每一个值占据的叶块的数量
  • 92. 查看列的统计信息{ USER | ALL | DBA }_tab_col_statistics num_distinct / num_nulls / num_buckets / density num_buckets = histograms中组的数量 Density = 1 / num_distinct
  • 93. 查看histograms的信息{user | all | dba}_histograms {user | all | dba}_part_histograms {user | all | dba}_subpart_histograms {user | all | dba}_tab_col_statistics 不适合在分布均匀的列或在where中用bind variable来查询的列 在收集时需要在method_opt中指定size值
  • 94. CBO使用实列使用Function Index 选择一个例值分布不平均的表 学会收集统计信息 使用dbms_job来定时收集统计信息 查看统计信息
  • 95. XSTJXCRB查询优化思路 使用实体化视图实现Query Rewrite P200404分区记录数:88512条 按RQ0000和SPDM00汇总:6899条 利用CBO的Query Rewrite技术,按rq0000和spdm00汇总好数据存放在中间表(实体化视图)中
  • 96. 理解实体化视图SQLOracleXSTJXCRB表XSTJXCRB 实体化视图Query RewriteSELECT COL2,SUM(COL2) COL2 FROM … GROUP BY COL1 SELECT SUM(COL2) FROM … GROUP BY COL1 SELECT COL1,COL2 FROM …
  • 97. 实体化视图的刷新Complete 可以不用实体化视图日志 Fast 需要实体化视图日志的支持,可以支持Join和Summary操作 Fast refresh on commit 需要实体化视图日志的支持,可以支持Join和Summary操作
  • 98. 可以用于Query Rewrite的条件不可以使用Rownum, sysdate等值变化不固定的函数 不支持raw,long raw和ref object类型 不支持union , minus, intersect等类型语句 一个表不要引用两次 不能在sys用户下 不支持connect by语句
  • 99. 刷新 : Fast (关联语句)给所有关联的表建实体化视图日志需要有with rowid选项 在select的列中包括所有表的rowid列 不能有group by语句 在外连接的另一方必须有unique约束 例子 select a.rowid rowid_a, a.*, b.rowid rowid_b, b.* from a, b where a.* = b.*
  • 100. 刷新 : Fast (汇总语句)所有的表必须有日志 日志中被引用的所有列 应有with rowid和including new values 如果有insert,update,delete操作,则指定with sequence选项 在select中应当有count(*), count(字段), sum(字段), sum(字段*字段) 包括group by中的所有列 使用cube或rollup时,包括grouping_id(字段)列
  • 101. 创建实体化视图日志语法 create materialized view log on … with [sequence,] rowid (col1,col2,…) including new values 例子 Create materialized view log on bbcx.xstjxcrb with sequence, rowid,(QNXS00,RJKC00,RQ0000,SNXS00,SPDM00,SWXS00) including new values
  • 102. 创建实体化视图CREATE MATERIALIZED VIEW "BBCX"."MVIEW_BBCX_XSTJXCRB" (RQ0000,SPDM00,RJKC00,SWXS00,SNXS00,QNXS00) PARTITION BY RANGE(RQ0000) ( PARTITION P200401 values less than (TO_DATE(‘20040501’,’YYYYMMDD’)), …… ) BUILD IMMEDIATE REFRESH FAST WITH ROWID ON COMMIT ENABLE QUERY REWRITE TABLESPACE IQS_BASICDATA AS select rq0000,spdm00, count(*) rowcnt, sum(rjkc00) rjkc00, SUM(SWXS00) swxs00, sum(SNXS00) snxs00, sum(QNXS00) qnxs00 from xstjxcrb group by rq0000,spdm00
  • 103. 使用实体化视图修改启动参数: query_rewrite_enabled=true query_rewrite_integrity=trusted Grant query rewrite to bbcx 收集统计信息 dbms_stats.gather_table_stats(‘bbcx’,’xstjxcrb’) 或使用rewrite提示符 需要注意SQL的匹配性,可以用explain plan来看
  • 104. 调整临时表尽量减少临时表的使用 可以适当使用嵌套的SQL语句
  • 105. Optimizer Hints
  • 106. 为什么会有Hints因为CBO的功能还不十分强大 尽量让优化器选择,除非你很有自信 例子: 在使用dblink的环境中 在使用bind variable时
  • 107. Hint : 优化器的选择All_rows First_rows(n) n=1,10,100,1000 Choose Rule
  • 108. Hint : 选择访问方法Full(表名) Index(表名 索引) Index_asc(表名 索引) Index_desc(表名 索引) Index_combine(表名 bid1 bid2) Index_join(表名 ind1 ind2) Index_ffs(表名 索引) No_index(表名 索引)
  • 109. Hint : 控制SQL转换Use_concat 使用union all来替换or条件 No_expand 不使用union all来替换or条件 Rewrite / norewrite 启用和禁用Query Rewrite技术 Merge(视图) / no_merge(视图) 是否合并视图
  • 110. Hint : 控制Join类型 Use_nl(表名) Use_merge(表1 表2) Use_hash(表1 表2) Hash_aj / nl_aj / merge_aj Hash_sj / nl_sj / merge_sj
  • 111. Hint : 控制并行Parallel(表名 并行度) Noparallel(表名)
  • 112. Hint : 其他Append Cache
  • 113. 创建索引索引能提高速度的关键就是索引所占的空间要比表小得多 注意索引的大小,有一些表可以建成索引组织表 索引的列不要太多,要选择一些selective比较低的列建B-tree索引,选择selective高的列建bitmap索引(在更新比较多的表不不要建bitmap索引) 将selective较低的列放在前面 在更新不多的表上建索引时,可以考虑用compress选择,以节约索引的空间
  • 114. 创建表普通表 索引组织表 大部分字段是Primary Key的表 分区表 一般记录数在50万以上的可以考虑创建分区表
  • 115. 其他问题在表空间使用时,最好用Local表空间,否则应当设置pctincrease为0以减少表空间的碎片 不同数据量级的表应当有不同的initial和next或Uniform size设置 许多表有maxextents的限值,需要注意unable to allocate extends的错误信息 若使用CBO,应在晚上定时收集statistics
  • 116. 培训总结认真思考理解CBO的部分原理 查出目前数据库中各个索引与表的大小的比值,考虑索引存在的必须性,或索引列的选择是否正确 了解和合理使用Optimizer Hint 使用CBO,在CBO下调整优化SQL 用STATPACK找出一些reads比较大的SQL并进行调整