-
개발자를 위한 인덱스 생성과 SQL 작성 노하우 5/5책 2021. 6. 23. 09:21
웹서비스에서 DB I/O는 성능에 직접적인 영향을 끼친다. 쿼리 속도를 높이는데 여러 방법이 있겠지만, 개발자가 레벨에서 가장 많이 다루는 것은 인덱스일 것이다. 책의 제목처럼 개발자 입장에서 DB 인덱스 처리와 쿼리 작성 노하우를 제대로 풀어낸 책이다. (책의 저자는 개발자에서 DBA로 전직한것으로 보인다.) DB 전문가 대상의 이론이나 개념 중심의 튜닝에서 벗어나 코딩 시 헷갈리는 인덱스 지점을 어떻게 잡고, 실행계획 적용 방법을 그림과 비유로 흥미롭게 소개한다.
책의 구성은 알차다. 일반적인 DB관련 책의 목차와는 조금 다르다. 관련 키워드를 정의해서 특정 주제를 찾을 때 참고할 수 있다. 각 단원이 시작할 때 저자 경험이나 썰을 를 먼저 풀어서 흥미를 높이고 지루하지 않게 한다. 마지막에는 흥미로운 연습문제도 포함하고 있다.
개발할 때 블로그 등 인터넷 참고를 많이 하는데, 거기에 대한 허와 실을 집어주는 부분이 인상적이다. 특히 DB는 이론과 실무가 다른 경우가 많은 것 같다.
'분포도가 좋은 컬럼은 처리 범위를 줄여주므로 결합 인덱스의 선행 칼럼으로 사용해야 한다'라고 여러 블로그에서 인용하고 있다. 과연 그럴까? 결합 인덱스는 여러 컬럼을 합쳐서 처리 범위를 줄인다는 의미도 있지만, 다수의 단일 인덱스를 대체하는 공통의 인덱스라는 의미도 있다. 바로 이 부분을 간과한 것 같다. 결국 결함 인덱스에서 선행 칼럼의 순서는 분포도로 접근하기보다는, 분류의 개념으로 접근하는 것이 오히려 더 좋은 결과를 가져올 수 있다.
추천하는 결합인덱스의 컬럼 순서
1. 공통적으로 사용하는 필수 조건절 컬럼을 우선한다.
2. = 조건의 컬럼을 다른 연산자 컬럼보다 우선한다.
3. 대분류->중분류->소분류 컬럼순으로 구성한다.
4. 위치(조건) 정보 컬럼은 순서(sort)정보 컬럼보다 우선한다.인덱스보다 풀스캔이 유리할 때
테이블 풀스캔 시의 멀티 블록으로 운반됨을 감안해야 하고, Index Random 접근 시의 Leaf Block 접근도 감안해야 한다. 또한 인덱스 생성으로 인한 부하까지 고려한다면, 인덱스 후보컬럼으로 허용 가능한 기준치는 1% 이내이다.(일반 DB전문서나 블로그에서는 전체 레코드의 10% 내를 주장하는 경우도 있고, 3% 이내를 주장하는 경우도 있다.)update 항목에서 사용하는 컬럼은 인덱스 후보컬럼에서 배제하는 것이 좋다. 반드시 사용해야 하는 경우에는 단일 인덱스에 사용하기보단 결합인덱스의 후행컬럼으로 주로 사용한다.
대부분의 개발자들은 인덱스를 생성할 때 조건절 컬럼만 인덱스 후보컬럼으로 생각하는 경향이 있다. order by절 컬럼도 인덱스 후보컬럼으로 중요하게 사용되는 경우가 있음을 알아야 한다.
순서 정보 컬럼은 반드시 위치정보 컬럼의 후행에 있다.
인덱스의 생성 목적은 '모든 데이터를 빨리 찾게 하는 것이 아니라 필요한 데이터를 빨리 찾게 하는 것'임을 잊지 말아야 한다. 전체 건수에 대해 조회할 건수가 1/100 보다 작으면 인덱스를 타게 한다.
인덱스뿐만이 아니라, 실무에 필요한 TIP도 소개되어 있고 개발자가 할만한 튜닝에 대해서도 조금 다루고 있다. 다만 조금 아쉬운 점을 찾자면, 오라클 기준으로만 소개되어 있는 점이다.
2018년에 나온 책인데, 왜 이제야 봤을까..
'책' 카테고리의 다른 글
클라우드 네이티브를 위한 쿠버네티스 실전 프로젝트 5/5 (0) 2021.08.06 무엇을 위해 살죠 4/5 (0) 2021.07.17 도메인 주도 설계로 시작하는 마이크로서비스 개발 5/5 (0) 2021.05.25 SQL 첫걸음 4/5 (0) 2021.05.25 오늘 하루도 걱정 없이, 영어 5/5 (0) 2021.04.03