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)
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
'Python > SQLAlchemy' 카테고리의 다른 글
(스크랩) ★★★ SQLAlchemy에서 Join 하는 방법 (feat. SQLAlchemy 1.4 ORM 공식 도큐먼트) (0) | 2022.02.18 |
---|---|
(스크랩 ) ★★ sqlalchemy async session execute 'where', 'order by', 'limit' (feat. Top N & Bottom N 쿼리) (0) | 2022.01.18 |