我正在使用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
传入,它们在长度、运行时和访问的表上有很大差异。尽管如此,所有查询都显示了以下行为:
第一轮:非常慢(相对地)
第二轮:明显更快(时间从1/2到1/5不等)
第三轮:略快于第二轮
所有后续运行>= 4:大约等于第三次运行
我需要禁用缓存才能得到准确的结果,但最初的几次运行实际上是在抛出我的数据;就好像NOCACHE
根本无法工作.这里发生了什么事?
编辑:艾伦回答了我的问题,但对于任何可能感兴趣的人,我做了更多的研究,并发现了这两页也是有帮助的:
cache.htm
发布于 2015-10-31 00:10:29
来自文档
NOCACHE提示指定,当执行完整的表扫描时,为表检索的块被放置在缓冲区缓存中LRU列表的至少最近使用的末端。这是缓冲区缓存中块的正常行为。
从这一点看,nocache
提示根本没有达到您的预期效果。
您可以通过运行ALTER SYSTEM FLUSH SHARED_POOL
来清除共享缓存,并通过运行ALTER SYSTEM FLUSH BUFFER_CACHE
清除缓冲区缓存。您需要在每个查询之间执行此操作,以防止缓存被使用。
https://stackoverflow.com/questions/33446459
复制相似问题