2013-07-02 317 views
7

我試圖用「Python 2.7.4 + sqlite3」和「Firefox SQLite Manager 0.8.0」來處理同一個數據庫的請求。爲什麼python + sqlite3速度非常慢?

在微型數據庫(8000條記錄)上,Python和Firefox都運行得很快,結果相同。

在更大的數據庫(260萬個記錄):在28秒

  • SQLite的經理處理數據庫(24個記錄)
  • Python程序工作已經20分鐘沒有任何結果

什麼以下程序可能會出錯,所以python sqlite3無法在合理的時間內處理查詢,而相同的請求可以更快地處理?

import sqlite3 

_sql1 = """SELECT DISTINCT J2.rule_description, 
       J2.feature_type, 
       J2.action_item_id, 
       J2.rule_items 
FROM journal J1, 
    journal J2 
WHERE J1.base = J2.base 
    AND J1.action_item_id=J2.action_item_id 
    AND J1.type="Action disabled" 
    AND J2.type="Action applied" 
    AND J1.rule_description="Some test rule" 
    AND J1.action_item_id IN (1, 2, 3, 14, 15, 16, 17, 18, 19, 30, 31, 32) 
""" 

if __name__ == '__main__': 
    sqlite_output = r'D:\results.sqlite' 
    with sqlite3.connect(sqlite_output) as connection: 
     for row in connection.execute(_sql1): 
      print row 

UPDATE:Command Line Shell For SQLite也返回相同的24條記錄

UPDATE2: sqlite3.sqlite_version是 '3.6.21'

+4

你肯定SQLite的經理正在處理** **所有結果行?你的Python程序是... –

+0

是的,「SQLite命令行外殼」也提供了相同的24條記錄 –

+0

也許數據庫文件被SQLite Manager鎖定? – warvariuc

回答

5

看來,這個問題是與舊的關係Python 2.7附帶的版本。一切工作正常在蟒3.3。

非常感謝@CL的好評!

在Python 2.7版

>>> import sqlite3 
>>> sqlite3.sqlite_version 
'3.6.21' 

在蟒蛇3.3

>>> import sqlite3 
>>> sqlite3.sqlite_version 
'3.7.12' 
+2

如果需要,您可以通過升級sqlite來繼續使用Python 2.7。 – EOL

+0

@EOL另一個(也許更好的)解決方案是創建索引。我只是好奇在性能上的差異 –

+0

是的,指數可以大大加快速度。我也很好奇,所以對於這個問題+1以及你對我的回答。 :) – EOL