我第一次运行查询时,需要17分钟才能运行。第二次运行时,性能没有变化。但是当我第二天早上运行它时,查询只运行一秒钟。
我的问题在这里:
为什么性能会发生变化?
如果数据库缓存数据,我如何衡量查询运行的时间长度?
如果数据存储在缓冲区缓存中,如何在不使用db administrator帐户的情况下清除缓存?
我曾尝试克隆该表并使用与旧表中相同的数据填充它,但查询仍然运行得更快。
答案 0 :(得分:4)
在两种情况下都没有看到查询计划并查看执行统计信息,很难知道。
差异可能与缓冲区缓存中的块有关。不过,我认为这不是唯一的区别。您可以在17分钟内从磁盘上读取大量数据,而且即使全部缓存,您也不可能在一秒钟内处理内存中的数据。如果是缓存数据的问题,那么您预计第一次运行会很慢,后续运行会很快。
如果差异是由于缓存造成的,那么在没有通常只授予DBA的权限的情况下,您将无法清除缓冲区缓存。缓冲区缓存是共享资源。清除它会影响使用数据库的每个人。它也不会影响在数据库下面的层进行的缓存 - 除了数据库缓存之外,文件系统和磁盘子系统通常还会缓存最近读取的数据。通常,您最好关注查询执行的逻辑I / O数量,并接受运行时性能将根据这些逻辑I / O操作中有多少成为物理I / O请求以及有多少这些请求而变化物理I / O请求最终由文件系统或磁盘子系统缓存提供,而不是要求从磁盘上进行真正的物理读取。
我的猜测是,在查询运行17分钟的那天,您有可能获得与查询运行1秒的查询计划不同的查询计划。这可能是因为一个或多个对象的统计数据在一夜之间发生这可能是因为绑定变量偷看导致Oracle根据所使用的第一组绑定变量值生成查询计划,后者可能会被其他执行的查询重用,这些执行将受益于不同的计划,因为它们更多(或更少)选择性。与各种计划稳定性和计划进化选择有关的事情可能更复杂。如果你得到不同的计划,根据具体的Oracle版本,你通常有很多方法来帮助优化器或强制执行某种计划稳定性,但其中很多都是你想要通过的事情。与你的DBA。