2014-11-14 40 views
0

我有一個數據庫的更新和查詢三種方式:爲什麼我在SQLite3中爲同一個查詢獲得不同的查詢計劃?

  • 原生的Python 3.2 sqlite3的模塊
  • DBVisualizer中的JDBC SQLite的
  • 的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:如果我需要優化一個查詢,我必須依賴由我用來運行查詢的方法生成的查詢計劃嗎?換句話說,我是否需要分別調整每個查詢的查詢?

回答

0

我發現答案:所有這些驅動程序來自不同版本的sqlite3。

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

DBVisualizer通過下載最新的Xerial sqlite jdbc JAR驅動程序並將DBVis指向它進行升級。

通過從http://www.sqlite.org/download.html下載最新的DLL並手動替換我的Python目錄中的sqlite.dll來升級Python。

現在似乎都在運行相同。

相關問題