Post

[개발] SQL 레벨업 - 미크 (한빛미디어)

SQL 레벨업 - 미크

SQL을 사용할 일이 있다면 읽어보면 좋을 책이다. 직장에서 해비하게 SQL을 쓰고있지는 않지만 가끔가다 BigQuery로 데이터를 조회할 때가 있는데 그래서 책에 나오는 여러 기술들의 필요성을 이해하기 더 쉬웠다.

개발을 하다보면 여러 선택지 가운데서 선택해야하는 경우가 많다. 그리고 그러한 경우, 각 선택마다 트레이드오프가 있기 때문에 어떤 선택이 더 좋다라고 확실히 단언하긴 어렵다. 다만 확실한 것이 있다면 같은 결과를 도출하면서 단지 실행속도만이 다를 뿐인 선택지 두 가지가 있다고 한다면 더 빠른 쪽을 선택하는 것이 무조건 좋다는 것이다. 이건 반론의 여지가 없다.

이 책에서는 어떻게 하면 더 효율적으로 SQL 쿼리를 작성할 수 있을지에 대해 집중적으로 다루고 있다. 성능 최적화쪽을 좋아해서 더 재미있게 읽을 수 있었다.

다만 용어들이 한글로 모두 번역되어 있어서 영어와 한글을 병용하는 것이 더 좋았지 않았을까 하는 아쉬움은 있다.

1장: DBMS 아키텍처


DBMS의 구조에 대해 설명한다. 엄청나게 깊게 들어가지는 않지만 대략적으로 어떻게 DBMS가 실행되는지, 메모리와 작동 과정에 대해 이해할 수 있었다.

DBMS가 쿼리를 파싱하고 실행 계획을 세우게 되는데 더 효율적인 실행 계획을 세우도록 만드는 것이 SQL 최적화의 핵심이라 볼 수 있다.

그럴 일이 있을까 싶기는 한데 DBMS가 알아서 하는 것들을 개발자가 메뉴얼하게 수정할 수 있다는 점이 신기했다. 생각해보면 옛날에는 컴퓨터 성능도 그리 좋지 않았고 메모리가 비싼 자원이기도 해서 실제로 그러한 기능들을 활용할 일이 있었지 않았을까 싶다.

2장: SQL 기초


SELECT, WHERE, CASE, INTERSECT 등 SQL의 기초적인 문법에 대해 설명한다. 과거에 잠깐 GROUP BY, HAVING 등을 공부했을 때에는 의미가 와닿지 않았는데 책이 워낙 예시를 잘 들어놓아서 이해하기 편했다.

마찬가지로 헷갈리는 개념이었는데 GROUP BY를 사용해서 데이터를 자르고 집약할 때 사용하는 함수가 aggregate function, 자르는 절차 없이 PARTITION BY를 통해 집약만 하는 함수를 window function이라 한다.

3장: SQL의 조건 분기


UNION 대신 CASE를 사용해서 쿼리를 최적화하는 방법에 대해 알려준다. 정말 실용적이라 여러가지에 써먹을 수 있겠다는 생각이 들었다. 책이 조금 아쉽다고 느꼈던게 용어와 관련된 부분이었는데 구문과 식이 어떤 용어에서 번역되었는지 헷갈렸다. (아마도 구문 = statement, 식 = expression?)

인덱스를 사용하는 경우에는 UNION이 더 나을 때가 있다고 설명한다.

SQL 중급자가 되기 위해서는 절차 지향에서 선언형으로 사고하는 것이 중요하다고 한다.

4장: 집약과 자르기


GROUP BY와 PARTITION BY에 대해 조금 더 자세히 설명하는 장이다.

5장: 반복문


반복문 대신 집합 지향형으로 SQL을 사용하는게 좋다고 이야기하고 있다. 꽤나 어려운 테크닉처럼 보이는데 CASE와 window function을 사용해서 반복문을 대체할 수 있다고 한다.

각각 장단점을 잘 설명해 두었는데 요즘같이 컴퓨터 성능이 좋아진 시점에서 가독성이 좋은 반복문을 사용하는 것도 나쁘지 않겠다란 생각이 들었다.

6장: 결합


CROSS JOIN, INNER JOIN, OUTER JOIN 등에 대해 설명하며 내부적으로 어떤 알고리즘을 통해 집합들을 결합시키는지에 대해서도 설명한다.

3개 이상의 집합을 결합할 때 의도치않게 크로스 결합이 일어나는 경우가 있다고 한다. (e.g. 집합 A와 B의 결합 조건과 집합 B와 C의 결합 조건이 주어졌을 때, 내부 최적화로 인해 A와 C가 먼저 결합하는 경우) 단순하게 집합 A와 C의 결합 조건을 추가적으로 넣어줘 이를 해결할 수 있다. (DBMS가 진화하면서 이런 부분들은 이미 해결되어 있을 수도)

7장: 서브쿼리


서브쿼리 대신 윈도우 함수를 사용하는 예제들을 소개한다.

8장: SQL의 순서


기본적으로 SQL은 레코드에 순서를 부여하지 않지만 필요한 경우가 있어 DBMS가 이를 지원하도록 진화하고 있다고 한다. ROW_NUMBER() 같은 윈도우 함수가 대표적이다.

마치며


총 10장까지 있는데 8장 중간정도만 읽고 멈췄다. 어찌보면 조금 자잘한? 성능에 대해서 다루고 있어 원저의 출판연도를 찾아보니 2015년이었다. (한국어판은 2016년이다.) 8년이 지난 지금 컴퓨터 성능도 많이 좋아졌고 DBMS 또한 발전했기 때문에 요즘 SQL 사용자들의 테크닉이나 관심사는 이와 다를 수 있을 것이다.

또 이런 디테일까지 신경쓸 정도로 SQL을 사용하지 않고 있어서 다른 책으로 넘어가는게 좋을 것 같았다.

조금은 outdated 된 서적이지만 잘 쓰인 예제와 함께 참조할 부분도 많아서 괜찮은 책이었다.

This post is licensed under CC BY 4.0 by the author.