Присоединиться с помощью Pylons sqlite модуль медленнее, чем делать это вручную - PullRequest
4 голосов
/ 28 июня 2010

Я использую встроенный модуль питонов sqlite3 для доступа к базе данных. Мой запрос выполняет соединение между таблицей из 150000 записей и таблицей из 40000 записей, результат снова содержит около 150000 записей. Если я выполняю запрос в SQLite Manager , это занимает несколько секунд, но если я выполняю тот же запрос из python, он не завершается через минуту. Вот код, который я использую:

cursor = self._connection.cursor()
annotationList = cursor.execute("SELECT PrimaryId, GOId " + 
                                "FROM Proteins, Annotations " +
                                "WHERE Proteins.Id = Annotations.ProteinId")
annotations = defaultdict(list)
for protein, goterm in annotationList:
    annotations[protein].append(goterm)

Я сделал fetchall только для измерения времени выполнения. У кого-нибудь есть объяснение огромной разницы в производительности? Я использую Python 2.6.1 в Mac OS X 10.6.4.

EDIT

Я реализовал объединение вручную, и это работает намного быстрее. Код выглядит так:

cursor = self._connection.cursor()
proteinList = cursor.execute("SELECT Id, PrimaryId FROM Proteins ").fetchall()
annotationList = cursor.execute("SELECT ProteinId, GOId FROM Annotations").fetchall()
proteins = dict(proteinList)
annotations = defaultdict(list)
for protein, goterm in annotationList:
    annotations[proteins[protein]].append(goterm)

Поэтому, когда я сам выбираю таблицы и затем выполняю объединение в python, это занимает около 2 секунд. Код выше занимает вечность. Я что-то здесь упускаю?

2-е РЕДАКТИРОВАНИЕ Я попробовал то же самое с apsw сейчас, и он работает просто отлично (код не нужно менять вообще), производительность его отличная. Мне все еще интересно, почему это так медленно с sqlite3 -модулем.

Ответы [ 2 ]

5 голосов
/ 15 сентября 2010

Здесь идет обсуждение этого вопроса: http://www.mail-archive.com/python-list@python.org/msg253067.html

Кажется, что существует узкое место в производительностив модуле sqlite3.Существует совет , как сделать ваши запросы быстрее:

  • убедитесь, что у вас есть индексы в столбцах соединения
  • используйте pysqlite
1 голос
/ 16 сентября 2010

Вы не опубликовали схему рассматриваемых таблиц, но я думаю, что может быть проблема с индексами, в частности с отсутствием индекса для Proteins.Id или Annotations.ProteinId (или обоих).

Создайте индексы SQLite следующим образом

CREATE INDEX IF NOT EXISTS index_Proteins_Id ON Proteins (Id)
CREATE INDEX IF NOT EXISTS index_Annotations_ProteinId ON Annotations (ProteinId)
...