我如何查看查询转换器在Oracle中生成的查询

问题描述 投票:2回答:3

据我所知,查询转换器将我们的查询转换为更好的查询。因此,我执行的查询和最后执行的查询数据库可以不同。

如何查看数据库执行的最终查询?我的意思是查询转换器的结果。

oracle database-administration sql-tuning
3个回答
1
投票

要查看优化器使用的转换查询,应使用10053跟踪。但是执行计划更方便,通常也足够好。

示例架构

举个简单的例子,该模式包含两个简单的表,第二个表中的每一行必须在第一个表中。

--drop table test2;
--drop table test1;

create table test1(a number primary key);
create table test2(a number primary key references test1(a));

我们想生成一个简单的查询,其中转换后的查询将不同于原始查询。为此,以下查询具有不必要的联接。由于存在内部联接,因此TEST2中的每一行必须存在一次,并且在TEST1中必须存在一次,因此Oracle不需要进行联接。相反,Oracle只需要从TEST2的单个表或索引中读取。

select count(*) new_name_for_hard_parse_01
from test1
join test2 on test1.a = test2.a;

10053跟踪

要查找优化器使用的精确查询,您需要生成10053跟踪。例如:

alter session set events '10053 trace name context forever, level 1';

select count(*) new_name_for_hard_parse_02
from test1
join test2 on test1.a = test2.a;

alter session set events '10053 trace name context off';

((请注意我如何为该列使用其他名称。您需要更改查询并强制进行硬解析。否则,Oracle可能会简单地重用现有的执行计划,而不会生成跟踪。)

请稍等,文件将显示在某个位置的跟踪目录中。根据版本和配置,文件可能位于USER_DUMP_DEST或DIAGNOSTIC_DEST下的子目录中。例如,在我的PC上是文件D:\ app \ jon \ virtual \ diag \ rdbms \ orcl12 \ orcl12 \ trace \ orcl12_ora_22576.trc

打开文件并查找如下部分:

...
Final query after transformations:******* UNPARSED QUERY IS *******
SELECT COUNT(*) "NEW_NAME_FOR_HARD_PARSE_02" FROM "JHELLER"."TEST2" "TEST2"
....

跟踪文件解释了不同的转换并显示了最终查询。

但是您几乎永远都不想使用Oracle跟踪文件。跟踪文件不方便,命令没有文档说明,无法正常运行,并且您将永远无法访问服务器文件系统。对于99.9%的Oracle性能调优,跟踪是浪费时间。

执行计划

执行计划是一种确定查询运行方式的更快方法,这可能是您感兴趣的。

explain plan for
select count(*) new_name_for_hard_parse_01
from test1
join test2 on test1.a = test2.a;

select * from table(dbms_xplan.display);

结果:

Plan hash value: 4187894267

------------------------------------------------------------------------
| Id  | Operation        | Name        | Rows  | Cost (%CPU)| Time     |
------------------------------------------------------------------------
|   0 | SELECT STATEMENT |             |     1 |     0   (0)| 00:00:01 |
|   1 |  SORT AGGREGATE  |             |     1 |            |          |
|   2 |   INDEX FULL SCAN| SYS_C009744 |     1 |     0   (0)| 00:00:01 |
------------------------------------------------------------------------

执行计划显示了如何仅使用一个对象。它没有说明使用了消除连接,您必须进行推断。


1
投票

Oracle提供了一个工具,使您可以查看查询的执行计划。这样可以深入了解所执行的优化,并提供机会根据成本指标手动优化查询。 Oracle不会生成您可以检查的修订查询。

EXPLAIN PLAN文档在这里https://docs.oracle.com/cd/B19306_01/server.102/b14211/ex_plan.htm#g42231


0
投票

如果您的Oracle软件版本具有许可,则可以尝试使用TKPROF实用程序。

要遵循的步骤:

更改会话集tracefile_identifier =测试;

更改会话集sql_trace = true;

从“您的查询”中选择*;

更改会话集sql_trace = false;

从v $ diag_info中选择值,其中名称=“诊断跟踪”;

cd“来自上述查询的路径”

tkprof“必需的filename.trc” try_ex.txt

并且使用tkprof创建的跟踪文件提供了详细信息。有关tkprof的更多信息,请查阅Oracle文档。

© www.soinside.com 2019 - 2024. All rights reserved.