2013-07-02 5 views
7

Я попытался обработать один и тот же запрос в той же базе данных, используя «Python 2.7.4 + sqlite3» и «Firefox SQLite Manager 0.8.0».Почему python + sqlite3 очень медленный?

В крошечной базе данных (8000 записей) оба Python и Firefox работают быстро и дают одинаковый результат.

На большую базу данных (2600000 записей):

  • SQLite Manager обрабатываются базы данных в 28seconds (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 Manager обрабатывает ** ** все строки результата? Ваша программа Python ... –

+0

Да, «Командная строка Shell для SQLite» также дает те же 24 записи –

+0

Возможно, файл базы данных заблокирован SQLite Manager? – warvariuc

ответ

5

кажется, что проблема связана со старым версия sqlite, поставляемая с Python 2.7. Все отлично работает в python 3.3.

Большое спасибо @CL за отличный комментарий!

В питона 2,7

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

В питона 3,3

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

Вы можете использовать Python 2.7, обновив sqlite, если необходимо. – EOL

+0

@EOL Другое (возможно, лучшее) решение - создавать индексы. Мне просто было интересно узнать о разнице в производительности –

+0

Да, индексы могут дать большую скорость. Мне тоже было любопытно, так что +1 на вопрос и на ваш ответ от меня. :) – EOL

Смежные вопросы