2016-09-06 3 views
0

다음 코드 블록은 ~ 2000 행의 테이블을 쿼리합니다. 루프를 실행하려면 20 초가 걸립니다! 제한된 지식으로 2000 쿼리를 수행하고 있다고 생각하지 않습니다. 다만이 쿼리를 이해하지는 못합니다. 운영자와 뒤에서 무엇을하고 있는지에 대해 설명합니다. 이 루프가 더 빨리 실행되도록 수정하려면 어떻게해야합니까? 최상위 쿼리 s.t를 조정하는 방법이 있습니까? 두 번째 for 루프는 총 3000 개의 쿼리를 작성하지 않습니다 (실제로 진행중인 경우).SQLAlchemy 반복 성능이 저하되었습니다.

다음은 엄청난 시간 소비를 유발하는 사실이 내부 루프인지 확인하기 위해 만든 테스트 블록입니다.

block = [] 
cnt = 0 
for blah in dbsession.query(mytable): 
    tic = time.time() 
    for a in blah.component: 
     cnt += 1 
    block.append(time.time()-tic) 
print "block: %s seconds cnt: %s" % (sum(block), cnt) 

# block: 20.78191 seconds cnt: 3021 

선택된 최상의 응답으로부터 제안하여 for 루프는되었다 :

20-25s 각각으로부터가는 각 구성 요소의 내부 루프 결과
for blah in dbsession.query(mytable).options(joinedload(mytable.componentA)).options(mytable.componentB)).options(mytable.componentC) 

0.25 0.59 0.11 s이다. 쿼리 자체는 이제 약 18 초가 걸리므로 내 총 저장된 시간은 약 55 초입니다.

+0

'blah.component' 무엇입니까? 칼럼? 관계? – RazerM

+0

"2000 쿼리를 수행하고 있다고 생각하지 않습니다."엔진에 로깅을 허용하거나'echo = True'를 전달해야합니다. – RazerM

+0

DB에 익숙하지 않지만 관계가 있다고 생각합니다. orm.mapper (a, b, properties = { '구성 요소 : orm.relationship (othercomponent, secondary = , primaryjoin = == , secondaryjoin = == })에 나열되어 있습니다. – pyInTheSky

답변

2

.component에 액세스 할 때마다 다른 SQL 쿼리가 방출됩니다.

당신은 Relationship Loading Techniques에서 자세한 내용을보실 수 있습니다,하지만 당신은 다음에 쿼리를 변경할 수 있습니다 한 번에 모두로드 :

from sqlalchemy.orm import joinedload 

dbsession.query(mytable).options(joinedload('component')) 
+0

for 루프는 다음과 같습니다. blahcomponent for dbsession.query ...? – pyInTheSky

+0

아니요, 그냥 'dbsession.query (...')에 대해, 그렇다면 SQLAlchemy는'.component'에 액세스하여 이미로드 된 것을 알고 있습니다 .. – RazerM

+0

words can even even 내 감사를 표현하기 시작 ... 21s 0.37s – pyInTheSky

관련 문제