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
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
清除缓冲区缓存。您需要在每个查询之间执行此操作以防止使用缓存。
我正在使用 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
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
清除缓冲区缓存。您需要在每个查询之间执行此操作以防止使用缓存。