Я использую встроенный модуль питонов 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
-модулем.