DataBase/SQL
-
SQL BOOSTER - 조인의 내부적인 처리 방식DataBase/SQL 2024. 6. 12. 20:51
조인의 3가지 처리 방식 조인에는 이너 조인(조인 조건 참), 아우터 조인(기준 조건 무조건 참), 카테시안 조인 3가지가 있다. 오라클 내부적으로 조인이 처리되는 방식을 살펴보자 두 개의 데이터 집합을 연결하려면 조인 조건만 작성해주면 된다. SQL을 작성하는 입장에서는 매우 간단하다. 하지만, 내부는 복잡하며, 성능 개선 작업에 큰 도움이 된다. 조인의 내부적인 처리 방식은 아래 3가지가 존재한다. - NESTED LOOPS JOIN - MERGE JOIN- HASH JOIN 이너 조인을 NESTED LOOPS JOIN 방식 혹은 MERGE, HASH 방식으로 처리할 수도 있다. 아우터 조인도 마찬가지다 (카테시안은 HASH JOIN 불가능) 조인 처리 방식은 결과에는 영향이 없다 먼저 각자의..
-
SQL BOOSTER - 인덱스 설계 과정DataBase/SQL 2024. 6. 12. 19:49
SQL 하나를 위한 인덱스 설계는 어렵지 않다. 테이블 관련 SQL을 모두 검토하고 종합적으로 인덱스를 설계하는 것이 가장 중요하다. SQL 하나만 보고 인덱스를 생성해서는 안 된다. 실무에서 이는 어려운 일이지만, 어떻든 간에 인덱스는 전체 SQL을 보고 설계하는 것이 정석이다. 전체 SQL을 볼 수 없다면 가능한 많은 SQL을 살펴보자 인덱스 종합적 설계 과정 SQL별 접근 경로 조사테이블 별 접근 경로 정리종합적인 인덱스 설계핵심 테이블 및 핵심 SQL 집중 설계생성 및 모니터링 SQL 별 접근 경로 조사 이 과정을 진행하기 위해서는 개발 완료된 모든 SQL을 살펴봐야한다. SQL을 살펴보면서 사용된 접근 경로들을 엑셀로 정리해 놓는다. 각 항목을 살펴보면, 파일명 SQL ID를 관리해 해당..
-
SQL BOOSTER - 인덱스로 커버된 SQLDataBase/SQL 2024. 6. 12. 19:14
인덱스를 이용해 검색할 때 테이블 접근 횟수를 줄이는 것이 매우 중요하다. 이 횟수를 얼만큼 줄이느냐에 따라 SQL의 성능이 좋아진다. 더 나아가 테이블 접근 자체가 생략된다면 성능에 가장 좋다. SELECT /*+ GATHER_PLAN_STATISTICS INDEX(T1 X_T_ORD_BIG_$) */T1.ORD_ST, COUNT(*)FROM T_ORD_BIG T1WHERE T1.ORD_YMD LIKE '201703%'AND T1.CUS_ID = 'CUS_0075'GROUP BY T1.ORD_ST; 실행계획의 Buffers 수치를 보면, TABLE ACESS BY INDEX ROWID 단계에서 30.125로 급증했다. 그러므로 TABLE ACESS BY INDEX ROWID만 제거하면 SQL 성능을 ..
-
SQL BOOSTER - 복합인덱스DataBase/SQL 2024. 6. 12. 15:13
복합 인덱스 - 컬럼 순정과 순서 A,B,C 칼럼 순서의 복합 인덱스와 C,B,A 컬럼 순서의 복합 인덱스는 완전히 다른 인덱스다 복합 인덱스를 만들 때 가장 중요한 것은 인덱스를 구성하는 컬럼 순서다. 어떤 순서로 컬럼을 정하는 지에 따라 강력한 성능을 발휘할 수도 있으며, 도움이 안 될 수도 있다. 이때, 컬럼 순서를 정할 때 관심 있게 봐야하는 것은 WHERE절의 조건이다. 같다 조건이 사용된 컬럼을 복합 인덱스에 앞 부분에 두는 것이 기본 원칙이다. CREATE INDEX X_T_ROD_BIG_$ ON T_ORD_BIF(CUS_ID,ORD_YMD);SELECT /*+GATHER_PLAN_STATISTICS INDEX(T1 X_T_ORD_BIG_3) */T1.ORD_ST, COUNT(*)FRO..
-
SQL BOOSTER - 단일 인덱스DataBase/SQL 2024. 6. 12. 11:31
단일 인덱스의 컬럼 정하기 인덱스는 조건에 맞는 데이터를 빠르게 찾기 위한 객체이다. WHERE 조건절에 사용된 컬럼에 인덱스를 구성하는 것이 기본 원리다. SELECT /*+ GATHER_PLAN_STATISTICS*/TO_CHAR(T1.ORD_DT,'YYYYMM'), COUNT(*)FROM T_ORD_BIG T1WHERE T1.CUS_ID = 'CUS_0064'AND T1.PAY_TP = 'BANK'AND T1.RNO = 2GROUP BY TO_CHAR(T1.ORD_DT,'YYYYMM'); 이제 성능 개선을 위해 단 하나의 단일 인덱스를 고려해보자 후버 컬럼은 WHERE 조건절에 사용된 CUS_ID, PAY_TP, RNO컬럼이다. SELECT 'CUS_ID' COL, COUNT(*) CNT FRO..
-
SQL BOOSTER - INDEXDataBase/SQL 2024. 6. 12. 00:16
인덱스는 SQL 성능 개선을 위한 가장 기본적이면서 치명적인 무기이다. SQL 성능을 최대로 끌어올리기 위해서는 최적의 인덱스가 필요하며, 이를 위해 다음 능력이 필요하다.인덱스의 물리적인 구조를 이해복잡한 SQL을 분해해서 이해할 수 있는 능력만들어진 인덱스가 어떻게 사용될지 예측 가능한 능력테이블 내의 데이터 속성을 파악할 수 있는 능력JOIN의 내부적인 처리 방법(NESTED LOOPS, MERGE, HASH)의 이해 인덱스란? '테이블 내의 데이터를 찾을 수 있게 일부 데이터를 모아서 구성한 데이터 구조' 인덱스를 사용해서, 테이블 내의 데이터를 빠르게 찾아낼 수 있다. CREATE TABLE T_ORD_BIG ASSELECT T1.*, T2.RNO, TO_CHAR(T1.ORD_DT,'YYYYMM..
-
성능 개선을 위한 기본 지식 - 옵티마이저, 소프트 파싱,하드 파싱DataBase/SQL 2024. 6. 6. 17:44
1. 옵티마이저 옵티마이저는 성능 최적화기라고 할 수 있다. SQL 실행 계획을 만드는 역할으 수행한다. 옵티마이저에는 두 가지 방식이 있는데, 비용 기반 옵티마이저(CBO),와 규칙 기반 옵티마이저(RBO)이다. 비용 기반 옵티마이저는 최소 비용으로 목표로 실행 계획을 만들고, 규칙 기반은 일정한 규칙에 따라 실행 계획을 만든다. 대부분의 RDMS가 비용 기반 옵티마이저이다. 1.2 비용이란? 비용 기반 옵티마이저에서 비용은 IO횟수, CPU Time, 메모리 사용량을 의미한다. 이와 같은 비용을 산출할 때 가장 중요한 것은 테이블의 통계 정보다. 통계 정보가 제대로 수집되지 않으면, 옵티마이저는 엉뚱한 실행계획을 만든다. 통계가 제대로 구성되었더라도 완벽한 실행 계획은 나오지 않는다. 이런 경우 실..
-
성능 개선을 위한 기본 지식 - 실행 계획DataBase/SQL 2024. 6. 6. 17:12
1. 들어가며, SQL 성능 관련해서 '좌변은 절대 가공하지 말라'라는 말이 있다. WHERE를 사용하며, 왼쪽 컬럼을 가공하면 인덱스를 사용하지 못하기 때문이다. 이러한 사실을 망각하고, 무조건 좌변을 가공하지 않기 위해 WHERE '201701' = SUBSTR(T1.ORD_TMD,1,6)같은 SQL을 작성하거나, INNER JOIN 순서를 바꾼다고 성능이 좋아질 것이란 결론에 도달하기도한다. 결론적으로 SQL 성능 개선을 위한 방법들은 절대 암기할 것이 아니라, 원리를 잘 파헤치고 고민하는 과정이 중요하다 항상 실행계획을 확인하고, 문제점이 무엇인지 찾아보는 것이 좋다. 2. 실행 계획 이란 오라클과 같은 DBMS에서 데이터를 조회하거나 변경하려면, SQL을 사용해야한다. SELECT,UP..