2013-07-02 7 views
7

Aynı talebi "Python 2.7.4 + sqlite3" ve "Firefox SQLite Manager 0.8.0" ile aynı veritabanına işlemeye çalıştım.Neden python + sqlite3 aşırı derecede yavaş?

Küçük veritabanında (8000 kayıt) hem Python hem de Firefox hızlı çalışır ve aynı sonucu verir.

büyük veritabanı üzerinde

(2.600.000 kayıtları): 28seconds içinde

  • SQLite Yöneticisi işlenen veritabanı (24 kayıtları)
  • Python programı sonuçsuz 20 dakika boyunca zaten çalışıyor

neler Aşağıdaki program ile yanlış olabilir, bu nedenle python sqlite3 sorguyu makul sürede işleyemezken aynı istek daha hızlı işlenebilir mi?

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 

GÜNCELLEME: Sorun eski ile ilişkili olduğunu, sqlite3.sqlite_version olan '3.6.21'

+4

Eğer SQLite Yöneticisi ** Tüm ** sonuç satırlarını işliyor olduğundan emin misin? Python programınız ... –

+0

Evet, "SQLite için Komut Satırı Kabuğu" da aynı 24 kaydı veriyor –

+0

Belki veritabanı dosyası SQLite Manager tarafından kilitleniyor mu? – warvariuc

cevap

5

Öyle görünüyor:Command Line Shell For SQLite aynı 24 kayıtları

Update2 döndürür Python 2.7 ile birlikte gönderilen sqlite sürümü. Her şey python'da iyi çalışıyor 3.3.

Mükemmel yorum için @CL'ye çok teşekkürler! python'da

python'da 2,7

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

3,3

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

Gerekiyorsa, sqlite'ı yükselterek Python 2.7'yi kullanmaya devam edebilirsiniz. – EOL

+0

@EOL Başka bir (belki daha iyi) çözüm, dizin oluşturmaktır. Sadece performans –

+0

Evet fark merak ediyordum, indeksler büyük bir hız verebilir. Ben de merak ettim, bu yüzden soruya +1 ve cevabım benden. :) – EOL