인프런 커뮤니티 질문&답변
안녕하세요 NESTED LOOP 문제에서
작성
·
27
0
CREATE INDEX EMP_DEPTNO_ENAME ON EMP(DEPTNO, ENAME);
CREATE INDEX DEPT_DEPTNO_LOC ON DEPT(DEPTNO, LOC);
SELECT /*+ LEADING(E D) USE_NL(D) INDEX_SS(E EMP_DEPTNO_ENAME) INDEX(D DEPT_DEPTNO_LOC) */ E.ENAME, D.LOC
FROM EMP E, DEPT D
WHERE E.DEPTNO = D.DEPTNO AND E.ENAME = 'SCOTT';
이렇게 결합컬럼인덱스 접근하니 BUFFERS수가 더 주는데 이렇게 풀이를 해도 괜찮을까요??
답변 2
0
안녕하세요. 신승호님 !
올려주신 쿼리와 힌트 사용을 보니 인덱스와 실행 계획의 작동 원리를 아주 정확하게 이해하고 계신 것 같네요. 결론부터 말씀드리면 현재 문제의 테이블 구조와 데이터 분포상에서는 아주 훌륭한 튜닝이며, 논리적으로도 흠잡을 데 없는 풀이입니다.
버퍼수가 획기적으로 줄어든 가장 큰 이유는 쿼리 처리에 필요한 모든 컬럼이 인덱스 안에 다 포함되어 있어서, 실제 테이블 블록을 읽으러 가는 랜덤 액세스 과정이 완전히 생략되었기 때문입니다. 굳이 무거운 테이블을 뒤질 필요 없이 가벼운 인덱스만 읽고 처리를 끝내는 소위 커버링 인덱스 효과를 제대로 활용하신 거죠.
또한 선두 컬럼인 DEPTNO가 조건절에 없는데도 INDEX_SS가 효율적이었던 건, DEPTNO의 종류가 몇 개 되지 않기 때문입니다. 오라클이 몇 번의 점프만으로도 원하는 데이터를 찾을 수 있는 상황이라 굳이 새로운 인덱스를 만들지 않고 기존 인덱스를 재활용하는 방식도 전략적으로 아주 좋은 선택이었습니다.
다만 실무에서 만약 부서의 개수가 수천, 수만 개로 늘어난다면 그때는 스킵 스캔의 효율이 떨어질 수 있다는 점만 참고로 알아두시면 완벽하겠습니다. 데이터의 특성까지 고려한 아주 센스 있는 풀이입니다.
감사합니다.
0
안녕하세요, 인프런 AI 인턴입니다. c신승호님.
합성 인덱스를 사용하여 NESTED LOOP를 최적화하는 방법에 대한 질문을 주셨네요. 제공해 주신 쿼리에서는 결합 컬럼 인덱스를 활용하여 효율적으로 데이터를 조회하도록 설계하셨는데, 이 방법이 적절한지 확인해 보겠습니다.
NESTED LOOP 프로세스: NESTED LOOP 조인은 두 테이블 간의 조인을 수행할 때 내부적으로 루프를 돌리면서 하나의 테이블의 각 행에 대해 다른 테이블을 검색하는 방식입니다. 사용한
USE_NL(D)힌트를 통해 NESTED LOOP 조인이 사용되도록 명시하셨고, 이는 작은 데이터셋의 경우 합리적인 선택일 수 있습니다.인덱스 사용:
INDEX_SS(E EMP_DEPTNO_ENAME)와INDEX(D DEPT_DEPTNO_LOC)힌트를 통해 EMP와 DEPT 테이블의 필터링할 컬럼에 인덱스를 적절히 활용하고 계십니다.BUFFER 감소: 실제로 쿼리 실행 시 BUF 사용량이 줄어들었다면, 인덱스를 활용한 최적의 경로를 선택하신 것으로 보입니다. 이는 메모리 사용량이 줄어든 것으로 해석될 수 있으며, 실행 속도 또한 개선될 가능성이 높습니다.
따라서, 데이터를 효율적으로 검색하고 메모리를 절약한 효과를 확인하셨다면, 해당 방법을 그대로 사용하셔도 무방합니다. 다만, 쿼리 성능은 데이터 양과 데이터베이스 환경에 따라 상이하므로, 특정 조건에서 항상 유리한 것은 아닐 수 있습니다. 지속적인 모니터링과 테스팅을 통해 더 나은 성능을 확인하시길 권장드립니다.
관련된 문제들과 토론을 참고하시면 도움이 될 수 있습니다:
- “인덱스 사용 및 SQL 성능 최적화”
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.





