ITPub博客

首页 > 数据库 > Oracle > 《基于Oracle的SQL优化》

《基于Oracle的SQL优化》

Oracle 作者:ivy11ivy 时间:2013-12-07 13:44:04 0 删除 编辑
基于Oracle的SQL优化



《基于Oracle的SQL优化》

2013年12月3日收到这本书,争取在最短的时间内看完和理解!

开始阅读日期时间:2013/12/03 11:00 A.M.
阅读完毕日期时间:2014/01/05 01:00 P.M.

第 1章 Oracle里的优化器 ...................................1 
1.1 什么是 Oracle里的优化器 ...........................1 
1.1.1 基于规则的优化器............................2 
1.1.2 基于成本的优化器........................9 
1.1.2.1 集的势 ..............................11 
1.1.2.2 可选择率 ...............................11 
1.1.2.3 可传递性..............................16 
1.1.2.4 CBO的局限性...................................18 
1.2 优化器的基础知识 .......................19 
1.2.1 优化器的模式..................................19 
1.2.2 结果集............................21 
1.2.3 访问数据的方法................................22 
1.2.3.1 访问表的方法.............................22 
1.2.3.1.1 全表扫描 ....................................22 
1.2.3.1.2 ROWID扫描 .....................................23 
1.2.3.2 访问索引的方法 .....................................24 
1.2.3.2.1 索引唯一性扫描 ...............................25 
1.2.3.2.2 索引范围扫描 .......................................25 
1.2.3.2.3 索引全扫描 ......................................28 
1.2.3.2.4 索引快速全扫描 ...............................29 
1.2.3.2.5 索引跳跃式扫描 ...............................31 
1.2.4 表连接..........................33 
1.2.4.1 表连接的类型......................................34 
1.2.4.1.1 内连接.............................................34 
1.2.4.1.2 外连接.................................................37 
1.2.4.2 表连接的方法............................................47 
1.2.4.2.1 排序合并连接 ..................................47 
1.2.4.2.2 嵌套循环连接 ...................................48 
1.2.4.2.3 哈希连接 ..........................................51 
1.2.4.2.4 笛卡儿连接 ......................................56 
1.2.4.3 反连接 ...........................................58 
1.2.4.4 半连接 ................................63 
1.2.4.5 星型连接............................................65 
1.3 优化器模式对 CBO计算成本带来巨大影响的实例...............66 
1.4 总结.......................80
第 2章 Oracle里的执行计划 ........................... 82 
2.1 什么是执行计划.................................82 
2.2 如何查看执行计划 ..........................85 
2.2.1 explain plan命令....................................86 
2.2.2 DBMS_XPLAN包............................89 
2.2.3 AUTOTRACE开关 ...............................95 
2.2.4 10046事件与 tkprof命令.............................99 
2.3 如何得到真实的执行计划..................................102 
2.4 如何查看执行计划的执行顺序.............................118 
2.5 Oracle里的常见执行计划 .......................122 
2.5.1 与表访问相关的执行计划.................................122 
2.5.2 与 B树索引相关的执行计划.................................124 
2.5.3 与位图索引相关的执行计划...................................129 
2.5.4 与表连接相关的执行计划.......................................138 
2.5.5 其他典型的执行计划...............................................146 
2.5.5.1 AND-EQUAL(INDEX MERGE).....................146 
INDEX JOIN ................................148
2.5.5.2 VIEW.......................149
2.5.5.3FILTER ..................................151
2.5.5.4 SORT ....................................154
2.5.5.5 
2.5.5.6 UNION/UNION ALL......................167 
CONCAT..................................................168
2.5.5.7 
CONNECT BY...................................................171
2.5.5.8 
2.6 Oracle里执行计划的稳定 ................................172 
2.6.1 使用 SQL Profile来稳定执行计划 ...........................173 
2.6.1.1 Automatic类型的 SQL Profile ...............................173 
2.6.1.2 Manual类型的 SQL Profile......................................179 
2.6.2 使用 SPM来稳定执行计划........................................190 
2.7 总结..............................203
第 3章 Oracle里的 Cursor和绑定变量 ......................... 204 
3.1 Oracle里的 Cursor.............................204 
3.1.1 Oracle里的 Shared Cursor.............................204 
3.1.1.1 Shared Cursor的含义 ..........................................204 
3.1.1.2 硬解析 ................................................212 
3.1.1.3 软解析 ...................................214 
3.1.2 Oracle里的 Session Cursor..............................215 
3.1.2.1 Session Cursor的含义 .....................................215 
3.1.2.2 Session Cursor的相关参数解析...........................218 
OPEN_CURSORS.........................................218
3.1.2.2.1 SESSION_CACHED_CURSORS ............................219
3.1.2.2.2CURSOR_SPACE_FOR_TIME ..............................221
3.1.2.2.3 
3.1.2.3 Session Cursor的种类和用法 .............................222 
3.1.2.3.1 隐式游标 ........................................222 
3.1.2.3.2 显式游标 ........................................225 
3.1.2.3.3 参考游标 ........................................230 
3.2 Oracle里的绑定变量 ...............................237 
3.2.1 绑定变量的作用....................................237 
3.2.2 绑定变量的典型用法.........................................238 
3.2.3 绑定变量的使用原则和最佳实践..............................245 
3.2.3.1 PL/SQL批量绑定模板一 ...................................245 
3.2.3.2 PL/SQL批量绑定模板二 .....................................247 
3.2.4 绑定变量窥探............................................258 
3.2.5 绑定变量分级..................................270 
3.2.6 绑定变量的个数不宜太多........................................276 
3.2.7 批量绑定时如何处理错误.......................................280 
3.2.8 如何得到已执行的目标 SQL中绑定变量的值 ..........283 
3.3 Oracle里的游标共享 .......288 
3.3.1 常规游标共享..............................289 
3.3.2 自适应游标共享........................297 
3.4 Oracle里的应用类型 ...............................320 
3.4.1 Session Cursor的生命周期.........................................320 
3.4.2 应用类型一(硬解析)................................................322 
3.4.3 应用类型二(软解析)...............................................323 
3.4.4 应用类型三(软软解析)..........................................323 
3.4.5 应用类型四(一次解析、多次执行)....................324 
3.4.6 四种应用类型的实测性能对比..............................325 
3.5 总结.............................333
第 4章 Oracle里的查询转换 .......................... 335 
4.1 Oracle里查询转换的作用 ................335 
4.2 子查询展开.................................336 
4.3 视图合并............................344 
4.3.1 简单视图合并...........................345 
4.3.2 外连接视图合并..................351 
4.3.3 复杂视图合并.....................354 
4.4 星型转换.....................365 
4.5 连接谓词推入 ................372 
4.6 连接因式分解 ................379 
4.7 表扩展 .......................387 
4.8 表移除 .............396 
4.9 Oracle如何处理 SQL语句中的 IN.............401 
IN-List Iterator .................402
4.9.1 
4.9.2 IN-List Expansion / OR Expansion ................404 
IN-List Filter .............409
4.9.3 
4.9.4 对 IN做子查询展开/视图合并 .............410 
4.10 查询转换的综合应用实例(逻辑读从 200万降到 6) .....413 
4.11总结..............................420
第 5章 Oracle里的统计信息 ........ 422 
5.1 什么是 Oracle里的统计信息...........422 
5.2 Oracle里收集与查看统计信息的方法 .............423 
5.2.1 收集统计信息...................423 
5.2.1.1 用 ANALYZE命令收集统计信息...........423 
5.2.1.2 用 DBMS_STATS包收集统计信息..........428 
5.2.1.3 ANALYZE和 DBMS_STATS的区别........432 
5.2.2 查看统计信息................433 
5.3 表的统计信息 ..............435 
5.3.1 表统计信息的种类和含义.........435 
5.3.2 表统计信息不准导致 SQL性能问题的实例 .................437 
5.4 索引的统计信息..............440 
5.4.1 索引统计信息的种类和含义.................440 
5.4.2 聚簇因子的含义及重要性............442 
5.5 列的统计信息 ..................450 
5.5.1 列统计信息的种类和含义..............450 
5.5.2 列统计信息不准导致谓词越界的实例..........454 
5.5.3 直方图........................460 
5.5.3.1 直方图的含义...............460 
5.5.3.2 直方图的类型.................462 
5.5.3.2.1 Frequency类型的直方图 ...........463 
5.5.3.2.2 Height Balanced类型的直方图 ..................471 
5.5.3.3 直方图的收集方法................................475 
5.5.3.4 直方图对 CBO的影响 ....................477 
5.5.3.4.1 直方图对 Shared Cursor的影响 .............477 
5.5.3.4.2 直方图对可选择率的影响 ................482 
5.5.3.5 使用直方图的注意事项...........................495 
5.6 全局统计信息 ............................496 
5.7 动态采样............................507 
5.8 多列统计信息 ...........................516 
5.9 系统统计信息 .............................519 
5.10 数据字典统计信息..................536 
5.11内部对象统计信息 .............................539 
5.12 Oracle里的自动统计信息收集 .........................546 
5.13 Oracle里应如何收集统计信息 ..........................563 
5.14 总结.........................567
第 6章 Oracle里的 Hint..................... 568 
6.1 什么是 Hint .....................568 
6.2 Hint的用法 ...............................576 
6.3 Hint被 Oracle忽略的常见情形 ...............590 
6.3.1 情形一:使用的 Hint有语法或者拼写错误.................591 
6.3.2 情形二:使用的 Hint无效.........................592 
6.3.3 情形三:使用的 Hint自相矛盾..............597 
6.3.4 情形四:使用的 Hint受到了查询转换的干扰...........599 
6.3.5 情形五:使用的 Hint受到了保留关键字的干扰.........602 
6.4 常见的 Hint ...............605 
6.4.1 与优化器模式相关的 Hint................606 
6.4.1.1 ALL_ROWS ...............606 
6.4.1.2 FIRST_ROWS(n)...................606 
RULE........................608
6.4.1.3 
6.4.2 与表访问相关的 Hint...................615 
FULL .......................615
6.4.2.1 ROWID .............615
6.4.2.2 
6.4.3 与索引访问相关的 Hint...................615 
INDEX .........................615
6.4.3.1 NO_INDEX .....................616
6.4.3.2 INDEX_DESC ...............617
6.4.3.3 INDEX_COMBINE................618
6.4.3.4 INDEX_FFS ..................620
6.4.3.5 
6.4.3.6 INDEX_JOIN.............621 
6.4.3.7 AND_EQUAL.....................622 
6.4.4 与表连接顺序相关的 Hint...................624 
ORDERED ................................624
6.4.4.1 LEADING ........................626
6.4.4.2 
6.4.5 与表连接方法相关的 Hint.............628 
6.4.5.1 USE_MERGE ............628 
NO_USE_MERGE .............631
6.4.5.2 USE_NL............633
6.4.5.3 NO_USE_NL .................634
6.4.5.4 USE_HASH.............635
6.4.5.5 NO_USE_HASH ..........635
6.4.5.6 
6.4.5.7 MERGE_AJ.........636 
NL_AJ............................637
6.4.5.8 HASH_AJ.................637
6.4.5.9 MERGE_SJ....................637
6.4.5.10 NL_SJ...........................638
6.4.5.11HASH_SJ .......................639
6.4.5.12 
6.4.6 与查询转换相关的 Hint .....................639 
USE_CONCAT ...............639
6.4.6.1 NO_EXPAND ...............640
6.4.6.2 MERGE................642
6.4.6.3 NO_MERGE................642
6.4.6.4 UNNEST ....................643
6.4.6.5 
6.4.6.6 NO_UNNEST........................643 
EXPAND_TABLE .................................644
6.4.6.7 NO_EXPAND_TABLE .......................644
6.4.6.8 
6.4.7 与并行相关的 Hint ...........................645 
PARALLEL...................................645
6.4.7.1 NO_PARALLEL ................................652
6.4.7.2 
6.4.7.3 PARALLEL_INDEX ................................654 
NO_PARALLEL_INDEX......................................656
6.4.7.4 
6.4.8 其他常见 Hint ............................656 
DRIVING_SITE..............................656
6.4.8.1 APPEND ...........................................659
6.4.8.2 APPEND_VALUES ........................................662
6.4.8.3 
6.4.8.4 PUSH_PRED .......................664 
NO_PUSH_PRED ................................666
6.4.8.5 
6.4.8.6 PUSH_SUBQ....................................666 
6.4.8.7 NO_PUSH_SUBQ................669 
OPT_PARAM ..............................................670
6.4.8.8 OPTIMIZER_FEATURES_ENABLE ...............................672
6.4.8.9 
6.4.8.10 QB_NAME ........................................674 
CARDINALITY .................................674
6.4.8.11SWAP_JOIN_INPUTS .............................677
6.4.8.12 
6.5 用 Cardinality Hint解决 ORA-01555错误的实例...............682 
6.6 总结...............................693
第 7章 Oracle里的并行 ..................... 695 
7.1 Oracle里并行的基本概念 ...............695 
7.1.1 为什么要用并行.................695 
7.1.2 并行的理论基础....................696 
7.1.3 Oracle里能够并行执行的操作...............697 
7.1.4 Oracle里与并行有关的术语及解释 ..................707 
7.1.4.1 Query Coordinator .............708 
7.1.4.2 Query Slaves和 Query Slave Set.............708 
7.1.4.3 Table Queues.........716 
7.1.4.4 数据传递方法.............721 
7.1.4.5 granules............735 
7.1.4.6 直接读取 ............737 
7.1.5 深入解析并行执行计划的实例.............746 
7.2 Oracle里并行的控制 ..........755 
7.2.1 Oracle里如何开启并行 .............755 
7.2.2 Oracle里并行度的控制 .............760 
7.2.3 Oracle RAC环境下的并行...........771 
7.2.4 Oracle里与并行相关的参数 ..............775 
PARALLEL_MAX_SERVERS .........775
7.2.4.1 PARALLEL_MIN_SERVERS ......................776
7.2.4.2 
7.2.4.3 自动并行相关的参数 ...................776 
PARALLEL_DEGREE_POLICY ................................776
7.2.4.3.1 PARALLEL_MIN_TIME_THRESHOLD ...................................776
7.2.4.3.2 
7.2.4.3.3 PARALLEL_DEGREE_LIMIT ..................777 
PARALLEL_SERVERS_TARGET..................................777
7.2.4.3.4 
7.2.4.4 自适应并行相关的参数...............778 
PARALLEL_ADAPTIVE_MULTI_USER ...............778
7.2.4.4.1 PARALLEL_MIN_PERCENT ........................778
7.2.4.4.2 PARALLEL_AUTOMATIC_TUNING .........778
7.2.4.4.3 
7.2.4.5 其他参数 ............................778 
PARALLEL_THREADS_PER_CPU ...................................778
7.2.4.5.1 PARALLEL_EXECUTION_MESSAGE_SIZE.............779
7.2.4.5.2 PARALLEL_FORCE_LOCAL.........................779
7.2.4.5.3 
7.2.5 绕开 Oracle并行执行 Bug大幅提升性能的实例 ................779 
7.3 总结..........................805
第 8章 Oracle里 SQL优化的方法论 ................... 807 
8.1 Oracle里如何做 SQL优化...................807 
8.1.1 Oracle里 SQL优化的本质是基于对 CBO和执行计划的深刻理解 ......807 
8.1.2 Oracle里 SQL优化需要联系实际的业务 ...................819 
8.1.3 Oracle里 SQL优化需要适时使用绑定变量 ............824 
8.2 Oracle里 SQL优化的方法论在实战中的验证...............824 
8.3 总结......................841



