|
再聚一个例子:谓词信息,在分析SQL执行计划的时候也是非常重要的,至少要知道Oracle是怎么过滤的表的吧。
分析了DBMS_XPLAN.DISPLAY_CURSOR的源码,发现原来Access和Filter是来源:GV$SQL_PLAN.ACCESS_PREDICATES和GV$SQL_PLAN.FILTER_PREDICATES,之后,自己用简单的代码就可以将谓词信息添加到我自己的执行计划报告里面(结果和DBMS_XPLAN.DISPLAY_CURSOR的效果一模一样):
- -------------------------
- ----Predicate Information (identified by operation id):
- OUTPUT(' ');
- OUTPUT('Predicate Information (identified by operation id):');
- OUTPUT('---------------------------------------------------');
- L_PREINFOR_CNT:=0;
- FOR REC IN (
- SELECT LPAD(SP.ID,4,' ')||' - '
- ||CASE
- WHEN SP.ACCESS_PREDICATES IS NOT NULL AND SP.FILTER_PREDICATES IS NOT NULL THEN
- 'access('||SP.ACCESS_PREDICATES||')'||CHR(10)||RPAD(' ',7,' ')||'filter('||SP.FILTER_PREDICATES||')'
- WHEN SP.ACCESS_PREDICATES IS NOT NULL THEN 'access('||SP.ACCESS_PREDICATES||')'
- WHEN SP.FILTER_PREDICATES IS NOT NULL THEN 'filter('||SP.FILTER_PREDICATES||')'
- END Predicate_Infor
- FROM GV$SQL_PLAN SP
- WHERE 1=1
- AND ACCESS_PREDICATES||FILTER_PREDICATES IS NOT NULL
- AND SP.INST_ID=L_INST_ID
- AND SP.SQL_ID=L_SQL_ID
- AND SP.CHILD_ADDRESS=L_SQL_CHILD_ADDRESS) LOOP
- OUTPUT(REC.Predicate_Infor);
- L_PREINFOR_CNT:=L_PREINFOR_CNT+1;
- END LOOP;
- IF L_PREINFOR_CNT=0 THEN
- OUTPUT('(NULL)');
- END IF;
复制代码 |
|