전체 글
-
SQL BOOSTER - SQL 작성 가이드(3)DataBase/SQL 2024. 7. 15. 13:47
1. 작업량을 줄이자 SQL 성능을 높이려면 IO를 개선하는 것이 기본 원칙이다. IO를 더 줄일 수 없다면 작업량을 줄이는 아이디어가 필요하다. SELECT T1.CUS_ID, SUM(T1.UNT_PRC * T1.ORD_QTY)ORD_AMT , SUM(CASE WHEN T1.ORD_YMD LIKE '201701%' THEN T1.UNT_PRC * T1.ORD_QTY END) AMT_01 --12월까지 반복 FROM T_ORD_JOIN T1GROUP BY T1.CUS_IDORDER BY SUM(T1.UNT_PRC * T1.ORD_QTY) DESC; 위 SQL은 WHERE 조건절이 없다. 따라서 T_ORD_JOIN 모두를 읽어야 한다. 위 SQL의 실행계획은 ..
-
SQL BOOSTER - SQL 작성 가이드 (2)DataBase/SQL 2024. 7. 15. 09:43
1. 불필요한 COUNT는 하지 않는다. COUNT(*)는 데이터 건수를 세는 집계함수이다. 데이터 존재 여부를 확인하기 위해 COUNT(*)를 사용하는 경우가 많다.SELECT COUNT(*)FROM T_ORD_BIF T1WHERE T1.ORD_YMD = '20170225'AND T1.CUS_ID = 'CUS_0006';실행계획을 보면 INDEX RANGE SCAN단계의 A-ROWS가 10,000건이다. 카운트 했기 때문에 주문을 모두 읽은 것이다.단발성 SQL이라면, 큰 부담이 없겠지만, 고객이 주문할 때마다 실행되는 SQL이라면, 최적화할 필요가 있다. SELECT NVL(MAX(1),0)FROM DUAL AWHERE EXISTS( SELECT * FROM T_ORD_BI..
-
SQL BOOSTER - SQL 개발 가이드DataBase/SQL 2024. 7. 12. 14:01
1. WHERE절 가이드 1.1 WHERE 절의 컬럼은 변형하지 않는다. WHERE 절에서 사용하는 컬럼은 절대 변형해서는 안 된다. WHERE 절의 컬럼을 변형하면 인덱스를 사용할 수 없기 때문이다. --인덱스 사용불가 WHERE SUBSTR(T1.ORD_YMD,1,6) = '201703'--인덱스 사용 가능 LIKE 조건을 사용WHERE T1.ORD_YMD LIKE '201703%' 실행계획을 잘 살펴보면, ORD_YMD를 SUBSTR한 뒤에 처리하며, INDEX FAST FULL SCAN하고 있다. 이는 인덱스의 리프 블록을 모두 읽어서 필요한 데이터를 찾아내는 방식이다. ORD_YMD를 변형하지 않는 경우 INDEX RANGE SCAN을 사용한다. 1.2 WHERE 조건절 안티 패턴 --..
-
SQL BOOSTER 페이징 기술DataBase/SQL 2024. 7. 11. 13:58
1. 페이징의 종류 페이징은 3가지 종류가 있다. WAS 페이징: 모든 데이터를 가져와 WAS에서 페이징 처리 하는 방법DB 페이징: 데이터베이스에서 페이징에 필요한 만큼의 데이터만 조회 (성능 고려x)DB-INDEX 페이징: 인덱스를 이용해 페이징에 필요한 데이터만 정확히 읽는 방법 (성능 고려 O)이 중 WAS페이징은 사용하면 안 되는 방법이다. DB페이징과 DB-INDEX 페이징은 비슷한 기술이다. SQL 성능을 최적화 했는지에 따라 두 기술을 분류할 수 있다. DB-INDEX 페이징은 상황에 따라서 페이징이 불가능할 때도 있다. (부분 범위 처리 페이징, NO-SORT 페이징) 1.2 DB 페이징 ROWNUM을 이용해 페이징에 필요한 데이터만 골라내는 흔히 사용하는 기법이다. SELECT T..
-
SQL BOOSTER - 분석함수DataBase/SQL 2024. 7. 10. 19:57
1. 분석함수란?테이블의 데이터를 특정 컬럼을 기준으로 행들을 그룹화하여 결과를 조회하는 함수GROUP BY와 함께 사용하는 집계함수와 비슷해 보이지만, 실제로는 조금 다른 기능을 수행한다. 2. OVER절 분석함수에서 분석 대상을 지정하는 역할을 수행한다. 기본 개념은 다음과 같다.분석함수의 분석 대상을 정하는 역할대부분의 분석함수는 OVER절과 함께 사용된다.()안에 아무런 옵션이 없다면, 조회된 결과 전체가 분석 대상이다.2.1 OVER절의 기본 사용법 위 SQL의 결과는 3월 1일의 주문 로우 데이터를 보여주면서, 마지막 컬럼에 주문 총 건수를 추가했다.3월 1일의 총 주문건수는 5개이므로, 모두 5가 나타난다.SELECT T1.ORD_SEQ, T1.CUS_ID, T1.ORD_DT, COUNT(..
-
SQL BOOSTER - 문서번호 처리 기술DataBase/SQL 2024. 7. 9. 22:41
1. SELECT MAX 방식 현업에서는 일자+순번으로 문서번호를 관리할 수도 있으며, 법인+일자+순번 등으로 문서번호를 관리한다.CREATE TABLE T_PO( PO_NO VARCHAR2(40) NOT NULL, TIT VARCHAR2(100) NULL, //...);CREATE UNIQUE INDEX PK_T_PO ON T_PO(PO_NO);ALTER TABLE T_PO ADD CONSTRAINT PK_T_PO PRIMARY KEY(PO_NO) USING INDEX; 구매오더번호의 채번 규칙은 다음과 같다 - PO(고정문자)+YYYYMMDD(요청일자)+NNNNNNNN(순번8자리) DECLARE v_NEW_PO_NO VARCHAR2(40); v_REQ_DT DATE; v_REQ..
-
SQL BOOSTER - 불필요한 트랜잭션의 분리카테고리 없음 2024. 7. 9. 22:23
트랜잭션을 최소화하려면 불필요한 작업을 트랜잭션에서 분리할 필요가 있다.위와 같은 가상의 주문처리 트랜잭션에서 A고객은 주문 완료 문자 발송 작업에서 지연이 발생 (외부 시스템과 연계하는 과정에서 딜레이)A고객은 주문한 재고 데이터에 락을 잡고 있음 -> 트랜잭션을 종료하지 못했으므로 락이 유지B고객은 재고 데이터 변경할 때 대기 상태에 빠지게됨 주문 완료 문자 발송 작업은 주문처리 트랜잭션에 포함할 필요가 없다! 별도의 트랜잭션으로 분리하는 것을 고려해야한다.이처럼 트랜잭션과 주요 연관성이 떨어지는 작업을 분리하면, 트랜잭션의 실행 시간을 줄 일 수 있다.이로 인해 락을 빠르게 해소 할 수 있으며 결과적으로 데이터베이스 동시성을 높일 수 있다.
-
SQL BOOSTER - 트랜잭션DataBase/SQL 2024. 7. 8. 16:40
1. 트랜잭션 트랜잭션은 반드시 한 번에 처리되어야 하는 논리적인 작업 단위다.하나의 트랜잭션은 여러 개의 작업으로 구성될 수 있다. 트랜잭션을 종료하는 명령어에는 COMMIT과 ROLLBACK이 있다. COMMIT은 트랜잭션 과정 중에 변경된 데이터를 모두 반영하고 종료하는 명령어다. 반면에 ROLLBACK은 트랜잭션 과정에서 진행된 데이터를 모두 종료하는 명령어다. 1.1 트랜잭션 COMMIT A계좌에서 B계좌로 500원을 이체하는 트랜잭션 COMMIT 한 경우다.트랜잭션을 COMMIT 했으므로 A계좌와 B계좌의 잔액이 모두 변경되었다. 1.2 트랜잭션 ROLLBACK 계좌이체 트랜잭션을 ROLLBACK 처리한 경우 A계좌에서 차감한 작업이 취소된다. 1.3 COMMIT을 잘 못 사용한 예 COM..