几次查询后,查询运行速度比以前快

Ahm*_*ary 0 sql oracle performance

我第一次运行查询时,运行了 17 分钟。我第二次运行它时,性能没有改变。但是当我第二天早上运行它时,查询只在一秒钟内运行。

我的问题在这里:

  1. 为什么性能发生了变化?

  2. 鉴于数据库缓存数据,我如何衡量查询真正需要多长时间运行?

  3. 如果数据存储在缓冲区缓存中,如何在不使用数据库管理员帐户的情况下清除缓存?

我曾尝试克隆该表并用与旧表相同的数据填充它,但查询仍然运行得更快。

Jus*_*ave 5

如果没有看到两种情况下的查询计划和执行统计信息,就很难知道。

差异可能与缓冲区缓存中的块有关。不过,在我看来,这不太可能是唯一的区别。您可以在 17 分钟内从磁盘读取大量数据,而且即使所有数据都已缓存,您似乎也不太可能在一秒钟内处理内存中的数据。如果是数据被缓存的问题,你会期望第一次运行会很慢,随后的运行会很快。

如果差异是由于缓存造成的,如果没有通常只授予 DBA 的特权,您将无法清除缓冲区缓存。缓冲区缓存是一种共享资源。清除它会影响使用数据库的每个人。它也不会影响在数据库下层进行的缓存——文件系统和磁盘子系统通常除了数据库缓存之外还缓存最近读取的数据。您通常最好关注查询执行的逻辑 I/O 数量,并接受您的运行时性能将根据这些逻辑 I/O 操作中有多少成为物理 I/O 请求以及这些物理 I/O 请求中的多少而有所不同。 /O 请求最终由文件系统或磁盘子系统缓存提供服务,而不是需要真正的磁盘物理读取。

我的猜测是,在查询运行 17 分钟的那天,与查询运行了 1 秒的那天相比,您更有可能获得不同的查询计划。这可能是因为一个或多个对象的统计数据在一夜之间发生了变化。这可能是因为诸如绑定变量窥视之类的事情导致 Oracle 根据所使用的第一组绑定变量值生成查询计划,这些值随后可能会被其他查询执行重用,这些查询将从不同的计划中受益,因为它们更具(或更少)选择性。与各种计划稳定性和计划演变选项有关的事情可能更复杂。如果您获得不同的计划,取决于特定的 Oracle 版本,