在oracle 10gr2上,我有几个sql查询我正在比较性能,但是在第一次运行之后,v $ sql表存储了用于缓存的执行计划,因此对于其中一个查询,我从第一次运行的28秒开始到.5秒后.
我试过了
ALTER SYSTEM FLUSH BUFFER_CACHE; - 运行此操作后,查询始终以5秒运行,我不相信这是准确的.
想到可能从缓存中删除行项本身:从v $ sql中删除其中sql_text就像'select*from ....但是得到一个关于无法从视图中删除的错误.
spe*_*593 52
彼得给了你问的答案.
alter system flush shared_pool;
Run Code Online (Sandbox Code Playgroud)
这是您将用于"从缓存中删除预准备语句"的语句.
(Prepared语句不是从共享池中刷新的唯一对象,该语句不仅仅是这些.)
正如我在之前的评论(在你的问题上)中指出的那样,v$sql不是一张桌子.它是一个动态性能视图,是Oracle内部存储器结构的方便表格式表示.您只对动态性能视图具有SELECT权限,您无法从中删除行.
刷新共享池和缓冲区缓存?
以下内容未直接回答您的问题.相反,它回答了一个根本不同(也许更重要)的问题:
我们是否应该通常刷新共享池和/或缓冲区缓存来衡量查询的性能?
简而言之,答案是否定的.
我认为Tom Kyte很好地解决了这个问题:
http://www.oracle.com/technology/oramag/oracle/03-jul/o43asktom.html
http://www.oracle.com/technetwork/issue-archive/o43asktom-094944.html
<摘录>
实际上,调整工具不这样做很重要.运行测试,忽略结果,然后运行两到三次并平均掉这些结果非常重要.在现实世界中,缓冲区缓存永远不会缺乏结果.决不.调优时,您的目标是减少逻辑I/O(LIO),因为物理I/O(PIO)将自行处理.
考虑一下:刷新共享池和缓冲区缓存比不刷新它们更加人为.我怀疑,大多数人似乎对此持怀疑态度,因为它在传统智慧面前飞逝.我将告诉你如何做到这一点,但不是这样你可以用它来测试.相反,我将用它来证明为什么它是徒劳无功且完全是人为的(因此会导致错误的假设).我刚刚启动了我的电脑,并且我已经针对一张大桌子运行了这个查询.我"刷新"缓冲区缓存并再次运行它:
</摘录>
我认为Tom Kyte是完全正确的.在解决性能问题方面,我认为"清除oracle执行计划缓存"通常不是可靠基准测试的一个步骤.
让我们来解决对性能的担忧.
您告诉我们您已经观察到,与后续执行(~5秒)相比,第一次执行查询所需的时间要长得多(约28秒),即使从缓冲区缓存中刷新(所有索引和数据块)也是如此.
对我来说,这表明硬解析正在做一些繁重的工作.这要么是大量工作,要么是遇到很多等待.这可以调查和调整.
我想知道是否可能没有统计信息,优化器在准备查询计划之前花了很多时间收集统计信息.这是我要检查的第一件事,即在所有引用的表,索引和索引列上收集统计信息.
如果您的查询加入大量表,则CBO可能正在考虑大量的连接顺序排列.
关于Oracle跟踪的讨论超出了这个答案的范围,但它是下一步.
我想你可能想要跟踪事件10053和10046.
以下是Tom Kyte对"事件10053"讨论的链接,您可能会觉得有用:
http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:63445044804318
切向相关的轶事故事re:难以解析的表现
几年前,我确实看到一个查询在第一次执行时以MINUTES表示已经过去的时间,后续执行时间以秒为单位.我们发现,第一次执行时间的绝大部分时间都用在了硬解析上.
这个问题查询是由一个CrystalReports开发人员编写的,他无辜地(天真地)加入了两个庞大的报告视图.
其中一个视图是62个表的连接,另一个视图是42个表的连接.
该查询使用了基于成本的优化程序.跟踪显示它不是等待时间,所有用于评估可能的连接路径的CPU时间.
每个供应商提供的"报告"视图本身并不是太糟糕,但当其中两个加入时,它的速度非常缓慢.我认为问题在于优化器正在考虑的大量连接排列.有一个实例参数可以限制优化器考虑的排列数,但我们的修复方法是重新编写查询.改进的查询只加入了查询实际需要的十几个表.
(最初的即时短期"乐队援助"修复是在报告生成任务运行之前的早晨安排查询运行.这使报告生成"更快",因为报告生成运行已经使用了在共享池中准备好语句,避免硬分析.
乐队辅助修复不是一个真正的解决方案,它只是将问题转移到查询的初步执行,当没有注意到长执行时间.
我们的下一步可能是为查询实现"存储大纲",以获得稳定的查询计划.
当然,语句重用(避免硬分析,使用绑定变量)是Oracle中的规范模式.它提高了性能,可扩展性,yada,yada,yada.
这个轶事事件可能与你观察到的问题完全不同.
HTH
Pet*_*ter 17
自从我使用Oracle以来已经有一段时间了,但我相信执行计划会缓存在共享池中.试试这个:
alter system flush shared_pool;
Run Code Online (Sandbox Code Playgroud)
缓冲区缓存是Oracle存储最近使用的数据以最小化磁盘io的地方.