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

| 我想测试两个查询,以找出它们与仅查看执行计划有关的性能。我已经看到汤姆·凯特(Tom Kyte)一直在他的网站上这样做,以此来收集有关其理论的证据。 我认为性能测试存在很多陷阱,例如,当我第一次在SQL Developer中运行查询时,该查询可能会返回一些公数值。再次运行该完全相同的查询,即刻返回。服务器或客户端上必须有某种类型的缓存,我知道这很重要-但是我只对非缓存性能感兴趣。 性能测试的准则是什么?以及如何编写重复查询的性能测试?我是否只写一个匿名的块和循环?我如何获得时间信息,平均值,中位数,标准差?
已邀请:
Oracle(和其他数据库)缓存查询,您可以在其中查看所描述的行为。 “硬”解析意味着没有针对该查询的查询计划,这使Oracle可以根据索引和统计信息确定查询计划。之后,您运行相同的查询并收到即时结果时,就会发生“软”解析,因为查询计划存在且Oracle重复使用了它。有关更多详细信息,请参见“询问汤姆”问题。 请注意EXPLAIN输出: 使用基于成本的优化器,执行计划可以并且确实会随着基础成本的变化而变化。说明语句后,EXPLAIN PLAN输出显示Oracle如何运行SQL语句。由于执行环境和说明计划环境的差异,这可能与SQL语句实际执行期间的计划有所不同。 专注于非缓存性能会带来最坏的情况,但考虑到会发生缓存-非缓存基准在日常使用中并不现实。
为了增强OMG Ponies的答案,基于时间的调整是可能的,但不切实际。在任何情况下,您都必须从完全缓存的缓冲区缓存或完全空的缓冲区缓存开始,并且这两个都不能代表现实-尤其是在没有竞争负载的情况下。 当我进行调整时,通常是针对具有活动的实时系统,并且我专注于调整逻辑I / O,方法是使用扩展的SQL跟踪(
dbms_monitor.session_trace_enable / dbms_monitor.session_trace_disable
)和the1ѭ实用程序,或者使用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将随之发生。”
在性能调优中,如果您只查看壁钟时间的数据,那么您将只获得整个图像的一小部分。您至少需要查看执行计划以及IO统计信息,以便确定如何最佳地优化查询。 此外,您还需要消除导致性能问题的其他原因-例如如果许多查询之间存在普遍的性能问题,则可能不是其中一个查询的问题-它可能是体系结构问题,数据库上大量并发活动,甚至是潜在的硬件问题。 我遇到了与您之前描述的问题类似的问题;例如某种类型的查询应该非常快,第一次需要30秒才能运行,然后稳定到一两秒钟。但是,当我查看执行计划时,很明显它正在使用全表扫描,因为它无法使用已创建的唯一索引。第一次运行查询时,大多数数据都已加载到高速缓存中(实际上,涉及两个高速缓存级别-数据库缓冲区高速缓存以及磁盘上的存储级高速缓存),因此随后进行了全表扫描速度非常快
什么是正确的? 从11g开始,要考虑一些额外的复杂性。优化器预窥已变得更加智能,并且sql计划稳定性具有很大的影响。这两个功能使数据库可以自动调整,但在性能测试期间也会产生意想不到的效果,例如,因为在测试开始时并不是已知并接受了计划的所有变体。 这可能是导致第二次测试运行(第一次运行后的第二天)突然运行快得多而没有任何明显变化的原因。 与编写逻辑上正确的代码相比,由于11g性能测试的重要性较低。例如,笛卡尔乘积并过滤出一个独特的值可能在功能上是正确的,但在大多数情况下是错误的代码,因为它获取的数据量超过逻辑所需的数据。 如果查询获取了真正需要的数据并处于正确的控制结构中,请让数据库进程在维护时段内调整代码。在许多情况下,测试环境和生产环境之间的差异使得无法安全地进行比较。 别误会,测试固然重要,但与11g之前的性能测试相比,大多数测试在逻辑上都需要采取额外的步骤。 有关详细信息,请参阅《Oracle®数据库2天+性能调整指南11g第2版(11.2)》

要回复问题请先登录注册