Sql 如何在oracle中度量查询性能

Sql 如何在oracle中度量查询性能,sql,oracle,sqlperformance,Sql,Oracle,Sqlperformance,我是Oracle db的新手。我有两个查询返回相同的结果集。我想衡量每一种方法的性能,并选择更好的方法。如何使用Oracle SQL developer做到这一点?我记得读到过某些工具提供统计数据。有关于如何读取这些统计数据的提示吗 更新:正如Rob Van所建议的,我使用tkprof实用程序来查找查询的性能。有几个参数我能理解(计数、行、运行时间、执行时间),但大多数我不能。有谁能帮我弄清楚这些参数的重要性吗?以下是结果 Query 1: call count cpu

我是Oracle db的新手。我有两个查询返回相同的结果集。我想衡量每一种方法的性能,并选择更好的方法。如何使用Oracle SQL developer做到这一点?我记得读到过某些工具提供统计数据。有关于如何读取这些统计数据的提示吗

更新:正如Rob Van所建议的,我使用tkprof实用程序来查找查询的性能。有几个参数我能理解(计数、行、运行时间、执行时间),但大多数我不能。有谁能帮我弄清楚这些参数的重要性吗?以下是结果

Query 1:
call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse        1      0.01       0.01          0          0          0           0
Execute      1      0.00       0.00          0          0          0           0
Fetch       49      0.26       0.32         45        494          0       23959
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total       51      0.28       0.33         45        494          0       23959

Query2:
call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse        1      0.00       0.00          0          0          0           0
Execute      1      0.00       0.00          0          0          0           0
Fetch       33      0.25       0.24          0        904          0       15992
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total       35      0.25       0.24          0        904          0       15992

我可以确定查询2比查询1好。有关磁盘、查询和当前参数的含义的任何帮助???

SQL编辑器上方有一个名为“解释计划”的按钮。该工具将告诉您每条路由的成本,以及该语句将如何使用索引和分区。注意,您可能会遇到一个错误,您的DBA需要为您的用户帐户打开一个功能,我相信它是“跟踪”,但在这一点上可能是错误的。读取execute语句输出一开始可能很有挑战性,但它是帮助编写好SQL的好工具。

基本答案-执行每个查询几次,看看哪个查询更快。最好的部分—您可以在不了解Oracle性能的情况下完成此操作。您需要知道的唯一一件事是,您不能信任第一次尝试,因为大部分时间它将从磁盘读取数据,而第二次尝试将使用RAM中的缓存数据。这就是为什么每个查询都要尝试几次。

在OTN上,Randolf Geist和我写了两篇关于如何衡量性能的帖子。如果您按照这些线程中的指示进行操作,您将收集信息,以便能够选择更好的

如果您想要完整版本,请访问

如果需要简短版本,请访问:

这两个线程都解释了如何使用explain plan和TRACKING来查看时间花在哪里。然后由你来决定什么才是“更好的”。这可以是最短的运行时间、最少的资源使用量、最少的锁存数量,或者其他一些

希望这有帮助

问候,,
罗伯。

恐怕解释计划是唯一的办法。首先,假设较低的成本(如果您查看解释计划,应该有一个名为成本的专栏)更好,但您需要仔细阅读,以便了解更多信息。也许你有一个DBA可以和你聊天?如果没有您的数据和查询,很难进一步提供建议

对于任何与开发甲骨文有关的东西,一个好的起点是Tom Kyte(谷歌他)的任何东西或搜索。如果你真的想参与进来

只运行几次查询是一个非常糟糕的想法——相当于接受解释计划的成本告诉您最好的查询。您确实需要考虑您的查询占用了哪些资源,以及它如何影响您的生产系统

根据调用查询的频率,您需要跟踪查询性能的程度会受到影响(对于纯粹主义者来说,这很抱歉,但确实如此)。如果查询每周只运行一次,并且运行一分钟不会影响其他任何内容,那么您是否需要优化该查询?使用逻辑上更容易遵循的查询是否更易于维护


如果查询每秒被调用多次,则您需要完全理解解释计划,并进一步了解如何优化查询以获得最佳性能。是的,我确实看到了“解释”选项卡下的结果。此时会出现一个名为“成本”的列,其中包含数字。我必须深入研究oracle文档来解释这些数字的含义。我强烈建议深入研究这些文档。在谷歌上搜索优化和Oracle调优。(Burleson有一些好东西——谷歌“OracleBurleson”可以看到一个包含提示的咨询网站。)看看这篇文章,你可以从“解释计划”中看到一些概述。正如另一篇评论中所指出的,仅仅检查速度并没有多大意义。环境可以改变事情——在一种环境下快,在另一种环境下慢。但是学习这些东西需要时间。你最好先检查一下速度,然后尽可能多地吸收,边走边调整。如果“更快”的查询占用了大量的临时空间怎么办?一旦转移到生产环境,多个用户使用该临时空间,“更快”的查询可能会变得更慢,因为它可以开始分页。确定查询速度的问题在于答案总是“视情况而定”。最好使用explain plan,也记录所使用的临时空间,然后根据服务器环境进行评估。虽然这很难做好,但我还在学习。解释这个计划很好,但首先你必须能够阅读它。如果您今天必须在两个查询之间做出选择,并且您一生中都没有见过解释计划工具,那么这些嵌套循环/散列连接/索引范围扫描/索引FFS将不会真正帮助您。如果您有几周的时间,那么一定要先学习Oracle性能调优,然后再编写查询。您提到查询1和查询2返回相同的结果集。但是,tkprof文件显示查询1返回23959行,查询2返回15992行。不完全相等…好的,查询是视图创建的一部分。返回的行数不同,因为查询创建视图的方式不同。第一个查询使用UNION,第二个查询使用LOJ,因为第一个查询使用unios,所以会复制一些记录,这在第二个查询中不会发生链接失效