如何测量oracle中的查询性能

如何测量oracle中的查询性能

问题描述:

我是Oracle db的新手。我有2个查询返回相同的结果集。我想衡量他们每个人的表现,并选择更好的人。我如何使用Oracle SQL开发者来做到这一点?我记得有些工具提供了统计数据。任何关于如何阅读这些统计数据的指针?如何测量oracle中的查询性能

更新:正如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更好。对磁盘,查询和当前参数的任何帮助意味着什么?

+0

你提到的查询1和查询进一步的了解2返回相同的结果集。但是,tkprof文件显示查询1返回23959行,查询2返回15992行。不完全相等... – 2009-09-02 10:46:24

+0

Okie查询是视图创建的一部分。返回的行数不同,因为查询创建视图的方式不同。第一个查询使用联合,第二个查询使用LOJ,因为第一个查询使用unios,所以第二个查询的情况下不会发生一些记录重复。 – Cshah 2009-09-03 09:06:26

SQL编辑器上方有一个名为“Explain Plan”的按钮。该工具将告诉您每条路线的成本以及语句如何使用索引和分区。请注意,您可能会遇到错误,您的DBA将需要为您的用户帐户启用一项功能,我相信这是“追踪”,但在这一点上可能是错误的。首先读取execute语句的输出可能非常具有挑战性,但它是帮助编写好的SQL的好工具。

+0

Thx.Yep我看到解释选项卡下的结果。名为成本的列出现数字。我将不得不挖掘oracle文档来解释这些数字意味着什么 – Cshah 2009-08-21 15:56:43

+2

我强烈建议挖掘这些文档。做一些搜索优化和Oracle调优。 (Burleson有一些很好的东西 - 谷歌“Oracle Burleson”可以查看包含提示的咨询网站。)并查看这个概述,了解您通过“解释计划”所看到的内容。正如另一条评论所指出的,仅仅检查速度并不意味着太多。环境可以改变事物 - 在一个环境中快速地在另一个环境中变得缓慢。 – user158017 2009-08-21 23:36:53

+0

但学习东西可能需要时间。你最好,现在检查速度,然后尽可能多地吸收和调整你的行程。 – user158017 2009-08-21 23:37:52

基本答案 - 执行每个查询几次,看看哪一个更快。最好的部分 - 你可以在不了解Oracle性能的情况下做到这一点。你唯一需要知道的是你不能相信第一次尝试,因为大多数时候它会从磁盘读取数据,而第二次尝试将使用RAM中的缓存数据。这就是为什么你尝试每次查询几次。

+1

如果“更快”查询使用大量临时空间会怎么样?一旦转移到生产环境,多个用户使用该临时空间,“更快”的查询可能会变慢,因为它可能会启动分页。确定查询速度的问题是答案总是“取决于”。最好使用解释计划,记下所用的临时空间,然后根据服务器环境进行评估。虽然这很难做好 - 我仍然在学习。 – user158017 2009-08-21 23:31:45

+1

解释计划是好的,但首先你必须能够阅读它。如果您今天需要在两个查询之间进行选择,并且您一生中没有看到解释计划工具,那么嵌套循环/哈希联接/索引范围扫描/索引FFS将不会真正帮助您。如果您有数周可用,那么请确保首先了解Oracle性能调整,然后再编写查询。 – jva 2009-08-24 05:39:55

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

如果您需要完整版本,请访问Randolf's

如果你想要一个短版,请访问mine

两个线程解释如何使用解释计划和跟踪,看看时间花费在哪里。然后,由您来决定您的确切资格为“更好”。这可以是最短的使用时间,最少量的使用资源,或最小数量的锁存器,或者可能是别的。

希望这会有所帮助。

Regards, Rob。

恐怕只有解释计划是唯一的方法。首先假定成本较低(如果你看看解释计划,那么应该有一个名为COST的栏)比较好,但是你需要阅读它以便你越来越多地学习。也许你有一个DBA,你可以与之聊天?如果没有您的数据和查询,很难再提供建议

对于任何与开发Oracle有关的事情来说,Tom Kyte(Google他)或者the Ask Tom website搜索都是一个很好的起点。如果你真的想涉足

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

取决于查询被调用的频率影响您需要跟踪查询的性能的程度(对于纯粹主义者来说很抱歉,但确实如此)。如果查询每周只运行一次,并需要一分钟的时间运行而不影响其他任何内容那么您是否需要优化该查询?维护更容易使用更易于逻辑关注的查询吗?

如果查询被多次调用第二个,那么你需要完全理解解释计划,并且对你怎么能查询优化到最佳性能