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..
-
성능 개선을 위한 기본 지식 - 실행 계획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..
-
SQLBOOSTER - RANGE JOINDataBase/SQL 2024. 6. 6. 14:52
대부분 조인은 같다를 조건으로 이용하지만, 반드시 같다 조건으로만 조인을 할 수 있는 것은 아니다. 범위 (Like, )조건을 줄 수도 있으며 때에 따라 같지않다를 사용할 수도 있다. 범위 조건을 이용해 조인하는 것을 RANGE JOIN이라 부른다. 먼저 RANGE JOIN 사용 전 이전 GROUP BY로 금액 유형에 따라 High,Low,Middle로 나누었던 쿼리를 살펴보자 SELECT ORD_ST, CASE WHEN ORD_AMT >= 5000 THEN 'HIGH' WHEN ORD_AMT >= 3000 THEN 'Middle Order' ELSE 'Low Order' END ORD_AMT_TP, COUNT(*) ORD_CNTFROM T_ORDGROUP BY ORD..
-
SQLBOOSTER - INNER JOINDataBase/SQL 2024. 6. 4. 23:27
INNER-JOIN 이란 이너 조인은 조인 조건을 만족하는 데이터만 결합하여 결과를 내보낸다. (T1.CUS_ID = T2.CUS_ID)WHERE 절에서 사용하는 조건은 필터 조건과 조인 조건 두 가지가 있다. FROM 절에 사용된 테이블이 두 개 이상이면 필터 조건과 조인 조건이 동시에 있을 수 있다.SELECT T1.COL_1, T2_COL_1FROM ( SELECT 'A' COL_1 FROM DUAL UNION ALL SELECT 'B' COL_1 FROM DUAL UNION ALL SELECT 'A' COL_1 FROM DUAL )T1,( SELECT 'A' COL_1 FROM DUAL UNION ALL SELECT 'B' COL_1 FROM DUAL UNION ALL SEL..