본문 바로가기

탁월한 전략

Stack Overflow Makes Slow Pages 100x Faster by Simple SQL Tuning

 

원제 : Stack Overflow Makes Slow Pages 100x Faster by Simple SQL Tuning

번역 : Stack Overflow Makes Slow Pages 100x Faster by Simple SQL Tuning

NoSQL에 대한 가장 일반적인 불평은 여러분이 좋은 SQL 질의를 작성할 줄 안다면 SQL이 잘 동작한다는 점이다. SQL이 느리다면 여러분은 언제나 튜닝하고 좀더 빠르게 만들 수 있다. 이런 점증적인 개선 프로세스의 가장 큰 예가 StackExchange에 근무하는 Sam Saffron이 쓴 A day in the life of a slow page at Stack Overflow 인데, 그는 쿼리에 대한 프로파일과 튜닝으로 페이지 로딩 시간을 630ms에서 40ms로 감소시키고 다른 페이지들은 100배의 개선이 가능함을 보여주었다. 

Sam은 많은 우수한 그의 튜닝 과정, 동작원리, 사고과정, 사용 도구, 수반된 트레이드오프를 제공합니다. Sam의 단계들에 대한 짧은 요약입니다:

  1. badge detail page 로드에 630.3ms, SQL 질의에 298.1ms가 걸림을 보여주고, 페이지에서 사용하는 SQL 쿼리를 보여주고 각각 얼마나 걸리지는 보여주는 mini-profiler 를 사용합니다. 
  2. 월별로 HAProxy 에 저장된 방문기록으로부터, Sam은 하루에 페이지가 26,000번 처리되고 랜더링에 평균 532ms가 걸림을 결정할 수 있었습니다. 이건 너무 오래걸리는데, 문제를 해결할 높은 가치가 있으며, 구글은 Page Rank를 위해 속도를 계정으로 가져왔으며 Sam은 이런 작업이 더 빠르게 이루어질 것이라 생각합니다. 
  3. Sam이 알아낸 것들:
    1. N+1 Select Problem이라 부르는 많은 검색 쿼리가 존재합니다. 마스터 레코드를 위해 모든 데이터를 얻어오는 많은 독립적인 자세한 SELECT 쿼리가 있습니다. 더욱 자세한 내용은 다음을 보세요: Hibernate Pitfall: Why Relationships Should Be Lazy.
    2. 웹서버에서 사용하는 시간을 절반으로 줄입니다.
    3. 매우 비싼 쿼리들이 있습니다.
  4. 코드가 LINQ-2-SQL 멀티 조인을 사용하는 것을 코드리뷰로 확인했습니다. LINQ-2-SQL은 고수준 ORM 표현을 만들고 그로부터 SQL 코드를 만들어냅니다. 생성된 코드는 상용화단계에서 느리고 비용은 10x만큼 듭니다
  5. 전략은 간단한 .Net 객체 맵퍼인 Dapper를 이용하여 ORM 오버헤드를 없애고 쿼리를 다시 작성합니다. 결과로 나온 코드는 더 빠르고 더 디버깅가능합니다. Linq2Sql 은 SELECT에서 제거되었지만, Stack Overflow에서 WRITE를 위해 사용합니다.
  6. 사용화에서 이 쿼리는 시간이 오래 걸리고, 다음 단계는 인덱스 대신에 테이블 스캔을  하는 쿼리 계획을 살펴보는 것입니다. 10의 비율로 페이지 로드를 감소시키는 새 인덱스를 생성합니다.
  7. The N+1 problem 은 하나의 쿼리로 모든 레코드를 가져오는 left join을 사용하는 ViewModel 로 변경하여 수정합니다.

NoSQLite는 key-value 데이터베이스가 무엇을 하는지에 대응합니다.모든 NoSQLite 데이터는 한번에, 튜닝없이, 문제를 해결하여 가져올 수 있습니다. NoSQLite는 여러분에게 RDBMS의 모든 장점을 잃어버리게 하고  RDBMS가 충분히 빠르고 간단한 튜닝 프로세스로 매우 빨라질 수 있음을 보여줄 수 있는데, 따라서 NoSQL로 갈아탈 어떤 이유도 없습니다.

Related Articles