다음 코드 블록은 ~ 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 초입니다.
'blah.component' 무엇입니까? 칼럼? 관계? – RazerM
"2000 쿼리를 수행하고 있다고 생각하지 않습니다."엔진에 로깅을 허용하거나'echo = True'를 전달해야합니다. – RazerM
DB에 익숙하지 않지만 관계가 있다고 생각합니다. orm.mapper (a, b, properties = { '구성 요소 : orm.relationship (othercomponent, secondary =, primaryjoin = == , secondaryjoin = == })에 나열되어 있습니다. –
pyInTheSky