######서론
일단 본인은 커버링 인덱스를 판단하는 주체가
인덱스가 가지는 키가 테이블이 요구하는 비즈니스들을
충족하여 해당 인덱스 스키마가 커버링 인덱스라고 판단하는
것이 아닌
해당 테이블을 탐색하는 쿼리(DML)구문이 판단주체 라고
생각하고 있음
######이유
#1. 용어의 정의
커버링 인덱스라는 용어는 사전적인 의미를 가지고 있지 않으니
대중적으로 어떻게 해석되는가를 기준으로 설명하자면
서론에서 설명한 바와 같이 인덱스를 가지고
쿼리를 기준으로 다른 연산이 필요 없이 커버되면 커버링 인덱스다.
와 비슷한 내용으로 커뮤니티에서 데이터베이스 이해관계자들이
사용하고 있음
그럼 여기서 엥? 그러면 먼저 설명한 비즈니스들을 충족하니
스키마 기준으로 판단하는게 맞지 않아?
라고 생각한다면 다음 이유를 보시오.
#2. 다른 조건의 여러 비즈니스를 가지는 경우
단순하게만 생각을 해봐도 해당 테이블이 여러 조건의
비즈니스를 가진다고 생각한다면 모든 비즈니스에 대해
만족할 수 없기 때문에 스키마를 주체로 커버링인덱스 인지 판단하는건
옳지 않아.
극단적인 예시지만 간단하게 설명하자면
컬럼을 1,2만 가지고 있는 테이블이 있다고 쳤을때
1, 2 순으로 클러스터드 인덱스만 생성한경우
1, 2 순으로 조건만 주면서 사용하다가
2, 1 순으로 조회해야하는 비즈니스가 생겼을때
현존하는 클러스터드 인덱스만으로는 풀스캔이후 필터링 하여야 하기 때문에
2, 1 순으로 만든 논클러스터드 인덱스가 추가로 필요해
따라서 해당 클러스터드 인덱스가 모든 비즈니스를 만족할 수 없기 때문에
스키마를 주체로 커버링 인덱스라고 얘기할 수 없는거여
#3. 엔티티에 속성이 추가되는 경우(인덱스로 걸려있지 않은 속성이 구문에 존재 하는 경우)가 있기 때문
ㅋㅋ 나는 테이블이 무조건 하나의 조건으로만 조회 될껀데?
-> 이경우에도 스키마를 기준으로 얘기하기 어려운 이유가
서비스가 지속되면서 스키마가 영원히 변하지 않는 경우도 없다고 보는게 맞는것같고
같은 조건으로의 탐색이라도 결과셋에 필요한 속성이 달라지는 경우도 있기 때문에
클러스터드 인덱스로써는 조건의 순서가 바뀐다거나 조건에 걸리지 않던 속성이 조건으로 걸린다거나
논클러스터드 인덱스로써는 모든속성을 포함하고 있었다해도 엔티티에 새로운 속성이 추가된다거나 한다는 식으로
비즈니스는 변화하기 때문에 스키마를 주체로 판단한 커버링 인덱스는
영속될 수 없다고 생각해.
#######결론
따라서 위 세가지의 이유를 들었지만 제일큰건 아무래도 1번이지... ㅋㅋ 다들그렇게 쓴다니까
여튼 뭔가 틀렸다고 생각하거나 반박할 여지가 있는건 댓글로 남겨줘
#######비고
이전의 인덱스 얘기들
- https://gall.dcinside.com/mgallery/board/view/?id=backend&no=9693&page=1
pk가 커버링인덱스가 아닌경우실행계획에서 인덱스에 대한 Seek연산을 볼수있는데 해당 연산에서 Seek연산만으로 끝나면 커버링인덱스 인것이고 조건자 연산이 더붙으면 커버링 인덱스가 아닌것임 조건자가 붙었다는건 Seek연산 이후 결과물을 가지고gall.dcinside.com- https://gall.dcinside.com/mgallery/board/view/?id=backend&no=9687&page=1
이 샛기위해서 누가 db커뮤니티 하나 파줘라 커버링인덱스라는 개념부터 안와닿는데 - dc App
이미 DB커뮤 따로함 여긴 기초적인거나 얘기하러 오는겨 - dc App
쿼리를 기준으로 다른 연산이 필요 없이 커버되면 이것부터 예시로 알려주도록 - dc App
실제 레코드 접근 없이 인덱스 접근만으로 도출되는거 아니뇨
비고에 잘 설명되어있지만아키텍쳐 빼고 요약하자면#클러스터드 인덱스 인경우조인이나 조건절의 속성이모두 클러스터드 인덱스 키에 들어있고순서또한 일치하는경우 #논클러스터드 인덱스에경우논클러스터드 인덱스 키값을 기준으로위와 일치하면서 추가적으로 pk 키값내에서만 다루는경우가 커버링 인덱스 되시겠다 - dc App
왜 인지는 비고에있는 이전글들에 아키텍처를 곁들여 설명했으니 알아서보시라 - dc App
까놓고 특정값을 찾으려고 풀스캔이나 룩업? 뭐 그런걸로 b트리 한번더 훑는거 방지하고 특정데이터만 완벽하게 추출한다는데 사실 백엔드개발자로써는 좆도모르걱씀 - dc App
테이블접근을 여러번막는다는데 쉽게 좆겉네 db - dc App
놀랍게도 익스퍼트한 백엔드 개발자가 될려면(아마도) 여기까지는 알아야 한?다 - dc App
이제 여기서 더들어가면 하드웨어, os, 스키마, 페이지와 익스텐트 아키텍쳐 관련 내용으로 io당 최대로 데이터 조회되도록 튜닝 하는겨 - dc App
걍 그런게 있구나 정도만 알란다; db깊게 들어가면 진짜 각잡고 공부해야할것같음 빽린이는 실행계획하고 조인만 알면됭+ - dc App
차에코 이샛기는 커버링인덱스도 모르면서 꺼드럭거린거임?
2번의 이유때문에 항상 커버링인덱스에 pk가 포함될 수 없다란거지?
넹 - dc App
반례가 존재했네 ㄱㅅ
흠 아닌가 2,1 로 쿼리를 쏘면 애초에 인덱스를 타지 않는 상황이라 커버링인덱스의 전제 자체가 틀린것 아닌가?
커버링 인덱스라 함은 일단 쿼리가 인덱스를 탄다는 전제가 있잖아
이건 논리적 순서때문에 헷갈리는거 같은데 인덱스를 못타면 그 쿼리에 대해 커버링을 못한거고 결국에는 기존에있던 비즈니스 하나에 대해서만 쿼리를 커버링할 수 있기때문에 비즈니스 쿼리구문별로 주체를 잡아서 얘기하는게 맞지 않나? - dc App
인덱스 탄다 - 클러스터드 인덱스를 타고들어가서 추가로 i/o 나 , 버퍼풀에서 레코드의 값들을 가져와서 필터연산이 필요할때 커버링 인덱스 - 논 클러스터드 인덱스만으로 쿼리를 처리 가능
근데 2번의 설명은 인덱스를 사용하지 않는 상황이라 햇갈리네
인덱스를 탄다가 커버링 인덱스를 포함한다는 말임