问:在 Oracle 10g 中有什么好的方法可以客观地衡量查询的性能吗?
- Oracle 跟踪是衡量性能的最佳方式。执行查询并让 Oracle 检测执行。在 SQLPlus 环境中,使用 AUTOTRACE 非常容易。
http://asktom.oracle.com/tkyte/article1/autotrace.html(文章已移动)
http://tkyte.blogspot.com/2007/04/when-explanation-doesn-sound-quite.html
http://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:5671636641855
在其他环境中启用 Oracle 跟踪也没有那么困难。
问:几天来我一直在调整一个特定的查询。我得到了一个似乎运行得更快的版本(至少根据我的初始测试),但 EXPLAIN 成本大致相同。
- 语句的实际执行是需要衡量的。 EXPLAIN PLAN 在预测优化器计划方面做得不错,但它实际上并没有衡量性能。
问:> 1 . EXPLAIN 成本遗漏某些东西的可能性有多大?
- 不太可能,但我见过 EXPLAIN PLAN 提出与优化器不同的计划的情况。
问:> 2 .是否存在 EXPLAIN 成本与查询的实际性能不成比例的特殊情况?
- 简短的回答是我没有观察到任何。但是话又说回来,EXPLAIN PLAN 成本与实际观察到的性能之间并没有真正的直接关系。 EXPLAIN PLAN 可能会给出一个非常高的成本数字,但要让实际查询在不到一秒的时间内运行。 EXPLAIN PLAN 不会衡量查询的实际性能,因为您需要 Oracle 跟踪。
问:> 3 .我在这个查询中使用了 first_rows 提示。这有影响吗?
- 任何提示(如
/*+ FIRST_ROWS */)都可能影响优化器选择的计划。
EXPLAIN PLAN 返回的“成本”是相对的。这是一个性能指标,但不是一个准确的衡量标准。您无法将成本数字转换为磁盘操作数或 CPU 秒数或等待事件数。
通常,我们发现 EXPLAIN PLAN 成本显示为 1 的语句将“非常快”地运行,而 EXPLAIN PLAN 成本大约为五或六位数的语句将需要更多时间跑步。但并非总是如此。
优化器所做的是比较许多可能的执行计划(全表扫描、使用索引、嵌套循环连接等)。优化器为每个计划分配一个编号,然后选择编号最小的计划.
我见过 EXPLAIN PLAN 显示的优化器计划与执行语句时使用的实际计划不匹配的情况。十年前我在 Oracle8 中看到了这一点,特别是当语句涉及绑定变量而不是文字时。
要获取语句执行的实际成本,请为您的语句启用跟踪。
最简单的方法是使用 SQLPlus AUTOTRACE。
[http://asktom.oracle.com/tkyte/article1/autotrace.html][4]
在SQLPlus环境之外,可以开启Oracle Tracing:
更改会话设置 timed_statistics = true;
更改会话集 tracefile_identifier = here_is_my_session;
更改会话集事件'10046 永远跟踪名称上下文,级别 12'
--alter session set events '10053 永远跟踪名称上下文,级别 1'
选择 /*-- your_statement_here --*/ ...
更改会话集事件“10046 跟踪名称上下文关闭”
--alter session set events '10053 跟踪名称上下文关闭'
这会将跟踪文件放入服务器上的 user_dump_dest 目录。生成的跟踪文件将包含语句计划和所有等待事件。 (分配的跟踪文件标识符包含在文件名中,便于在 udump 目录中找到您的文件)
从 v$parameter 中选择值,其中名称如 'user_dump_dest'
如果您无权访问跟踪文件,则需要从 dba 获得帮助才能访问。 (dba 可以创建一个简单的 shell 脚本,开发人员可以针对 .trc 文件运行该脚本以运行 tkprof,并更改跟踪文件和 tkprof 输出的权限。您还可以使用较新的 trcanlzr。Oracle metalink 上有关于两者都有。