gpt4 book ai didi

python - 为什么在 SQLite3 中同一查询会得到不同的查询计划?

转载 作者:太空宇宙 更新时间:2023-11-03 18:05:45 28 4
gpt4 key购买 nike

我有一个可以通过三种不同方式更新和查询的数据库:

  • 原生 Python 3.2 SQLite3 模块
  • DBVisualizer 的 SQLite JDBC
  • sqlite3 可执行文件

我在所有三个上运行相同的查询:

EXPLAIN QUERY PLAN
SELECT DISTINCT
method.method

FROM combination

INNER JOIN result
ON result.combination_key = combination.combination_key

INNER JOIN datalog AS datalog1
ON datalog1.datalog_key = combination.datalog_key1

INNER JOIN datalog AS datalog2
ON datalog2.datalog_key = combination.datalog_key2

INNER JOIN method
ON method.method_key = result.method_key

WHERE
datalog1.lot = 'datalog_name1' AND datalog2.lot = 'datalog_name2'

但我得到了三个不同的结果。

Python:

0   0   4   SCAN TABLE method USING COVERING INDEX sqlite_autoindex_method_1 (~5 rows)
0 1 0 SCAN TABLE combination (~1838311 rows)
0 2 1 SEARCH TABLE result USING COVERING INDEX sqlite_autoindex_result_1 (combination_key=? AND method_key=?) (~1 rows)
0 3 2 SEARCH TABLE datalog AS datalog1 USING INTEGER PRIMARY KEY (rowid=?) (~1 rows)
0 4 3 SEARCH TABLE datalog AS datalog2 USING INTEGER PRIMARY KEY (rowid=?) (~1 rows)

DBVisualizer(编辑:我刚刚将 Xerial sqlite jdbc 从 3.7 更新到 3.8,现在结果与 sqlite.exe 相同。看起来所有这些可能都是由于驱动程序差异造成的。 ..):

0   0   4   SCAN TABLE method USING COVERING INDEX sqlite_autoindex_method_1
0 1 2 SEARCH TABLE datalog AS datalog1 USING COVERING INDEX sqlite_autoindex_datalog_1 (ANY(program) AND lot=?)
0 2 0 SEARCH TABLE combination USING COVERING INDEX sqlite_autoindex_combination_1 (datalog_key1=?)
0 3 1 SEARCH TABLE result USING COVERING INDEX sqlite_autoindex_result_1 (combination_key=? AND method_key=?)
0 4 3 SEARCH TABLE datalog AS datalog2 USING INTEGER PRIMARY KEY (rowid=?)

sqlite.exe:

0   0   4   SCAN TABLE method USING COVERING INDEX sqlite_autoindex_method_1
0 1 2 SEARCH TABLE datalog AS datalog1 USING COVERING INDEX sqlite_autoindex_datalog_1 (ANY(program) AND lot=?)
0 2 0 SEARCH TABLE combination USING COVERING INDEX sqlite_autoindex_combination_1 (datalog_key1=?)
0 3 1 SEARCH TABLE result USING COVERING INDEX sqlite_autoindex_result_1 (combination_key=? AND method_key=?)
0 4 3 SEARCH TABLE datalog AS datalog2 USING INTEGER PRIMARY KEY (rowid=?)

问题1:为什么查询计划不同?

问题 2:如果我需要优化查询,我是否必须依赖于我用来运行查询的方法生成的查询计划?换句话说,我是否需要针对每个查询单独调整查询?

最佳答案

我找到了答案:所有这些驱动程序都来自不同版本的 sqlite3。

可执行文件 sqlite.exe 是最新的。

通过下载最新的 Xerial sqlite jdbc JAR 驱动程序并将 DBVis 指向它来升级 DBVisualizer。

通过从http://www.sqlite.org/download.html下载最新的DLL来升级Python并手动替换我的Python目录中的sqlite.dll。

现在一切似乎都在运行。

关于python - 为什么在 SQLite3 中同一查询会得到不同的查询计划?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26936842/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com