2013-07-02 2 views
7

Ich habe versucht, die gleiche Anfrage an die gleiche Datenbank mit "Python 2.7.4 + sqlite3" und "Firefox SQLite Manager 0.8.0" zu verarbeiten.Warum Python + sqlite3 ist extrem langsam?

In der kleinen Datenbank (8000 Datensätze) arbeiten Python und Firefox schnell und liefern das gleiche Ergebnis.

Auf der größeren Datenbank (2.600.000 Datensätze):

  • SQLite-Manager verarbeitet Datenbank in 28 Sekunden (24 Einträge)
  • Python-Programm bereits ohne Erfolg für 20 Minuten arbeitet

Was kann mit dem folgenden Programm falsch sein, so Python sqlite3 kann die Abfrage in angemessener Zeit nicht verarbeiten, während die gleiche Anfrage schneller verarbeitet werden kann?

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 liefert auch die gleichen 24 Datensätze

UPDATE2: sqlite3.sqlite_version ist '3.6.21'

+4

Sind Sie sicher, dass SQLite-Manager verarbeitet ** alle ** Ergebniszeilen? Ihr Python-Programm ist ... –

+0

Ja, "Befehlszeilen Shell für SQLite" gibt auch die gleichen 24 Datensätze –

+0

Vielleicht ist die Datenbankdatei von SQLite Manager gesperrt? – warvariuc

Antwort

5

Es scheint, dass das Problem mit dem alten verbunden ist Version von sqlite, die mit Python 2.7 ausgeliefert wurde. Alles funktioniert gut in Python 3.3.

Vielen Dank an @CL für den tollen Kommentar!

In Python 2,7

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

In Python 3,3

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

Sie können Python 2.7 weiterverwenden, indem Sie sqlite bei Bedarf aktualisieren. – EOL

+0

@EOL Eine andere (vielleicht bessere) Lösung ist das Erstellen von Indizes. Ich war nur neugierig auf den Unterschied in der Leistung –

+0

Ja, Indizes können eine große Geschwindigkeit geben. Ich war auch neugierig, also +1 auf die Frage und auf deine Antwort von mir. :) – EOL