如何使用Oracle正确性能测试SELECT查询?

时间:2011-04-18 23:19:31

标签: performance oracle

我想测试两个查询,以找出他们的表现,只是看着执行计划。我见过Tom Kyte一直在他的网站上这样做,以收集他的理论证据。

我相信在性能测试中存在许多缺陷,例如,当我第一次在SQL开发人员中运行查询时,该查询可能返回一些公平的数字。再次运行完全相同的查询,即时返回。服务器或客户端上必须有某种缓存,我知道这很重要 - 但我只对非缓存性能感兴趣。

性能测试的指导原则是什么?以及如何编写重复查询的性能测试?我只是写一个匿名的块&环?我如何获得时间信息,平均值,中位数,标准偏差?

4 个答案:

答案 0 :(得分:2)

Oracle(和其他数据库)缓存查询,您可以在其中查看所描述的行为。 “硬”解析意味着查询没有查询计划,这使得Oracle可以根据索引和统计信息确定查询计划。 “软”解析是指您之后运行 相同查询 后会发生的情况,并会收到即时结果,因为查询计划存在& Oracle重新使用它。请参阅the Ask Tom question about it for more details

请注意EXPLAIN output

  

使用基于成本的优化器,执行计划可以并且随着基础成本的变化而变化。 EXPLAIN PLAN输出显示Oracle在解释语句时如何运行SQL语句。由于执行环境和解释计划环境的差异,这可能与SQL语句的实际执行期间的计划不同。

关注非缓存性能会给出最糟糕的情况,但考虑到缓存会发生 - 非缓存基准测试在日常使用中并不现实。

答案 1 :(得分:2)

为了建立OMG小马的答案,基于时间的调整是可能的,但不现实。您必须在每种情况下都使用完全缓存的缓冲区缓存或完全空缓冲区缓存,这些都不能代表现实 - 特别是如果没有竞争负载。

当我进行调优时,它通常是针对具有活动的实时系统,我专注于通过使用扩展SQL跟踪(dbms_monitor.session_trace_enable / dbms_monitor.session_trace_disable)和tkprof实用程序来调整逻辑I / O ,或使用SQL * Plus和set autotrace traceonly - 它完成查询的所有工作,但抛出输出,因为我通常不会看到滚动的数十亿行。

确切的机制通常涉及绑定SQL,使用类似以下内容:

 variable :my_bind1 number;
 variable :my_bind2 varchar2(30);

 begin
   :my_bind1 := 42;
   :my_bind2 := 'some meaningful string';
 end;
 /

 set timing on;
 set autotrace traceonly;

 [godawful query with binds]

 set autotrace off;

在结果中,我正在寻找我期望的计划,这是一种比较值 - 假设任何存在 - 最重要的是,一致的I / O数量。这就是Oracle必须以一致模式读取的块数以满足查询。我找不到引用的原始来源,但我认为它是方法R的Cary Milsap。

“调整逻辑I / O,您的物理I / O将会跟随。”

答案 2 :(得分:1)

在性能调整中,如果您查看的唯一数据是挂钟时间,那么您将只获得整个画面的一小部分。您至少需要查看执行计划以及IO统计信息,以便了解如何最好地调整查询。

此外,您需要消除性能问题的其他原因 - 例如如果许多查询存在一般性能问题,则可能不是其中一个查询的错误 - 可能是架构问题,数据库上的重要并发活动,甚至是底层硬件问题。

我和你之前描述的问题有类似的问题;例如某种类型的查询应该非常快,第一次运行需要30秒,然后会稳定下来一两秒。但是,只要我查看执行计划,很明显它正在使用全表扫描,因为它无法使用已创建的唯一索引。第一次运行查询时,大部分数据都被加载到缓存中(事实上,涉及两个级别的缓存 - 数据库缓冲区缓存,以及磁盘上的存储级缓存),因此后续的全表扫描非常快。

答案 3 :(得分:1)

什么是正确的? 自11g以来,还有一些额外的复杂因素需要考虑。优化器预先窥视已经变得更加智能,并且sql计划的稳定性具有很大的影响力。这两个功能使数据库自动调整,但在性能测试期间也会产生意外的影响,例如,因为并非所有计划的变体都在测试开始时已知并被接受。 这可能是第二次测试运行的原因,即第一次运行后的第二天,突然运行得更快,没有任何明显的变化。 与编写逻辑上正确的代码相比,11g性能测试不那么重要。例如,笛卡尔积和过滤掉一个不同的值可以是功能正确的,但在大多数情况下是错误的代码,因为它获取的数据多于逻辑上需要的数据。 如果查询获取真正需要的数据并且处于正确的控制结构中,请让数据库进程在维护窗口期间调整代码。在许多情况下,测试环境和生产之间的差异使得无法安全地进行比较。 不要误解我的意思,测试很重要,但主要是针对逻辑与11g之前的性能测试相比,还有一些额外的步骤需要采取。 如需阅读,请参阅Oracle® Database 2 Day + Performance Tuning Guide 11g Release 2 (11.2)