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

如何查看查询转换器在Oracle中生成的查询,oracle,database-administration,sql-tuning,Oracle,Database Administration,Sql Tuning,据我所知,如果可能的话,查询转换器会将我们的查询转换为更好的查询。因此,我执行的查询和最后执行的查询数据库可能不同 如何查看数据库执行的最终查询?我指的是查询转换器的结果。Oracle提供了一个工具,允许您查看查询的执行计划。这将深入了解所执行的优化,并提供一个基于成本度量手动优化查询的机会。Oracle不会生成可供您检查的修订查询 解释计划文档在这里要查看优化器使用的转换查询,您应该使用10053跟踪。但执行计划更方便,通常也足够好 示例模式 举个简单的例子,这个模式包含两个简单的表,第二个表

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


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

Oracle提供了一个工具,允许您查看查询的执行计划。这将深入了解所执行的优化,并提供一个基于成本度量手动优化查询的机会。Oracle不会生成可供您检查的修订查询


解释计划文档在这里

要查看优化器使用的转换查询,您应该使用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下的子目录中。例如,在我的电脑上是文件D:\app\jon\virtual\diag\rdbms\orcl12\orcl12\trace\orcl12\u ora\u 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 |
------------------------------------------------------------------------

执行计划显示了如何仅使用一个对象。它没有解释使用了加入消除,您必须对此进行推断。

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

应采取的步骤:

alter session set tracefile_identifier= Test; 
alter session set sql_trace = true; 
select * from "Your query"; 
alter session set sql_trace = false; 
select value from v$diag_info where name = ‘Diag Trace’; 

cd  "path from the above query"

tkprof "required filename.trc" try_ex.txt
使用tkprof创建的跟踪文件提供了详细信息。
有关tkprof的更多信息,请查看Oracle文档。

检查执行计划您可以通过将代码缩进四个空格来格式化代码吗?这是可以执行此操作的链接。TKPROF不显示最终的转换查询。它确实显示了执行计划(和实际数字),但有更简单的方法生成执行计划。解释计划并不总是显示正在执行或将要执行的实际计划。SQL Monitor确实是最好的工具,因为它“始终打开”,并将显示实际的执行统计信息。当第一次执行查询时,在这种情况下,它将被转换,一旦执行计划存储在库缓存中,tkprof就会显示这一点。