12
返回列表 发新帖
楼主: mytaobao

请问如果要得到程序运行时的执行计划,该如何做?

[复制链接]
招聘 : Java研发
论坛徽章:
71
马上加薪
日期:2014-02-19 11:55:14蜘蛛蛋
日期:2012-12-26 18:16:01茶鸡蛋
日期:2012-11-16 08:12:48ITPUB 11周年纪念徽章
日期:2012-10-09 18:05:07奥运会纪念徽章:网球
日期:2012-08-23 14:58:08奥运会纪念徽章:沙滩排球
日期:2012-07-19 17:28:14版主2段
日期:2012-07-07 02:21:02咸鸭蛋
日期:2012-03-23 18:17:482012新春纪念徽章
日期:2012-02-13 15:13:512012新春纪念徽章
日期:2012-02-13 15:13:51
11#
发表于 2007-12-16 18:42 | 只看该作者
原帖由 fusnow 于 2007-12-15 14:30 发表
俺一般都是用OEM,省事啊。

By trace OEM,I  got this
for 10G
[php]
SELECT EXECORD EXEC_ORDER, PLANLINE
  FROM (SELECT PLANLINE, ROWNUM EXECORD, ID, RID
          FROM (SELECT PLANLINE, ID, RID, LEV
                  FROM (SELECT lpad(' ', 2 * (LEVEL), rpad(' ', 80, ' ')) ||
                               OPERATION || ' ' || -- Operation
                               DECODE(OPTIONS,
                                      NULL,
                                      '',
                                      '(' || OPTIONS || ') ') || -- Options
                               DECODE(OBJECT_OWNER,
                                      null,
                                      '',
                                      'OF ''' || OBJECT_OWNER || '.') || -- Owner
                               DECODE(OBJECT_NAME,
                                      null,
                                      '',
                                      OBJECT_NAME || ''' ') || -- Object Name
                               DECODE(OBJECT_TYPE,
                                      null,
                                      '',
                                      '(' || OBJECT_TYPE || ') ') || -- Object Type
                               DECODE(ID, 0, 'OPT_MODE:') || -- Optimizer
                               DECODE(OPTIMIZER,
                                      null,
                                      '',
                                      'ANALYZED',
                                      '',
                                      OPTIMIZER) ||
                               DECODE(NVL(COST, 0) + NVL(CARDINALITY, 0) +
                                      NVL(BYTES, 0),
                                      0,
                                      null,
                                      ' (COST=' || TO_CHAR(COST) || ',CARD=' ||
                                      TO_CHAR(CARDINALITY) || ',BYTES=' ||
                                      TO_CHAR(BYTES) || ')') PLANLINE,
                               ID,
                               LEVEL LEV,
                               (SELECT MAX(ID)
                                  FROM v$sql_plan PL2
                                CONNECT BY PRIOR ID = PARENT_ID
                                       AND PRIOR sql_id = sql_id
                                 START WITH ID = PL1.ID
                                        AND sql_id = PL1.sql_id) RID
                          FROM v$sql_plan PL1
                        CONNECT BY PRIOR ID = PARENT_ID
                               AND PRIOR sql_id = sql_id
                         START WITH ID = 0
                                AND PL1.SQL_ID = '&sqlid')
                 ORDER BY RID, -LEV))
ORDER BY ID
--------

[/php]

[ 本帖最后由 anlinew 于 2007-12-16 18:47 编辑 ]

使用道具 举报

回复
论坛徽章:
47
蒙奇·D·路飞
日期:2017-03-27 08:04:23马上有车
日期:2014-02-18 16:41:112014年新春福章
日期:2014-02-18 16:41:11一汽
日期:2013-09-01 20:46:27复活蛋
日期:2013-03-13 07:55:232013年新春福章
日期:2013-02-25 14:51:24ITPUB 11周年纪念徽章
日期:2012-10-09 18:03:322012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:20
12#
发表于 2007-12-16 23:11 | 只看该作者
原帖由 anlinew 于 2007-12-16 04:42 发表

By trace OEM,I  got this
for 10G
[php]
SELECT EXECORD EXEC_ORDER, PLANLINE
...
                         START WITH ID = 0
                                AND PL1.SQL_ID = '&sqlid')
                 ORDER BY RID, -LEV))
ORDER BY ID
--------

[/php]


Quite complicated. So Oracle EM group's code does not restrict the result to individual child cursors. If v$sql_plan happens to have multiple child cursors (they all have the same hash_value and same sql_id), the above query could mix lines from different children together. Could the connect-by and start-with avoid that?

Yong Huang

使用道具 举报

回复
论坛徽章:
138
19周年集字徽章-19
日期:2020-06-08 08:30:56马上加薪
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-18 16:42:022014年新春福章
日期:2014-02-18 16:42:02路虎
日期:2013-11-22 12:26:18问答徽章
日期:2014-05-08 12:15:31
13#
发表于 2007-12-17 09:22 | 只看该作者
10g 直接用dbms_xplan.display_cursor得到的就是格式化过的

使用道具 举报

回复
招聘 : Java研发
论坛徽章:
71
马上加薪
日期:2014-02-19 11:55:14蜘蛛蛋
日期:2012-12-26 18:16:01茶鸡蛋
日期:2012-11-16 08:12:48ITPUB 11周年纪念徽章
日期:2012-10-09 18:05:07奥运会纪念徽章:网球
日期:2012-08-23 14:58:08奥运会纪念徽章:沙滩排球
日期:2012-07-19 17:28:14版主2段
日期:2012-07-07 02:21:02咸鸭蛋
日期:2012-03-23 18:17:482012新春纪念徽章
日期:2012-02-13 15:13:512012新春纪念徽章
日期:2012-02-13 15:13:51
14#
发表于 2007-12-17 09:22 | 只看该作者
原帖由 Yong Huang 于 2007-12-16 23:11 发表


Quite complicated. So Oracle EM group's code does not restrict the result to individual child cursors. If v$sql_plan happens to have multiple child cursors (they all have the same hash_value and same sql_id), the above query could mix lines from different children together. Could the connect-by and start-with avoid that?

Yong Huang


the above query could mix lines from different children together

的确是这样

使用道具 举报

回复
招聘 : Java研发
论坛徽章:
71
马上加薪
日期:2014-02-19 11:55:14蜘蛛蛋
日期:2012-12-26 18:16:01茶鸡蛋
日期:2012-11-16 08:12:48ITPUB 11周年纪念徽章
日期:2012-10-09 18:05:07奥运会纪念徽章:网球
日期:2012-08-23 14:58:08奥运会纪念徽章:沙滩排球
日期:2012-07-19 17:28:14版主2段
日期:2012-07-07 02:21:02咸鸭蛋
日期:2012-03-23 18:17:482012新春纪念徽章
日期:2012-02-13 15:13:512012新春纪念徽章
日期:2012-02-13 15:13:51
15#
发表于 2007-12-17 09:33 | 只看该作者
原帖由 棉花糖ONE 于 2007-12-17 09:22 发表
10g 直接用dbms_xplan.display_cursor得到的就是格式化过的




dbms_xplan.display_cursor(
sql_id          IN VARCHAR2 DEFAULT NULL,
cursor_child_no IN INTEGER DEFAULT 0,
format          IN VARCHAR2 DEFAULT 'TYPICAL')
RETURN dbms_xplan_type_table PIPELINED;
conn / as sysdba

GRANT SELECT ON v_$sql_plan TO uwclass;
GRANT SELECT ON gv_$sql TO uwclass;
GRANT SELECT ON v_$session TO uwclass;

conn uwclass/uwclass

SELECT COUNT(*)
FROM plan_table;

-- most recent cursor
SELECT * FROM TABLE(dbms_xplan.display_cursor);

-- named statement
SELECT /* XPLAN_CURSOR */ DISTINCT s.srvr_id
FROM servers s, serv_inst i
WHERE s.srvr_id = i.srvr_id;

SELECT sql_id, child_number
FROM gv$sql
WHERE sql_text LIKE '%XPLAN_CURSOR%';

SELECT * FROM TABLE(dbms_xplan.display_cursor('cpm9ss48qd32f', 0));

SELECT * FROM TABLE(dbms_xplan.display_cursor('dpcugg8dz3y5k'));

or

SELECT t.*
FROM gv$sql s,
TABLE(dbms_xplan.display_cursor(s.sql_id, s.child_number)) t
WHERE sql_text LIKE '%XPLAN_CURSOR%';

[ 本帖最后由 anlinew 于 2007-12-17 09:40 编辑 ]

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表