Oracle 11g - 即使有 NOCACHE 提示,查询似乎也会缓存

Oracle 11g - query appears to cache even with NOCACHE hint

我正在使用 cx_Oracle 模块在 Python 中进行一些数据库基准测试。为了对结果进行基准测试,我 运行 宁 150 个独特的查询和计时每个查询的执行时间。我正在 运行宁这样的事情:

c = connection.cursor()
starttime = time.time()
c.execute('SELECT /*+ NOCACHE */ COUNT (*) AS ROWCOUNT FROM (' + sql + ')')
endtime = time.time()
runtime = endtime - starttime

每个查询都通过变量 sql 传递,它们在长度、运行时间以及它们访问的表方面有很大差异。也就是说,所有查询都表现出以下行为:

第一个运行:很慢(相对)

2nd 运行: 显着更快(花费 1/2 - 1/5 的时间)

第三 运行: 比第二 运行

稍快

所有后续的运行s >= 4:约等于第3个运行

我需要禁用缓存才能获得准确的结果,但前几个 运行 确实会丢失我的数据;就好像 NOCACHE 根本不起作用...这是怎么回事?

编辑:Allan 回答了我的问题,但对于任何可能感兴趣的人,我做了更多的研究,发现了这两页,它们也很有帮助:

How to clear all cached items in Oracle

http://www.dba-oracle.com/t_flush_buffer_cache.htm

来自documentation

The NOCACHE hint specifies that the blocks retrieved for the table are placed at the least recently used end of the LRU list in the buffer cache when a full table scan is performed. This is the normal behavior of blocks in the buffer cache.

由此看来,nocache 提示根本没有按照您的预期进行。

您可以通过运行ALTER SYSTEM FLUSH SHARED_POOL清除共享缓存,通过运行ALTER SYSTEM FLUSH BUFFER_CACHE清除缓冲区缓存。您需要在每个查询之间执行此操作以防止使用缓存。