Computer Science/SQL Tuning

    테이블 JOIN 튜닝

    MySQL과 MariaDB에서 테이블의 데이터를 결합하는 조인 알고리즘은 대부분 중첩 루프 조인을 사용한다. 성능 최적화를 위해 다른 조인 알고리즘을 제공하지만, 대부분의 조인 방식이 중첩 루프 조인에 기반을 두므로 튜닝 분석 시 실행 계획을 확인해야 한다. 작은 테이블이 먼저 조인에 참여하는 SQL 문 현황 분석 부서사원_매핑 테이블과 부서 테이블을 조인하여 부서 시작일자가 '2002-03-01' 이후인 사원의 데이터를 조회하는 쿼리 드라이빙 테이블인 부서 테이블과 드리븐 테이블인 부서사원_매핑 테이블은 중첩 루프 조인을 수행한다. 작은 크기의 부서 테이블에서 부서.부서번호 컬럼만 SELECT 절과 WHERE 절에 필요하므로, 부서명 인덱스를 활용해 인덱스를 풀 스캔한다. 상대적으로 큰 크기의 부서사원..

    SQL 문 튜닝

    테이블 테이블명 설명 사원 해당 기업에 소속된 직원들의 정보를 저장하는 테이블 부서 조직에서 관리하는 업무 부서에 관한 정보를 저장하는 테이블 부서사원_매핑 부서 테이블과 사원 테이블 간의 매핑 정보를 저장하는 테이블로, 한 명의 사원은 특정 부서에 소속되므로 그에 해당하는 연결 정보를 저장한다. 부서관리자 부서를 대표하는 관리자 사원의 정보가 저장되는 테이블 직급 사원이 위치하는 포지션을 나타내는 테이블로, 과거의 직급 정보부터 현재의 직급 정보까지 적재되어 있다. 급여 사원별로 매년 계약한 연봉 정보가 저장되는 테이블로, 과거 급여부터 현재 급여까지 매번 적재되어 있다. 사원출입기록 지역별, 출입문별로 출입한 이려게 관한 시간 정보를 적재하는 테이블 인덱스 목록 테이블명 키 유형 키 구성열 급여 PK..

    SQL 프로파일링

    프로파일링은 SQL 문에서 문제가 되는 병목 지점을 찾기위해 사용하는 툴을 말한다. 느린 쿼리나 문제가 있다고 의심되는 SQL 문의 원인을 확인할 수 있다. SQL 프로파일링 MySQL은 프로파일링이 기본적으로 비활성화 되어 있으므로, 활성화 작업을 진행한다. 프로파일링을 수행할 SQL 문을 출력하고, 로파일링된 쿼리 목록을 확인한다. 특정 쿼리 ID에 대해서만 프로파일링된 상태 내용을 확인하려면, 다음과 같이 쿼리 ID를 입력한다. 특정 Status에 해당되는 Duration 값이 높게 나타난다면 문제가 될 소지가 높은 구간으로 볼 수 있다. 추가 정보 프로파일링의 추가 정보를 확인하려면 아래와 같은 키워드를 이용하여 구체적으로 분석할 수 있다. show profile 구문 뒤에 해당 키워드를 작성하여..

    MySQL과 MariaDB 실행 계획

    실행 계획 실행 계획이란 SQL 문으로 요청한 데이터를 어떻게 불러올 것인지에 관한 계획, 즉 경로를 의미한다. 실행 계획을 확인하는 키워드로는 EXPLAIN, DESCRIBE, DESC가 있으며, 3가지 중 어떤 키워드를 사용해도 실행 계획의 결과는 같다. EXPLAIN SQL 문; DESCRIBE SQL 문; DESC SQL 문; MySQL SQL 문 앞에 EXPLAIN 키워드를 입력하고 실행하면 옵티마이저가 만든 실행 계획이 출력된다. MariaDB에 비해 partitions, filtered 열이 추가되면서 더 많은 정보를 보여준다. MariaDB 실행 계획 항목 분석 1. id SQL 문이 수행되는 차례를 ID로 표기한 것으로, 조인할 때는 똑같은 ID가 표시된다. ID의 숫자가 작을수록 먼저 ..

    인덱스와 인덱스 스캔

    인덱스 인덱스는 데이터베이스에서 키값으로 실제 데이터 위치를 식별하고 데이터 접근 속도를 높이고자 생성되는, 키 기준으로 정렬된 오브젝트이다. 저장된 데이터를 검색할 일이 많을 때는 인덱스를 설계하고 생성하는 과정이 매우 중요하다. 인덱스는 생성하려는 열의 속성에 따라 고유 인덱스와 비고유 인덱스로 구분할 수 있다. 고유 인덱스 고유 인덱스란 인덱스를 구성하는 열들의 데이터가 유일하다는 의미로, 차례로 정렬되는 인덱스 열의 데이터는 서로 중복되지 않고 유일성을 유지한다. 만약 동일한 데이터가 생성되면 고유 인덱스의 중복 체크 과정에서 에러가 발생한다. 또한, 중복이 없는 열들을 고유 인덱스로 생성하려 한다면 중복이 있는지 검증하는 절차를 거쳐햐 하므로, 불필요한 중복 검증 과정이 추가되므로 주의해야 한다..