oracle中查询性能的衡量方法
Posted
技术标签:
【中文标题】oracle中查询性能的衡量方法【英文标题】:How to measure performance of query in oracle 【发布时间】:2009-08-21 15:29:33 【问题描述】:我是 Oracle 数据库的新手。我有 2 个查询返回相同的结果集。我想衡量他们每个人的表现并选择更好的。如何使用 Oracle SQL 开发人员做到这一点?我记得读过某些工具提供统计数据。有关如何阅读这些统计数据的任何指示?
更新:根据 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 更好。关于磁盘、查询和当前参数的含义有什么帮助吗??
【问题讨论】:
您提到查询 1 和查询 2 返回相同的结果集。但是,tkprof 文件显示查询 1 返回 23959 行,查询 2 返回 15992 行。不完全相等... 好吧,查询是视图创建的一部分。返回的行数不同,因为查询创建视图的方式不同。第一个查询使用联合,第二个查询使用 LOJ,并且由于第一个查询使用 unios,因此有一些记录重复,这在第二个查询的情况下不会发生 【参考方案1】:SQL 编辑器上方有一个名为“Explain Plan”的按钮。该工具将告诉您每条路由的成本,以及该语句将如何使用索引和分区。请注意,您可能会收到一个错误,您的 DBA 需要为您的用户帐户打开一项功能,我相信它是“跟踪”,但在这一点上可能是错误的。阅读执行语句输出一开始可能具有挑战性,但它是帮助编写良好 SQL 的好工具。
【讨论】:
Thx.Yep 我确实在解释选项卡下看到了结果。一个名为成本的列出现,带有数字。我将不得不深入研究 oracle 文档来解释这些数字的含义 我强烈建议您深入研究这些文档。做一些关于优化和 Oracle 调优的谷歌搜索。 (Burleson 有一些好东西 - 谷歌“Oracle Burleson”以查看包含提示的咨询网站。)查看此内容以了解您在“解释计划”中看到的内容的概述。 akadia.com/services/ora_interpreting_explain_plan.html 如另一条评论所述,仅检查速度并没有多大意义。环境可以改变事物 - 一种环境中的快可能在另一种环境中很慢。 但是学习这些东西需要时间。尽力而为,现在检查速度,然后尽可能多地吸收并随时调整。【参考方案2】:恐怕 EXPLAIN PLAN 是唯一的方法。首先假设成本较低(如果您查看说明计划,应该有一个名为 COST 的列)更好,但您需要阅读它以便您了解更多信息。也许你有一个 DBA 可以和你聊天?如果没有您的数据和查询,很难提供进一步的建议
对于与开发甲骨文有关的任何事情,Tom Kyte(谷歌他)或搜索the Ask Tom website 是一个很好的起点。如果你真的想参与进来
只运行几次查询是一个非常糟糕的主意 - 相当于只是接受解释计划的成本告诉您最佳查询。您确实需要考虑您的查询占用了哪些资源,以及它如何影响您的生产系统。
取决于查询被调用的频率会影响您跟踪查询性能的程度(很抱歉,纯粹主义者,但确实如此)。如果查询每周只运行一次并且需要一分钟才能运行而不影响其他任何内容,那么您是否需要优化该查询?使用逻辑上更容易遵循的查询是否更易于维护?
如果查询每秒被调用多次,那么您需要完全理解解释计划,并进一步了解如何将查询优化到最佳性能
【讨论】:
【参考方案3】:基本答案 - 将每个查询执行几次,看看哪个更快。最好的部分 - 您可以在不了解 Oracle 性能的情况下做到这一点。您唯一需要知道的是,您不能信任第一次尝试,因为大多数情况下它将从磁盘读取数据,而第二次尝试将使用 RAM 中的缓存数据。这就是为什么您要多次尝试每个查询。
【讨论】:
如果“更快”查询使用大量临时空间怎么办?一旦转移到生产环境,多个用户使用该临时空间,“更快”的查询可能会变得更慢,因为它可能会开始分页。确定查询速度的问题在于答案总是“视情况而定”。最好使用解释计划,同时记下使用的临时空间,然后根据服务器环境进行评估。虽然这很难做好 - 我仍在学习。 解释计划很好,但首先你必须能够阅读它。如果您今天必须在两个查询之间做出选择,并且您一生都没有见过解释计划工具,那么那些 NESTED LOOP/HASH JOIN/INDEX RANGE SCAN/INDEX FFS 将不会真正帮助您。如果您有几周的时间,那么当然可以先去学习 Oracle 性能调优,然后再编写查询。【参考方案4】:在 OTN 上,Randolf Geist 和我写了两篇关于如何衡量性能的文章。如果您按照这些线程中的指示进行操作,您将收集到能够选择更好的信息。
如果您想要完整版,请访问Randolf's。
如果你想要一个简短的版本,请访问mine:
两个线程都解释了如何使用解释计划和跟踪来查看时间花在了哪里。然后由你来决定你到底有什么资格“更好”。这可以是最短的运行时间、最少的资源使用量、最少的锁存器数量,或者其他。
希望这会有所帮助。
问候, 抢。
【讨论】:
链接失效以上是关于oracle中查询性能的衡量方法的主要内容,如果未能解决你的问题,请参考以下文章
DateTime.Now 是衡量函数性能的最佳方法吗? [关闭]