PL/SQL 11

SQL 튜닝 - 튜닝 활용

1. CASE 함수 IF-THEN-ELSE 논리와 유사한 방식으로 표현식을 해독한다. * 일반 프로그램 IF SAL > 2000 THEN REVISED_SALARY = SAL ELSE REVIESD_SALARY = 2000 END IF * CASE 문 SELECT JOB, CASE WHEN SAL>2000 THEN SAL ELSE 2000 END as REVISED_SALARY FROM EMP; 2. SUM(DECODE) 모델링의 제1정규화로 인해 반복되는 칼럼의 경우 구분 칼럼을 두고 여러 개의 레코드로 만들어진 집합을 정해진 칼럼 수만큼 확장해서 사용하는 기법 * 부서별로 월별 입사자의 평균 급여 구하기 SELECT DEPTNO, AVG(DECODE(MONTH, 1, SAL)) M01, AVG(DEC..

프로그래밍 2021.10.06

SQL 튜닝 - JOIN(2)

6. SET OPERATOR * SET 연산자 수행 - UNION의 경우 합치고 중복된 결과 중 중첩된 라인을 단일화하기 위해 UNIQUE 정렬을 실행한다. - UNION ALL의 경우 단일화와 정렬을 수행하지 않아 성능이 좋다. - 모든 SET 연산자의 실행 우선 순위는 동일하다. - SET 연산자에 의해서 조회되는 문자형 결과의 자료형은 두 질의문에서 모두 문자형이 조회된다면 문자형으로 출력되고, 두 질의문 혹은 하나의 질의문에서 가변 문자형이 사용되면 가변 문자형으로 출력된다. * SET 연산자 장단점 - 두 질의문의 결과를 대상으로 수학적인 개념의 집합 연산을 수행할 수 있게 한다. - UNION ALL은 칼럼 개수와 자료형만 동일하면 N개의 질의문을 결합할 수 있는 수단이 된다. - INTERS..

프로그래밍 2021.10.05

SQL 튜닝 - JOIN(1)

1. Nested Loop Join - 정의: 2개 이상의 테이블에서 하나의 테이블을 기준으로 순차적으로 상대방 테이블의 Row를 결합하여 원하는 결과를 추출하는 테이블 연결 방식 - 성능: Driving Table의 Row를 어느 정도 줄일 수 있는가에 따라 NL 조인의 성능이 결정된다. - 사용 케이스: 조인된 결과가 두 테이블의 카테시안 곱에 비해 10~15% 이하라면, 인덱스에 의한 조인에서 발생하는 랜덤 액세스의 오버헤드가 전체 테이블을 검색하는 비용보다 적게 되어 조인이 더 효율적으로 된다. - NL 조인에서의 튜닝: 드라이빙 테이블을 선정하는 기준과 드리븐 테이블에 사용된 적절한 인덱스의 선정 cf) Unique 인덱스 -> Index Unique Scan Non-Unique 인덱스 -> I..

프로그래밍 2021.09.30

SQL 튜닝 - INDEX

* 목적: DB의 객체로써 조회의 속도를 빠르게 하기 위해 사용. 단, 오라클의 경우 인덱스를 생성할 수 있는 수의 제한은 없지만, 너무 많은 인덱스를 제작할 경우 SQL문의 실행 속도가 떨어질 수 있다. * 인덱스는 그 대상인 테이블과느 별도의 형태로 독립적인 저장 공간을 가지고 존재한다. 1. B*TREE INDEX * 구조 https://ko.wikipedia.org/wiki/B_%ED%8A%B8%EB%A6%AC#%EC%82%BD%EC%9E%85 B 트리 - 위키백과, 우리 모두의 백과사전 전산학에서 B-트리(B-tree)는 데이터베이스와 파일 시스템에서 널리 사용되는 트리 자료구조의 일종으로, 이진 트리를 확장해 하나의 노드가 가질 수 있는 자식 노드의 최대 숫자가 2보다 큰 트리 ko.wikip..

프로그래밍 2021.09.30

SQL 튜닝 - 실행계획, 옵티마이저, 튜닝 절차

※ 튜닝의 전제조건: 최대한 하나의 SQL문으로 처리하고, 동일 데이터를 중복해서 읽지 않는 것 1. 실행계획 * 실행 계획(Execution Plan): 사용자가 작성한 SQL이 요구한 데이터를 추출하기 위해 옵티마이저가 작업의 방법과 순서를 결정하는 것 1) EXPLAIN PLAN SQL문장을 해석하고 실행계획을 수립하여 실행계획 테이블에 저장해주는 명령(PLAN 테이블이 만들어져 있어야 함) (예시) EXPLAIN PLAN INTO PLAN_TABLE FOR SELECT A.ENAME, A.DEPTNO, B.DNAME FROM EMP A, DEPT B WHERE A.DEPTNO = B.DEPTNO; SELECT LPAD(' ', 2*(LEVEL-1))||OPERATION AS OPERATION, N..

