본문 바로가기

Python/SQLAlchemy

(스크랩) Lazy loading? Eager loading? (feat. async와 lazy loading 관계)

What Lazy loading? Eager loading?

두 테이블 간에 조인을 맺고 사용을 할 때
parent를 언제 로드하는지 설정하는 것이다.

예)
child1.some_parent를 호출하면 SQLAlchemy는 데이터베이스에서 parent를 언제 로드할지 결정한다.

 

parents를 언제 로드하는지가 왜 중요한가?

  • Joins are expensive.
  • User idling(대기)을 피해야한다. 150ms이상의 딜레이는 noticeable하다.
  • Joins는 경험에 부정적인 영향을 미치지 않는 UX에서 짧은 시간동안 이루어져야 한다

lazy loading이란?

Lazy loading(Default): lazy loading은 필요할때만(e.g. child.parent object가 호출될때) 로딩이 발생한다.

기본 옵션은 lazy=True이므로 생략 가능하다.
children = db.relationship('ChildModel', backref='some_parent', lazy=True)

 

더 자세한 설명

객체 관계 매핑에서 "lazy load"는 일반적으로 객체가 처음 로드될 때 일정 시간 동안 데이터베이스 측 값을 포함하지 않는 속성을 나타냅니다. 대신, 속성은 메모화를 수신하여 처음 사용될 때 데이터베이스로 데이터를 로드합니다. 이 패턴을 사용하면 관련 테이블의 속성을 즉시 처리할 필요가 없다는 점에서 객체 가져오기 내에서 발생하는 복잡성과 시간을 줄일 수 있다. 느린 로딩은 빠른 로딩(eager)의 반대입니다.

(https://docs.sqlalchemy.org/en/14/glossary.html#term-lazy-loading)

 

https://edykim.com/ko/post/getting-started-with-sqlalchemy-part-2/

lazy loading 찬반

Pro: 초기 대기 시간이 없다. 필요한 것만 로드한다.

Con: joined asset에 대한 요청이 있을때마다 매번 join SQL을 생성해내야 하므로 호출이 많을 때에는 좋은 방법이 아니다.


Eager loading이란? 

Eager loading: 모든 joined data objects를 한번에 로드한다.

 

Eager loading 찬반

Pro: 추후에 발생할 수 있는 query들을 줄여준다.
Con: 처음에 joined table을 로드할때 시간이 오래걸린다.

 

async와 lazy loading의 관계는?


아래의 뉘앙스는, async 쓸때는 lazy loading 쓰지말란거 아닌가?  ==> 맞다.

Using 2.0 style querying, the AsyncSession class provides full ORM functionality. Within the default mode of use, special care must be taken to avoid lazy loading or other expired-attribute access involving ORM relationships and column attributes;


2.0 스타일 쿼리를 사용하는 AsyncSession 클래스는 전체 ORM 기능을 제공합니다. 

기본 사용 모드 내에서 지연 부하 또는 ORM 관계 및 열 속성과 관련된 기타 속성 만료 액세스를 방지하기 위해 특별한 주의를 기울여야 합니다.

 



https://velog.io/@langssi/Relationships

https://edykim.com/ko/post/getting-started-with-sqlalchemy-part-2/

https://docs.sqlalchemy.org/en/14/orm/loading_relationships.html

https://docs.sqlalchemy.org/en/14/glossary.html#term-lazy-loading

https://velog.io/@vagabondms/%EA%B8%B0%EC%88%A0-%EC%8A%A4%ED%84%B0%EB%94%94-Lazy-loading%EC%9D%B4%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80

https://stackoverflow.com/questions/47241641/sqlalchemy-how-lazyloading-works