我希望在我拥有的不同数据库上运行一些基准。我重复每个查询n
次,这样我就可以报告平均查询时间。我知道SQLite缓存语句,如文档所示:
Sqlite3模块在内部使用语句缓存以避免SQL解析开销。如果要显式设置为连接缓存的语句数,可以设置CACHED_STATEMENTS参数。当前实现的默认设置是缓存100条语句。
然而,我并不清楚这种缓存是否会持续存在:因此,简而言之,SQLite缓存是否会持续存在(1)即使在关闭连接之后也仍然存在于一个Python会话中?(2)跨Python会话(所以将缓存写入磁盘?)
我的代码如下所示:
times = []
for i in range(n_repeat):
start = time.perf_counter()
conn = sqlite3.connect(dbpath)
# do query
conn.commit()
conn.close()
times.append(time.perf_counter() - start)
return timedelta(seconds=sum(times) / n_repeat)
我的假设是,每当我关闭连接时,任何和所有缓存都会立即被丢弃和垃圾回收。我在n
运行中发现几乎没有变化(第一次迭代和第n次迭代之间没有差异),因此我认为我的假设是正确的。但我更愿意确定,所以我在这里问。
TL;DR:即使在连接关闭后,SQLite也会缓存查询吗?它是否跨Python会话缓存查询?
1条答案
按热度按时间kmbjn2e31#
在深入研究之后,我发现除了在Python/SQLite中的缓存(正如Shawn在评论中提到的)之外,一个“巨大的”影响因素是发生在操作系统范围内的缓存。我不确定缓存的确切内容是什么(数据库、索引、查询本身),但如果在每次迭代后都进行delete system caches(所以不应该发生缓存),那么我发现连续的调用要慢得多(大约是100x或更多!)。
因此,是的,SQLite正在通过Python缓存语句,但在关闭数据库之后,这些语句将被释放。但除此之外,系统缓存将发挥巨大作用。