프로그래밍 2021.09.29

Oracle PL/SQL - Trigger

* 사용 예시 - 한 테이블에 변경이 발생하면 동시에 다른 테이블들에 변경을 가한다. - 데이터의 변경이 데이터베이스에 저장되기 전에 값을 검증하고 필요시 다른 값으로 변경한다. - 조건 판단에 따라서 이벤트의 발생을 허용하거나 차단한다. - 발생한 이벤트에 대한 로그를 남긴다. - 자동으로 계산 칼럼의 값을 생성한다. - 뷰에 대한 DML문 수행 시 다른 테이블을 변경한다. - 제약 조건으로 생성할 수 없는 복잡한 업무 규칙을 적용하여 데이터의 무결성을 보장한다. - 분산 DB 환경에서 부모, 자식 테이블 간의 참조 무결성을 보장한다. 1. 선언 CREATE OR REPLACE TRIGGER 트리거명 발생시점 DML이벤트 [ OF 칼럼명 ] ON 테이블 또는 뷰 참조절 FOR EACH ROW WHEN ..

프로그래밍 2021.09.28

Oracle PL/SQL - Stored Subprogram

1. 종류 종류 설명 독립형 저장 서브프로그램 함수 결괏값을 반환함 프로시저 결괏값을 반환하지 않음 패키지 타입, 상수, 변수, 예외, 커서 , 서브프로그램 등을 묶어서 모듈화한 저장 서브프로그램 트리거 특정 이벤트 발생 시 자동적으로 호출되는 서브프로그램 객체 타입 관계형 DB에서 객체 지향 프로그래밍을 가능하게 하는 저장 서브프로그램(ADT(Abstract Data Type), 사용자 정의 타입) 2. 컴파일 * 오류 조회 CREATE OR REPLACE FUNCTION get_wage(a_empno NUMBER) RETURN MUMBER IS v_wage NUMBER; BEGIN SELECT sal + NVL(comm, 0) comm INTO v_wage FROM emp WHERE empno = a..

프로그래밍 2021.09.28

Oracle PL/SQL - 동적 SQL

동적 SQL 사용 방법 실행 중 변경 가능한 문자열 변수 또는 문자열 상수로 제공된 SQL문을 실행 사용 예 EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM emp' INTO v_cnt; 사용 가능한 SQL 모든 SQL문(DML, TCL, DDL, DCL) 장점 - 사전에 정의되지 않은 SQL을 실행 시에 확정하여 실행할 수 있다. - DML과 TCL외에도 DDL, DCL을 사용할 수 있다. 단점 프로그램을 작성하기가 복잡하다. 용도 - SQL이 몇 개 문장으로 고정될 수 없는 경우 - SQL이 실행될지 예측할 수 없는 경우 * 실행 방법 1. EXECUTE IMMEDIATE문을 사용하여 SQL을 실행하는 방법 2. 커서 변수를 사용하여 OPEN, FETCH, CLOSE문으로 SE..

프로그래밍 2021.09.24

Oracle PL/SQL - Cursor

1. 정의 * DB 서버의 SGA(System Global Area)에 저장되어 있는 특정 쿼리를 실행하기 위한 정보를 저장하는 PGA(Program Global Area) 내부의 Private SQL Area에 대한 포인터 2. 묵시적 커서와 명시적 커서 묵시적 커서(Implicit Cursor) 명시적 커서(Explicit Cursor) 커서 선언 없음 있음 사용 시 복잡도 단순 복잡 커서 제어 불가능 가능 유연성 낮음 높음 사용 가능한 SQL 유형 SELECT, INSERT, UPDATE, DELETE, MERGE SELECT 커서 속성 참조 SQL%커서속성 커서명%커서속성 전형적인 사용 방법 즉시 실행 OPEN, FETCH, CLOSE 3. 명시적 커서 * 명시적 커서는 DECLARE절에 CURS..

프로그래밍 2021.09.24

Oracle PL/SQL - Record

* 레코드를 사용하면 데이터 타입이나 길이가 다른 여러 변수들을 논리적으로 하나의 그룹으로 묶을 수 있다. 1. 선언 TYPE 타입명 IS RECORD 필드목록; 레코드변수명 타입명; 필드목록은 레코드의 필드 목록을 선언하는 부분으로, 형식은 CREATE TABLE문의 칼럼 선언가 유사한 형태를 가진다. (예시) DECLARE TYPE emp_type IS RECORD( empno NUMBER(4) NOT NULL := 0, ename emp.ename%TYPE, job VARCHAR2(9) ); v_emp emp_type; BEGIN v_emp.empno := 9000; v_emp.ename := '홍길동'; v_emp.job := '의적'; DBMS_OUTPUT.PUT_LINE('EMPNO = '||..

프로그래밍 2021.09.23