2013-07-02 10 views
7

Próbowałem przetworzyć to samo żądanie do tej samej bazy danych za pomocą "Python 2.7.4 + sqlite3" i "Firefox SQLite Manager 0.8.0".Dlaczego Python + sqlite3 jest bardzo wolny?

W niewielkiej bazie danych (8000 rekordów) zarówno Python, jak i Firefox działają szybko i dają taki sam wynik.

na większej bazy danych (2600000 zapisy): Menedżer przetwarzane w bazie

  • SQLite w 28seconds (24 rekordów)
  • Program Python działa już na 20 minut bez rezultatu

Co może być nie tak z następującym programem, więc python sqlite3 nie może przetworzyć zapytania w rozsądnym czasie, podczas gdy to samo żądanie może być przetworzone szybciej?

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 zwraca również te same 24 rekordy

Update2: sqlite3.sqlite_version jest '3.6.21'

+4

Czy jesteś pewien, że SQLite Manager przetwarza ** ** wszystkie wiersze wyniku? Twój program w języku Python to ... –

+0

Tak, "Wiersz poleceń dla SQLite" daje te same 24 rekordy. –

+0

Może plik bazy danych jest zablokowany przez SQLite Manager? – warvariuc

Odpowiedz

5

Wydaje się, że problem jest związany ze starym wersja sqlite dostarczana z Pythonem 2.7. Wszystko działa poprawnie w Pythonie 3.3.

Wielkie dzięki za @CL za świetny komentarz!

W python 2,7

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

W python 3,3

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

Możesz nadal używać Python 2.7 przez uaktualnienie sqlite, w razie potrzeby. – EOL

+0

@EOL Innym (być może lepszym) rozwiązaniem jest tworzenie indeksów. Byłem po prostu ciekawy różnicy w wydajności –

+0

Tak, indeksy mogą dać dużą prędkość. Ja też byłem ciekawy, więc +1 do pytania i do twojej odpowiedzi ode mnie. :) – EOL