2013-07-02 49 views
7

"Python 2.7.4 + sqlite3"と "Firefox SQLite Manager 0.8.0"を使って、同じデータベースに同じリクエストを処理しようとしました。なぜpython + sqlite3が極端に遅いのですか?

小さなデータベース(8000レコード)では、PythonとFirefoxの両方が高速で動作し、同じ結果が得られます。大きなデータベース(2600000記録)で

  • Pythonプログラムは、20分間、すでに働いている28seconds内のデータベース(24レコード)を処理し

    • のSQLite Managerのいずれかの結果なし

    何次のプログラムで間違っている可能性がありますので、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:問題は古いと関連していること、 sqlite3.sqlite_versionは '3.6.21'

  • +4

    あなたはSQLiteのマネージャが**すべて**結果行を処理していることが確実な?あなたのPythonプログラムは... –

    +0

    はい、 "SQLiteのコマンドラインシェル"も同じ24レコードを返します –

    +0

    多分、データベースファイルはSQLite Managerによってロックされていますか? – warvariuc

    答えて

    5

    それはそうです:Command Line Shell For SQLiteも同じ24個の記録

    アップデート2を返します。 Python 2.7に同梱されているsqliteのバージョン。すべてがPythonでうまくいきます3.3。

    すばらしいコメントのために@CLに感謝します! Pythonで

    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

    関連する問題