※※※※※※※※※※※※※※第1章 Oracle里的优化器※※※※※※※※※※※※※※

1、一条烂SQL可以让数据库失去响应或数据库Hang住。
2、优化器是负责解析SQL,是RDBMS中最核心的一个部分。
3、优化器的目的是按照一定的判断原则来得到它认为的目标SQL在当前情形下最高效的执行路径(Access Path),或者说为得到目标SQL的执行计划。
4、RBO(Rule Based Optimizer),CBO(Cost Based Optimizer)。
5、优化器的输入是经过解析后(对SQL的语法、语义、权限进行检查)的目标SQL,输出是该目标SQL的执行计划。
6、RBO,硬编码于ORACL中,适用于OLTP,具有缺陷,分15级,第1级效率最高执行路径为single row by rowid(通过ROWID来访问效率最高方式),第15级是full table scan。
7、可修改优化器模式来使用RULE Hint来使用RBO。
8、采用RBO中的SQL,其中不能使用HINT,否则意味着自动选择CBO,但两上除外RULE Hint和DRIVING_SITE Hint除外。
9、使用RBO情况下,调整SQL执行计划的方法。P3
10、CBO基于Cost(成本):对执行目标SQL所以耗费的I/O,CPU和网络资源的一个估算值。
11、CBO在解析目标SQL时,首先会对目标SQL执行查询转换。
12、Cardinality '集的势',指指定集合所包含的记录数,即指定结果集的行数,它与成本估算息息相关。
13、Selectivity '可选择率' 指施加指定谓词后返回结果集的记录数占未施加任何谓词的原始结果集的记录数的比率。也是和成本估算息息相关。
Selectivity=施加指定谓词后返回结果集的记录数(Computed Cardinality)/未施加任何谓词条件的原始结果集的记录数(Original Cardinality)
14、CBO就是根据Selectivity来估算Cardinality的。
Computed Cardinality=Original Cardinality * Selectivity
15、P12 手工收集统计信息
execute dbms_stats.gather_table_stats(ownname => 'SCOTT',tabname => 'EMP',estimate_percent => 100,cascade => true, method_opt => 'for all columns size 1', 

no_invalidate=>false);
16、★执行计划中Rows的含义?  Cardinality, P13
17、★手工修改统计信息,‘欺骗’优化器。 P14
使用DBMS_STATS包将表EMP对应其数据量的统计信息修改为1000万:
execute dbms_stats.set_table_stats(ownname => 'SCOTT',tabname => 'EMP',numrows=>10000000,no_invalidate=>false);
使用DBMS_STATS包将表索引IDX_EMP_MGR对应索引叶子块数量的统计信息修改为10万:
execute dbms_stats.set_index_stats(ownname => 'SCOTT',tabname => 'IDX_EMP_MGR',numlblks=>100000,no_invalidate=>false);
18、可传递性(Transitivity),CBO可能会对原目标SQL做简单的等价改写,即在原目标SQL中加上根据该SQL现有的谓词条件推算出来的新的谓词条件,这样做的目的是提供更多的

