2010-06-28 2 views
4

데이터베이스에 액세스하기 위해 파이썬 내장형 sqlite3 모듈을 사용하고있다. 내 쿼리는 150000 개 항목의 테이블과 40000 개 항목의 테이블간에 조인을 실행합니다. 결과에는 약 150000 개의 항목이 다시 포함됩니다. SQLite Manager에서 쿼리를 실행하면 몇 초가 걸리지 만 파이썬에서 같은 쿼리를 실행하면 1 분 후에 완료되지 않습니다. 다음은 내가 사용하는 코드입니다.파이썬과 조인 sqlite 모듈이 수동으로 수행하는 것보다 느리다.

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을 수행했습니다. 성능면에서 큰 차이점에 대한 설명이있는 사람이 있습니까? Mac OS X 10.6.4에서 Python 2.6.1을 사용하고 있습니다.

편집은 내가 수동으로 가입 구현이 훨씬 빠르게 작동합니다. 코드는 다음과 같습니다 :

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) 

그래서 내가 직접 테이블을 가져 와서 파이썬으로 결합하면 약 2 초가 걸립니다. 위의 코드는 영원히 필요합니다. 내가 여기서 뭔가를 놓치고 있니?

2 EDIT은 는 지금 apsw과 같은 시도, 그리고, 성능이 좋은 (코드는 전혀 변경할 필요가 없습니다) 잘 작동합니다. 나는 아직도 이것이 왜 sqlite3 -module로 느린 지 궁금해하고있다. 여기에 대한 논의가있다

답변

5

는 : http://www.mail-archive.com/[email protected]/msg253067.html

sqlite3를 모듈에서 성능 병목 현상이 있음을 보인다. 당신의 쿼리를 빠르게하기 위해 어떻게 advice 있습니다 :

  • 당신이 조인 컬럼에 인덱스를 할 수 있는지 확인
  • 당신은 테이블의 스키마를 게시하지 않은
+0

같은 SQLite는 인덱스를 만듭니다. PySqlite 홈페이지에서 Python과 함께 제공되는'sqlite3' 패키지는'PySqlite'와 동일하지만 어떤 버전인지는 말하지 않습니다. –

+0

새로운 버전을 얻으려고합니다. – tamasd

1

사용 pysqlite 질문이 있지만 인덱스에 문제가 있거나 특히 Proteins.Id 또는 Annotations.ProteinId (또는 둘 다)에 대한 인덱스가없는 것 같습니다.

내가 파이썬 2.6.5를 사용하고이

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

ID는 기본적으로 인덱스가 있다는 의미로 'INTEGER PRIMARY KEYS'로 생성됩니다. Pythons'sqlite3' 모듈 대신'apsw'를 사용하면 동일한 스키마가 더 나은 성능을 제공하므로 스키마가 문제가 될지 의심 스럽습니다. –