해당 내용을 한 번에 모두 가지고 오기 위해 호출해야 하는 횟수가 다르다.
select_related는 SQL 조인을 만들고 SELECT 문에 related_object를 포함시켜 한 번에 가져온다.
prefetch_related는 각 관계에 대해 별도의 쿼리를 수행하고 Django에서 쿼리에 대한 데이터를 결합한다.
1번의 쿼리를 수행하는 select_related가 더 빠른 속도를 보여주지만 사용할 수 있는 범위가 한정되어 있기 때문에 두 가지를 적절히 섞어 사용을 해야 한다.
Row SQL이 빠르다. 이유는 Database와 상호작용할 수 있는 가장 빠른 native 언어이기 때문이다.
하지만 실제 서비스를 개발하는 입장에서 생산성이라는 부분을 다시 한번 생각해볼 필요가 있다.
이미지의 X축은 DB 모델의 복잡성, Y 축은 처리량 즉, 시스템의 트랜잭션 처리량을 나타낸다.
이를 보면 DB 모델들 간에 관계가 복잡한 함과 동시에 많은 양의 처리량을 필요로 할 경우 ORM을 사용하는 것이 개발 시간을 크게 단축하고 속도를 높일 수 있다.
그 이유는 ORM을 통해 DB를 쉽게 조작할 수 있기 때문이다.
ORM을 사용하는 것보다 SQL을 사용하는 것이 가장 빠른 방법이지만 대부분의 개발자는 SQL의 기초적인 수준(테이블과 뷰를 만드는 방법, 데이터를 선택하고 조인하는 방법, 데이터를 업데이트하고 삭제하는 방법을 의미)으로 알고 있으며 T-SQL, PL-SQL, 인덱스 및 그 효과에 대한 깊은 지식, 사용 방법 등등 SQL 지식이 풍부한 사람을 찾기가 훨씬 더 어려워진다.
이러한 부분들을 생각해 볼 때 일반적인 상황에서 더 높은 생산성을 보여주는 것은 ORM을 사용하는 방법일 수도 있다.
[참고]