获取查询的运行时执行计划

Posted

技术标签:

【中文标题】获取查询的运行时执行计划【英文标题】:get runtime execution plan of a query 【发布时间】:2013-01-23 12:55:02 【问题描述】:

我有一个执行一些 sql 查询的应用程序。如何从 sqlplus 或其他 Oracle 客户端获取当前执行查询的执行计划?如果有必要,我可以修改应用程序中使用的 oracle 会话。

我不想使用explain plan 并手动执行该查询,我需要获取用于查询的实际执行计划。

【问题讨论】:

【参考方案1】:

您可以对来自 SGA 的历史查询运行 explain plain -examples

然后列出 B。

例子:

SELECT username, prev_sql_id
FROM v$session
WHERE username = 'RDEVALL'  -- example user

返回的 SQL ID

RDEVALL a1d4z5ruduzrd
RDEVALL avmbutuknvb6j
RDEVALL 75g0tqd9x743y
RDEVALL 5fnkh6c8mqqt3
RDEVALL 75g0tqd9x743y

选择查询 ID 并在此处使用:

SELECT *
  FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR('a1d4z5ruduzrd')); -- replace with sql ID as needed

【讨论】:

此外,您可以根据其他搜索条件查询 v$session,例如机器名称、程序名称等,如果这对确定要定位哪个 SQL 语句更有意义。运行 DESC V$SESSION 以查看所有相关列。 DBMS_XPLAN.DISPLAY_CURSOR() 有问题。我有两个用户在两个不同的会话中运行相同的查询。由于查询相同,因此两个会话中查询的哈希键相同。调用DBMS_XPLAN.DISPLAY_CURSOR(),怎么不指定session呢?我相信这个函数返回的是计划的执行计划,而不是在特定会话中运行的实际执行计划。 @HansDeragon,你最好提供你所面临的场景的例子。它可以帮助更多地了解情况。

以上是关于获取查询的运行时执行计划的主要内容,如果未能解决你的问题,请参考以下文章

衡量查询性能:“执行计划查询成本”与“所用时间”

sql 在运行查询和在存储过程中运行该查询时使用不同的执行计划?

使用 Drill 查询获取 PostgreSQL 执行计划

有啥命令可以获取大查询执行计划吗?

Oracle 11 查询在前 2 次执行时运行速度很快,随后运行速度较慢,没有计划更改

自适应查询执行:在运行时提升Spark SQL执行性能