执行路径给到CBO做选择,进而增加得到更高效执行计划的可能性。分三种:(a)简单谓词传递、(b)连接谓词传递、(c)外连接谓词传递
19、CBO的缺陷, P18
20、各表连接顺序由'_OPTIMIZER_MAX_PERMUTATIONS'限制,P19。
21、关于系统慢的优化思路与方法
现象(整体?局部)
AWR RPT
AWR SQL RPT
Execution Plan
select table_name,num_rows,blocks,to_char(last_analyzed,'yyyymmdd hh24:mi:ss') from dba_tables where table_name='VBAK';
select count(*) from SAPSR3.VBAK;

col index_name format a25;
col column_name format a25;
col column_position format 999;
select index_name,column_name,column_position from dba_ind_columns where table_name='VBAK' order by 1,3;

exec dbms_stats.gather_table_stats(ownname=>'SAPSR3',tabname=>'VBAK', cascade=>true, no_invalidate=>false, degree=>4);


备:oradebug setospid http://blog.sina.com.cn/s/blog_4d9ece9a0100b689.html



SQL> select table_name,num_rows,blocks,to_char(last_analyzed,'yyyymmdd hh24:mi:ss') from dba_tables where table_name='VBAK';

TABLE_NAME                       NUM_ROWS     BLOCKS TO_CHAR(LAST_ANAL
------------------------------ ---------- ---------- -----------------
VBAK                              3582100      52736 20130519 23:03:03

SQL> select count(*) from SAPSR3.VBAK;

  COUNT(*)
----------
   3813237

SQL> exec dbms_stats.gather_table_stats(ownname=>'SAPSR3',tabname=>'VBAK', cascade=>true, no_invalidate=>false, degree=>4);
PL/SQL procedure successfully completed.


SQL> col index_name format a25;
SQL> col column_name format a25;
SQL> col column_position format 999;
SQL> select index_name,column_name,column_position from dba_ind_columns where table_name='VBAK' order by 1,3;

INDEX_NAME                COLUMN_NAME               COLUMN_POSITION
------------------------- ------------------------- ---------------
VBAK~0                    MANDT                                   1
VBAK~0                    VBELN                                   2
VBAK~AUD                  MANDT                                   1
VBAK~AUD                  AUDAT                                   2


SQL> col name format a25;
SQL> col value format a25;
SQL> select name,value from v$parameter where name='optimizer_mode';
NAME                      VALUE
------------------------- -------------------------
optimizer_mode            ALL_ROWS
如果在系统级是ALL_ROWS,在SESSION级是否是FIRST_ROWS_n呢?可以考虑进行Process Dump观察。

set pagesize 2000 linesize 800
col SID format 999;
col SERIAL# format 99999;
col PROCESS format 999999999;
col TERMINAL format a15;
col PROGRAM format a30;
col SQL_ID format a15;
select SID,SERIAL#,PROCESS,TERMINAL,PROGRAM,SQL_ID from V$SESSION where PROCESS='1970264';

select * from table(sys.dbms_xplan.display_cursor('f1axjdq6f5qax'));

select a.username,a.sid ,a.serial#,b.spid from v$session a,v$process b where a.paddr=b.addr order by 4;

select pid,spid,username from v$process order by 2;    
#PID即Oracle process number.

以下为Process Dump方法:
SQL> oradebug setospid 590140
Oracle pid: 112, Unix process pid: 450990, image: oracle@esectsvr02

SQL> oradebug unlimit
Statement processed.

SQL> oradebug dump processstate 10
Statement processed.

SQL> oradebug tracefile_name
/oracle/QAS/saptrace/diag/rdbms/qas/QAS/trace/QAS_ora_590140.trc

22、SQL Profile工具。


※※※※※※※※※※※※※※第2章  Oracle里的执行计划※※※※※※※※※※※※※※
1、得到一个SQL的执行计划
select * from table(sys.dbms_xplan.display_cursor('f1axjdq6f5qax',0,'advanced'));

SQL> select * from table(sys.dbms_xplan.display_cursor('f1axjdq6f5qax',0,'advanced'));

PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------------------------------
SQL_ID  f1axjdq6f5qax, child number 0
-------------------------------------
select VBELN,ERDAT from sapsr3.VBAK

Plan hash value: 1697035036

--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |       |       |  8868 (100)|          |
|   1 |  TABLE ACCESS FULL| VBAK |  3813K|    72M|  8868   (3)| 00:00:46 |
--------------------------------------------------------------------------

Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------

   1 - SEL$1 / VBAK@SEL$1

Outline Data
-------------

 

Column Projection Information (identified by operation id):
-----------------------------------------------------------

   1 - "VBELN"[VARCHAR2,30], "ERDAT"[VARCHAR2,24]


43 rows selected.

2、获取表的定义DDL。
SQL> set long 9000
SQL> set heading off
SQL> set serveroutput on size 1000000
SQL> select dbms_metadata.get_ddl('TABLE','ZMMT004','SAPSR3') from dual;


  CREATE TABLE "SAPSR3"."ZMMT004"
   (    "MANDT" VARCHAR2(9) DEFAULT '000' NOT NULL ENABLE,
        "TBELN" VARCHAR2(30) DEFAULT ' ' NOT NULL ENABLE,
        "DJTYP" VARCHAR2(9) DEFAULT ' ' NOT NULL ENABLE,
        "ZJYDM" VARCHAR2(15) DEFAULT ' ' NOT NULL ENABLE,
        "ERDAT" VARCHAR2(24) DEFAULT '00000000' NOT NULL ENABLE,
        "CPUTM" VARCHAR2(18) DEFAULT '000000' NOT NULL ENABLE,
        "KUNNR" VARCHAR2(30) DEFAULT ' ' NOT NULL ENABLE,
        "NAME1" VARCHAR2(120) DEFAULT ' ' NOT NULL ENABLE,

        "NAME2" VARCHAR2(120) DEFAULT ' ' NOT NULL ENABLE,
        "STATU1" VARCHAR2(3) DEFAULT ' ' NOT NULL ENABLE,

        "STATU2" VARCHAR2(3) DEFAULT ' ' NOT NULL ENABLE,
        "ZRDAT" VARCHAR2(24)
   ) SEGMENT CREATION IMMEDIATE
  PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
 NOCOMPRESS LOGGING
  STORAGE(INITIAL 16384 NEXT 1048576 MINEXTENTS 1 MAXEXT
ENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "PSAPSR3"

3.关于自己的Session信息
#Get Session ID
select sid from v$mystat where rownum<2; # 112

#Get Session Address
select saddr from v$session where sid=112; # 07000001FC8FC450

#Session有无事务
select count(*) from v$transaction where ses_addr='07000001FC8FC450';

#有无锁定的对象
select count(*) from v$locked_object;

#查询锁对象的ID
select object_id from v$locked_object;   # 866408

#查询锁住的具体对象及属主
col OWNER format a10;
col OBJECT_NAME format a30;
select owner,object_name from dba_objects where object_id=866408;

SELECT VBELN,ERDAT,AUDAT FROM SAPSR3.VBAK;

col sql_text format a25;
col sql_id format a12;
col hash_value format 999999999999999;
col child_number format 99999999999;
select sql_text,sql_id,hash_value,child_number from v$sql where sql_text like 'SELECT VBELN,ERDAT%';

SELECT VBELN,ERDAT,AUDAT FROM SAPSR3.VBAK
8769974d8185n  444637364            0


3、Age out Shared Pool。
4、P108 AWR SQL Report
   强 P110 监控有问题的SQL和应用时。
   P114扩展了我对AWR的应用。
5、得到当前SQL的SQL_ID及Child Cursor Number,并进一步查询共执行计划。   P121
6、表访问方法:(1)全表扫描(Table Access Full Scan); (2)ROWID扫描(Table Access By User Rowid或 Table Access By Index Rowid)。
7、与B树索引相关的执行计划
索引唯一扫描 Index Unique Scan
索引范围扫描 Index Ranges Scan
索引全扫描 Index Full Scan
索引快速全扫描 Index Fast Full Scan
索引跳跃式扫描 Index Skip Scan
8、强制索引方法hint   P127 
   有时不走索引,加HINT也没有用,因为索引列没有NOT NULL属性(没有可能会丢失数据,造成不准确)。
9、与位图索引相关的执行计划
   位图索引主要用于数据仓库或DSS系统,由于实现了快捷的按位运算的缘故,在某些场合,会比B树索引快很多。
10、与表连接相关的执行计划
排序合并连接、嵌套循环连接、哈希连接、反连接、半连接
排序SQRT JOIN,合并 MERGE JOIN, 嵌套循环NESTED LOOPS,哈希连接HASH JOIN,反连接ANTI...,半连接SEMI...。
11、改变嵌套循环连接的驱动表。 P141
12、PGA中排序  P158  BUFFER SORT不一定会排序,有可能排,有可能不排。是否真实排序了,见P159
13、证明是否发生过排序  10032事件。
14、UNION与UNION ALL区别 P167 CONCATENATION,UNION ALL
15、P174不错的例了,建表,插数,更新统计信息,执行计划。
16、如何利用SQL Tuning Advisor来优化SQL?  SQL Profiel  P175
17、Shared Pool, AWR Repository中指定SQL的指定执行谟的Outline Data部分的Hint。。。
18、无招胜有招,Manual类型的SQL Profile可以在不改变SQL的SQL文本情况下改变其执行计划。
19、SQL Plan Baseline
SQL> show parameter sql_plan;
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
optimizer_capture_sql_plan_baselines boolean     FALSE
optimizer_use_sql_plan_baselines     boolean     TRUE

20、查SQL有无SQL Plan Baseline  P192
21、通过修改索引的聚集因子,改变其执行计划,结合SQL Plan Baseline举例展示。 P193 Drop SQL Plan Baseline P202






<!-- 正文结束 -->

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/21180662/viewspace-1115822/,如需转载,请注明出处,否则将追究法律责任。

上一篇: 没有了~
下一篇: 没有了~
请登录后发表评论 登录
全部评论

注册时间:2009-03-22