SQL 튜닝을 위한 새로운 관점: 선언적 언어 아래 숨겨진 절차적 비밀


SQL(Structured Query Language)은 선언적 언어입니다.
그러나 SQL 튜닝을 잘하고 싶다면, SQL이 DBMS 내부적으로는 절차형 언어로 처리된다는 생각의 전환이 필요합니다.
(SQL을 절차형 언어처럼 작성하라는 뜻이 절대 아닙니다.!!)

선언적 언어는 "어떻게(How)" 가 아닌 "무엇을(What)" 할 것인지, 또는 "무엇이" 필요한지를 정의하는 언어입니다.
다시말해, SQL을 사용할때는 필요한 데이터 집합이 무엇인지 정의만 해주면 됩니다.
SQL과 같은 선언적 언어는 데이터를 어떠한 순서, 또는 어떠한 절차로 가져올 것인지를 정의할 필요가 없습니다.
 
자바, 파이썬, C와 같은 프로그래밍 언어는 절차형 언어입니다.
절차형 언어는 "무엇(What)"과 함께 "어떻게(How)"에 모두 집중해야 합니다.
절차형 언어는 필요한 결과(무엇)를 얻기 위한 절차(어떻게)까지 모두 구현해야 하기 때문입니다.
이와 같은 차이로, 절차형 언어만 다루던 분들이 초반에 SQL을 다루기 어려워하기도 합니다.
하지만, 절차형 언어를 제대로 잘하는 개발자라면, 분명히 "SQL 튜너"의 소질이 있을거라 생각합니다.

SQL은 표면적으로는 선언적 언어입니다. 하지만, DBMS 내부적으로 데이터가 처리되는 과정은 절차적입니다.
예를 들어, 뉴욕에 사는 고객의 최근 한달 주문 건수가 필요하다면, 아래와 같이 SQL로 필요한 데이터 집합을 정의해주면 됩니다.

SELECT  COUNT(*) 주문건수
FROM    고객 A INNER JOIN 주문 B ON (A.고객ID = B.고객ID)
WHERE   A.도시 = 'NY'
AND     B.주문 >= ADD_MONTHS(NOW(),-1M);



위와 같은 SQL을 실행하면, DBMS는 내부적인 절차를 만들어 SQL에 맞는 데이터 집합을 만들어 줍니다.
이때, DBMS는 사용자가 요청한 SQL의 결과를 만들기 위해, 다양한 내부적인 처리 절차를 고려할 수 있습니다.
주문 테이블에서 최근 한달치를 읽은 후에, 고객에 접근해 결합(JOIN)할 수도 있으며,
반대로 도시가 NY인 고객을 먼저 찾은 후에 주문 테이블과 결합 할 수도 있습니다.
SQL은 선언적인 언어이기 때문에, 내부적인 절차는 DBMS가 마음대로 정하고 처리하게 됩니다.
어떠한 절차로 처리하든 사용자가 요구한 데이터만 정확히 만들어주면 됩니다.
그러나, DBMS가 마음대로 처리 절차를 정한다기 보다는,
SQL의 최종 결과를 얻는데 가장 비용이 적은(성능이 좋은) 방법을 고려해 절차를 정합니다.
그리고 이러한 처리 절차를 만드는 모듈이 그 유명한 옵티마이져(Optimizer)입니다.

이 글에서 SQL 성능 관련해 우리가 주목해야 할 것은,
선언적 언어인 SQL이 DBMS 내부에서는 절차적으로 처리된다는 것입니다.
그리고 이 절차에 따라 SQL의 성능 차이가 천차만별이 될 수 있습니다.
SQL의 처리 절차는 실행계획(EXPLAIN)을 통해 확인할 수 있습니다.
그러므로, SQL의 성능에 이상이 있다면 가장 먼저 실행계획을 확인해야 합니다.
좀더 덧붙여 말하자면, 실행계획을 통해 SQL의 내부적인 처리 절차를 확인해야 하는 것입니다.
실행계획을 통해, 비효율적인 절차(처리 순서나 처리 방법)를 발견해 제거할 수 있다면,
SQL의 성능은 저절로 좋아지게 될 것입니다.

SQL 튜닝은, 이러한 내부적인 절차를 관찰하고 비효율적인 절차를 찾아 제거하거나 변경하는 것입니다.
다시말해, SQL은 표면적으로는 선언적 언어이지만,
SQL 튜닝 관점에서는 절차형 사고 방식으로 내부적인 처리 절차를 확인해야 합니다.
이러한 이해를 바탕으로 SQL 튜닝에 접근하면, SQL 튜닝을 좀 더 잘 할 수 있습니다.

끝으로, SQL을 절차적으로 작성하라는 뜻이 절대 아님을 다시 한 번 강조드립니다.
우리가 집합 개념으로 작성한 SQL이, DBMS 내부에서 어떤 절차로 처리되는지를 알 필요가 있다는 뜻입니다.
 
 
 
P.S. 아래와 같은 교육을 진행하고 있으니 많은 관심 부탁드립니다.
  - 평생필요한 데이터 분석: 저자 직강!, 주식 데이터를 활용한 SQL 입문자 교육
    https://cafe.naver.com/dbian/7131
  - StartUP Tuning For PostgreSQL: PostgreSQL을 활용한 SQL 튜닝 입문 교육
    https://cafe.naver.com/dbian/7181
  - StartUP Tuning For MySQL: MySQL을 활용한 SQL 튜닝 입문 교육
    https://cafe.naver.com/dbian/6958

+ Recent posts