2010-02-20 3 views
0

안녕하세요 저는 500k 행이있는 db2 테이블에서 sqlalchemy를 사용하고 있습니다.sqlalchemy Resultproxy 대형 테이블이 느린가요?

사용하여이 같은 일반 SQL :

sql="select * from test.test" 
result=Session.execute(sql) 
for row in result: 
     pdic[row.id]=row.val1 

이 걸리는 5 분

내가 IBM_DB 사용하는 경우 :

sql="select * from test.test" 
stmt = ibm_db.exec_immediate(ibm_db_conn,sql) 
result =ibm_db.fetch_both(stmt) 
while(result): 
     pathdic[result['ID']]=result['VAL'] 
     result = ibm_db.fetch_both(stmt) 

이 30 초

어떤 생각이 채 걸리지?

답변

1

Linux, UNIX 및 Windows 용 DB2를 사용하는 경우 event monitors이라는 정교한 추적 기능이 있으며 응용 프로그램이 전송하는 SQL 워크로드에 대한 자세한 정보를 캡처하기 위해 데이터베이스에 내장되어 있습니다. SQLAlchemy가 비효율적으로 DB2에 액세스하는 경우 명령문 이벤트 모니터에 의해 캡처 된 일련의 이벤트가 표시됩니다. 다른 가능성은 프로그램의 두 버전 모두 DB2 데이터와 거의 동일한 방식으로 진행되지만 SQLAlchemy는 결과를 포함하기 위해 내부 객체를 할당하는 데 "DB2에서 벗어나"더 많은 시간을 소비합니다. 테이블에 작성하는 명령문 이벤트 모니터를 사용하여 모든 종류의 문제점 및 패턴을 검색 할 수 있으므로 포함 된 링크는 이벤트 모니터 및 출력을 포함 할 테이블을 정의하는 작업을 크게 단순화하는 DB2 유틸리티에 포함됩니다. 그 후, 당신은 단지 그것을 시작

SET EVENT MONITOR YourMonitorName STATE 1

해야하며,

SET EVENT MONITOR YourMonitorName STATE 0

이 기능을 해제 할 수 있습니다. 모니터가 켜져있는 동안 실행되는 모든 단일 SQL 문은 이벤트 모니터 테이블에 3 ~ 5 행의 데이터를 생성하므로이 부분을 끄는 것은 매우 중요합니다.