Tôi có một cơ sở dữ liệu có thể được cập nhật và truy vấn theo ba cách khác nhau:
- Mô-đun Python 3.2 SQLite3 gốc
- DBVisualizer cho SQLite JDBC
- tập tin thực thi sqlite3
Tôi đang chạy cùng một truy vấn trên cả ba:
GIẢI THÍCH KẾ HOẠCH TRUY VẤN
SELECT DISTINCT
phương thức.phương thức
TỪ sự kết hợp
Kết quả INNER THAM GIA
TRÊN result.combination_key = combo.combination_key
INNER JOIN datalog AS datalog1
TRÊN datalog1.datalog_key = tổ hợp.datalog_key1
INNER JOIN datalog AS datalog2
TRÊN datalog2.datalog_key = tổ hợp.datalog_key2
Phương thức INNER THAM GIA
BẬT phương thức.method_key = result.method_key
WHERE
datalog1.lot = 'datalog_name1' VÀ datalog2.lot = 'datalog_name2'
Nhưng tôi nhận được ba kết quả khác nhau.
Trăn:
0 0 4 Phương thức SCAN TABLE SỬ DỤNG CHỈ SỐ COVERING sqlite_autoindex_method_1 (~5 hàng)
0 1 0 Kết hợp BẢNG QUÉT (~1838311 hàng)
0 2 1 Kết quả BẢNG TÌM KIẾM SỬ DỤNG CHỈ SỐ BÌA sqlite_autoindex_result_1 (combination_key=? AND Method_key=?) (~1 hàng)
0 3 2 TÌM KIẾM BẢNG datalog NHƯ datalog1 SỬ DỤNG KHÓA CHÍNH SÁCH INTEGER (rowid=?) (~1 hàng)
0 4 3 TÌM KIẾM BẢNG datalog NHƯ datalog2 SỬ DỤNG KHÓA CHÍNH SÁCH INTEGER (rowid=?) (~1 hàng)
Trình hiển thị DB(biên tập:我刚刚将 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。
bởi từhttp://www.sqlite.org/download.html下载最新的DLL来升级Python并手动替换我的Python目录中的sqlite.dll。
现在一切似乎都在运行。
Tôi là một lập trình viên xuất sắc, rất giỏi!