hoon's bLog

SQLD SQL 기본 및 활용, 최적화 기본원리 본문

IT/SQLD

SQLD SQL 기본 및 활용, 최적화 기본원리

개발한기발자 2023. 3. 7. 11:42
반응형

Table 의 구조

- 열(Column), 필드 (Field,Value), 행 (Row)

- ERD 구성요소: Entity, Relation, Attribute

 

데이터 유형
- NUMERIC : 정수, 실수
- CHARACTER(s)/CHAR(s) : 고정길이

- VARCHAR2(s)/VARCHAR(s) : 가변길이


CHAR vs VARCHR
CHAR 문자열 비교

- 공백(BLANK)을 채워서 비교

- 우선 짧은 쪽의 끝에 공백을 추가하여 2개의 데 이터가 같은 길이가 되도록 함.

- 앞에서부터 한 문자씩 비교

- 끝의 공백만 다른 문자 열은 같다고 판단

VARCHAR 유형

- 시작부터 한 문자씩 비교하고, 공백도 문자로 취급하므로 끝의 공백이 다르면 다른 문자로 판단
ex) CHAR 유형 'AA' = 'AA ',  VARCHAR 유형 'AA' <> 'AA '


DDL(Data Definition Language, 데이터 정의어)

- 데이터 구조를 정의하는데 사용되는 명령어(CREATE, ALTER, DROP, RENAME)

 

테이블 생성 시 주의할 점 : 문자로 반드시 시작, A-Z, a-z, 0-9, _, $, #문자만허용

 

테이블 생성 예시

CREATE TABLE PLAYER (
    PLAYER_ID CHAR(7) NOT NULL,
    PLAYER_NAME VARCHAR(20) NOT NULL,
    TEAM_ID CHAR(3) NOT NULL,
    CONSTRAINT PLAYER_PK PRIMARY KEY (PLAYER_ID)
    CONSTRAINT PLAYER_FK FOREIGN KEY (TEAM_ID) REFERENCES TEAM(TEAM_ID)
);

테이블 구조 확인
Oracle : DESCRIBE 테이블명;

SQL server : exec sp_help 'dbo.테이블명‘

 

제약조건
기본키(PRIMARY KEY)

- 테이블에 존재하는 각 행을 한 가지 의미로 특정할 수 있는 한 개 이상 칼럼

- 기본키제약 = 고유키제약 & NOT NULL 제약
고유키(UNIQUE KEY)

- 고유하게 식별하기 위한 고유키

- NULL 값 가진 행 여러개 있어도 괜찮음

외부키(FOREIGN KEY)

- 다른 테이블의 기본키로 사용되고 있는 관계를 연결하는 칼럼
NULL : 아직 정의되지 않은 미지의 값, 현재 데이터를 입력하지 못하는 경우
DEFAULT : 기본값을 사전에 설정. 데이터 지정하지 않는 경우 사전에 정의된 기본값 자동 입력


SELECT 문장을 통한 테이블 생성 사례
- ORACLE CTAS : CREATE TABLE ~ AS SELECT ~
- SQL SERVER : SELECT * INTO TABLE1FROM TABLE2
- 기존 테이블의 제약조건 중에 NOT NULL만 새로운 복제 테이블에 적용

- 기본키, 고유키, 외래키, CHECK 등의 다른 제약조건은 없어진다.

-- 테이블 변경
ALTER TABLE PLAYER

-- 칼럼 추가
ADD (ADDRESS VARCHAR2(80));

-- 칼럼 삭제
ALTER TABLE PLAYER DROP COLUMN ADDRESS;

-- Oracle 칼럼수정
ALTER TABLE PLAYER MODIFY (ADDRESS VARCHAR2(80));

-- SQL 칼럼수정
ALTER TABLE PLAYER ALTER COLUMN ADDRESS VARCHAR2(80);

--Oracle 칼럼이름 변경
ALTER TABLE PLAYER RENAME COLUMN ADDRESS TO ADD

ALTER TABLE PLAYER DROP CONSTRAINT 제약조건명;

ALTER TABLE PLAYER ADD CONSTRAINT 제약조건명 제약조건 (칼럼명);

-- Oracle
RENAME 변경전 테이블명 TO 변경후 테이블명;

-- sql server
sp_rename 변경전 테이블명, 변경후 테이블명;

-- 테이블과 관계 있었던 참조 제약조건도 삭제
DROP TABLE PLAYER [CASCADE CONSTRAINT]; 

-- 테이블 구조 유지한체 데이터만 전부 삭제
TRUNCATE TABLE PLAYER ;

DML(Data Manipulation Language, 데이터 조작어)

- 자료들을 입력, 수정, 삭제, 조회

- SELECT, INSERT, UPDATE, DELETE
- 실시간으로 테이블에 영향 미치지 않는다.
- COMMIT 이용해 TRANSACTION 종료해야 실제 테이블에 반영

- TRUNCATE : 삭제된 로그 없으므로 ROLLBACK 불가능, 시스템부하 적음)

- ALL 이 Default 값, DISTINCT : 중복된 데이터 1건으로 처리해서 출력
- SELECT 에서 좌측 정렬(문자 및 날짜 데이터), 우측 정렬(숫자 데이터) 임
- WILDCARD. 해당 테이블의 모든 칼럼 정보 보고 싶을 때, *(애스터리스크) 이용

- Alias 특징 : 컬럼명 바로 뒤에 위치, AS, as 키워드 사용가능, 이중 인용부호로 공백, 특수문자 포 함 가능
합성 연산자 : || → oracle / + = → SQL Server 

TCL(Transaction Control Language, 트랜잭션 제어어)

- COMMIT, ROLLBACK
- DML에 의해 조작된 결과를 작업단위(트랜잭션) 별로 제어하는 명령어 잠금(LOCKING)

- 데이터 무결성 보장

- 영구적인 변경 하기 전 테이터 변경사항 확인 가능

- 논리적 연관된 작업 그룹 핑하여 처리가능

- (Commit : Oracle 은 Not Auto Commit, SQL Server 는 Auto Commit 이 Default 임)

 

트랜잭션의 특성
원자성 : 트랜잭션 정의된 연산들 모두 성공적으로 실행 OR 전혀 실행되지 않은 상태로 남아 있어야 함.(all or nothing)
일관성 : 트랜잭션 실행 전 데이터베이스 내용 잘못되어 있지 않다면 트랜잭션 실행 이후에도 데이 터베이스 내용 잘못 있으면 안된다.
고립성 : 트랜잭션 실행 도중 다른 트랜잭션의 영향 받아 잘못된 결과 만들어서는 안된다.

지속성 : 트랜잭션 성공적으로 수행되면 갱신한 데이터베이스 내용 영구적으로 저장된다.

SQL Server트랜잭션 3가지 방식
AUTO COMMIT : 명령어 성공적으로 수행 → 자동으로 COMMIT, 오류 발생 → ROLLBACK
암시적 트랜잭션 : Oracle과 같은 방식. 트랜잭션의 끝을 사용자가 명시적으로 COMMIT, ROLLBACK으로 처리
명시적 트랜잭션 : 트랜잭션 시작과 끝을 모두 사용자가 지정


BEGIN TRANSACTION(BEGIN TRAN)으로 트랜잭션시작
- SAVEPOINT 의 이해가 필요 (Rollback 과 Savepoint 의 그림 이해)

--Oracle
SAVEPOINT 저장점명; ROLLBACK TO 저장점명;

--SQL Sever
SAVE TRANSACTION 저장점명; ROLLBACK TRANSACTION 저장점명;

WHERE절에 사용되는 연산자의 종류
- 비교 연산자 : =, >, >=, <, <=
- SQL 연산자 : BETWEEN A AND B, IN(LIST), LIKE '비교문자열', IS NULL
- 논리 연산자 : AND, OR, NOT
- 부정연산자 : !=, ^= , <> (같지 않다), NOT BETWEEN a AND b, NOT IN( a, b, .... ), IS NOT NULL
- 연산자 우선순위 : () -> NOT 연산자 → 비교, SQL비교연산자 → AND ->OR
- BETWEEN A AND B : A, B 모두를 포함하는 범위를 의미, IN(LIST) 리스트 값 중 어느 하나라도 일치하면 됨
- LIKE '비교문자열' : 비교문자열과 형태 일치하면 된다.
- Like 시 사용하는 와일드 카드의 의미 : %(0개 이상 어떤 문자) ,_ (1개인 단일 문자 의미)

 

내장함수
단일행 : 문자형 함수, 숫자형 함수, 날짜형 함수, 변환형 함수, NULL 관련 함수

- 문자형 함수 : LOWER, UPPER, SUBSTR / SUBSTRING, LENGTH / LEN, LTRIM, RTRIM, TRIM, ASCII, CONCAT
- 숫자형 함수 : ABS, MOD, ROUND, TRUNC, SIGN, CHR / CHAR, CEIL / CEILING, FLOOR, EXP, LOG, LN, POWER, SIN, COS, TAN

- 변환형 함수 : 암시적 데이터 유형 변환 (문자가 숫자로 변형됨)

- NULL 관련 함수 : NVL / ISNULL, NULLIF, COALESCE

다중행 : 집계함수, 그룹함수, 윈도우함수

CEIL / CEILING() VS FLOOR()
- CEIL / CEILING() : 숫자보다 크거나 같은 최소 정수를 리턴
ex) CEIL(38.123) / CEILING(38.123) 39 CEILING(-38.123) 38 2) FLOOR() : 숫자보다 작거나 같은 최대 정수를 리턴
ex) FLOOR(38.123) 38 FLOOR(-38.123)  -39

단일행 Null 관련 함수
- NVL(표현식1,표현식2) / ISNULL(표현식1,표현식2)
- 표현식1값이 NULL이면 표현식2값 출력

- NVL(NULL판단대상, ‘NULL일 때 대체값’)
- NULLIF(표현식1,표현식2) : 표현식1값이 표현식2와 같으면 NULL, 같지 않으면 표현식1값 출력
- COALESCE(표현식1, 표현식2, ...) : 임의의 표현식에서 NULL이 아닌 최초 표현식을 나타냄, 모든 식이 NULL이라면 NULL값 리턴

집계함수

- SELECT , HAVING, ORDER BY절에 사용 할 수 있다

- COUNT(*) : NULL 값을 포함한 행의 수
- COUNT(표현식) : 표현식의 값이 NULL 값인 것을 제외한 행의 수

- SUM() : NULL 값을 제외한 합계
- AVG() : NULL 값을 제외한 평균
- MAX() : 최대값 출력 MIN() :최소값 출력
※ 조건절에 해당하는 데이터가 없을 때 COUNT(*)의 결과 값은 0


GROUP BY 절, HAVING절 특징
- GROUP BY 절에서는 ALIAS명을 사용할 수 없다.
- WHERE 절은 전체 데이터를 GROUP으로 나누기 전에 행들을 미리 제거시킨다.
- HAVING 절은 일반적으로 GROUP BY 절 뒤에 위치한다.
- GROUP BY, HAVING 절에는 SELECT 절에 정의되지 않은 컬럼은 사용 못함
- 집계함수 WHERE절에 올 수 없다. GROUP BY 통해 소그룹별 기준 정한 후, SELECT절에서 집 계함수 사용
※ ORDER BY 절을 SELECT 절에 정의되지 않은 컬럼 사용 가능
- Order by 특징 기본적인 정렬순서는 오름차순 (ASC)이다. cf. 내림차순(DESC)
 - Oracle : NULL 가장 큰 값으로 간주. 오름차순→ 가장 마지막 / 내림차순 → 가장 먼저

- SQL Server -NULL 가장 작은 값. 오름차순 →가장 먼저, 내림차순 → 가장 마지막 위치 ORDER BY 절에서는 칼럼명, ALIAS명, 칼럼순서 같이 혼용해서 사용 가능

 

SELECT 문장 실행 순서
FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY

SELECT POSITION 포지션, ROUND(AVG(HEIGHT),2) 평균키
FROM PLAYER
GROUP BY POSITION
HAVING MAX(HEIGHT) >= 190
ORDER BY 1, 평균키 ;

ROWNUM : WHERE 절에서 행의 개수를 제한하는 목적으로 사용
한 행만 가져오고 싶을 때
WHERE ROWNUM = 1; WHERE ROWNUM <= 1; WHERE ROWNUM < 2;
두건 이상의 N행을 가져오고 싶을 때
WHERE ROWNUM = N; (X) WHERE ROWNUM <= N; (O) WHERE ROWNUM < N+1; (O)
c.f) sql server
SELECT TOP(2) WITH TIES ENAME, SAL
(1위 한명, 공동2위가 2명있을 때 with ties 조건 추가하면 결과 3건 출력됨. with ties 없으면 결과 2건 출력됨)

 

JOIN
- Equal Join , Non Equal Join → 두개 이상의 테이블에서 컬럼을 가져오는 방법

- EQUI JOIN(등가 조인) : where 절에 join 조건 “=”연산자 사용해서 표현
- INNER JOIN 참여하는 대상 테이블이 N개, 필요한 JOIN 조건은 N-1개
- NON EQUI JOIN(비등가 조인) : BETWEEN, >, >=, <, <= 등의 연산자 사용, 일반 집합연산자와 현재의 SQL비교
- UNION연산(UNION 기능으로), INTERSECTION연산(INTERSECT 기능으로), DIFFERENCE연산(EXCEPT,MINUS기능으로), PRODUCT연산(CROSS JOIN기능으로)


순수 관계 연산자와 현재의 SQL비교
- Select (Where 절로 구현) , Project (Select 로 구현)
- Natural Join(다양한 join기능으로구현), Divide (사용하지 않음)

Ansi SQL 의 Join

- Inner Join (Natural Join, Using 조건절, On 조건절) , Cross Join, Outer Join
- INNER JOIN : JOIN조건을 FROM절에서 정의. USING 조건절, ON 조건절 필수적
- NATURAL JOIN : 두 테이블 간 동일한 이름을 값는 모든 컬럼에 대해 Equal Join 수행(Using, ON 절 정의 X, SQL Server 지원 X)
- JON에 사용된 컬럼들은 같은 데이터 유형이어야 하며, ALIAS나 테이블명과 같은 접두사를 붙일 수 없다.
- NATURAL JOIN은 JOIN에 사용된 같은 이름의 칼럼을 하나로 처리, INNER JOIN의 경우는 2개의 칼럼으로 표시

- USING 조건절 : 같은 이름을 가진 컬럼들 중에서 원하는 컬럼에 대해서만 선택적으로 EQUI JOIN 가능
ex). SELECT * FROM DEPT JOIN DEPT_TEMP USING (DEPTNO);
※ JOIN 칼럼에 대해서는 ALIAS나 테이블 이름과 같은 접두사를 붙일 수 없다.
- ON 조건절 : 두 테이블 간 특정 칼럼으로 Equal Join 수행, 칼럼명 다르더라도 JOIN조건 사용할 수 있는 장점 가짐

(ON 조건절 사용시 and 조건 추가 가능, where 절과 의미 구분 필요)
- CROSS JOIN : 두 테이블의 Cartesian Product 임 (곱 조인) M*N건 조합 발생
- OUTER JOIN : Left (Right) Outer Join, Full Outer Join FROM EMP E RIGHT JOIN DEPT D
 
집합 연산자
- UNION ALL을 제외한 모든 집합 연산자는 Sorting 을 수행함
- UNION : 여러개의 SQL의 결과에 대한 합집합으로 결과에서 모든 중복된 행을 하나의 행으로 만든다.
- UNION ALL : 중복된 행도 그대로 결과에 표시
- EXCEPT/MINUS (차집합) → NOT EXISTS, NOT IN 서브쿼리로 변경가능

- INTERSECT (교집합) → EXISTS, IN 서브쿼리로 변경 가능

- START WITH 절은 계층구조 전개이 시작 위치를 지정하는 구문이다.
- CONNECT BY 절은 다음에 전개될 자식 데이터를 지정하는 구문이다.
-) 루트 데이터는 LEVEL 1이다. (0이 아님)
- PRIOR 자식 = 부모 (부모→자식 방향으로 전개. 순방향 전개)

- PRIOR 부모 = 자식 (자식→부모 방향으로 전개. 역방향 전개)

 

- 셀프조인 : 동일 테이블 사이의 조인

- 서브쿼리 ( 하나의 SQL문안에 포함되어 있는 또 다른 SQL문)
- 서브쿼리는 메인커리의 칼럼을 모두 사용할 수 있지만 메인쿼리는 서브쿼리의 칼럼을 사용할 수 없다.

- 질의 결과에 서브쿼리의 칼럼을 표시해야 한다면 조인방식으로 변환하거나 함수, 칼라 서브 쿼리 등을 사용해야 한다.
- 서브쿼리는 서브쿼리 레벨과 상관없이 항상 메인쿼리 레벨로 결과집합이 생성
- 예를들어, 메인쿼리로 조직(1), 서브쿼리로 사원(M) 테이블을 사용하면 결과집합은 조직(1) 레벨이 된다.
- 서브쿼리에서는 ORDER BY 절을 사용하지 못한다.

- ORDER BY 절은 SELECT 절에서 오직 한 개만 올 수 있기 때문에 ORDER BY 절은 메인쿼리의 마지막 문장에 위치!
- 반환되는 데이터의 형태에 따른 서브쿼리 분류 : 단일 행 서브쿼리, 다중 행 서브쿼리, 다중칼럼

단일행 서브쿼리
- 서브쿼리가 단일행 비교 연산자 (=, <, <=, >, >=, <>)와 함께 사용할 때는 서브쿼리의 결과건수 가 반드시 1건 이하이어야 한다.
다중행 서브쿼리
- 서브쿼리의 결과가 2건 이상 반환될 수 있다면 반드시 다중행 비교연산자 (IN, ALL, ANY, SOME) 와 함께 사용
ex) IN (서브쿼리), ALL(서브쿼리), ANY(서브쿼리), EXISTS(서브쿼리)
다중칼럼 서브쿼리
서브쿼리의 결과로 여러개의 칼럼이 반환되어 메인쿼리의 조건과 동시에 비교되는 것을 의미
ex) WHERE (TEAM_ID, HEIGHT) IN (SELECT TEAM_ID, MIN(HEIGHT) FROM PLAYER GROUP BY TEAM_ID)
동작 방식에 따른 서브쿼리 분류
- 비연관 서브쿼리 : 서브쿼리가 메인쿼리 칼럼을 가지고 있지 않는 형태
- 연관 서브쿼리 : 서브쿼리가 메인쿼리 칼럼을 가지고 있는 형태
- EXISTS : 서브쿼리는 항상 연관 서브쿼리로 사용된다. 또한 조건 충족건이 여러건이라도 조건을 충족하는 1건만 찾으면 추가적인 검색 진행 X
그 밖의 위치에서 사용하는 서브쿼리
- SELECT절에 서브쿼리 : 스칼라 서브쿼리 ( 한 행, 한 칼럼만을 반환하는 서브쿼리)
- FROM절에 서브쿼리 : 인라인 뷰(Inline Veiw)
- HAVING 절에 서브쿼리 사용, UPDATE문의 SET절에 서브쿼리 사용, INSERT문의 VALUES절에 서 브쿼리 사용.
뷰(실제 데이터 가지고 있지 않는 가상테이블)의 장점 독립성, 편리성, 보안성
그룹함수
- ROLLUP : 인수 계층구조. 인수순서 바뀌면 수행 결과도 바뀌게 된다, 칼럼 수=n → N+1 LEVEL의 Subtotal이 생성
- ROLLUP이나 CUBE에 의한 소계가 계산된 결과에는 GROUPING(EXPR) = 1, 그렇지 않으면 GROUPING(EXPR)=0
-  CUBE : 결합 가능한 모든 값에 대하여 다차원 집계 생성. 인수들 간 평등한 관계. 순서 바뀌어도 상관 없음. 2의 N승 LEVEL의 Subtotal 생성.
- GROUPING SETS : 인수들에 대한 개별 집계. 평등한 관계 → 인수의 순서 바뀌어도 결과 같다. 
   
윈도우함수
그룹 내 순위(RANK) 관련 함수 : RANK, DENSE_RANK, ROW_NUMBER
 - RANK : 특정 항목(칼럼)에 대한 순위를 구하는 함수. 동일한 값에 대해서는 동일한 순위.

 - DENSE_RANK : 동일한 순위를 하나의 건수로 취급
 - ROW_NUMBER : 동일한 값이라도 고유한 순위를 부여
 - 그룹 내 집계(AGGREGATE) 관련 함수 : SUM ,MAX, MIN, AVG, COUNT
(c.f SQL Server의 경우 집계 함수는 뒤에서 설명할 OVER 절의 내의 ORDER BY 지원 하지 않음)
 - RANGE UNBOUNDED PRECEDING : 현재 행 기준으로 파티션 내의 첫 번째 행까지의 범위 지정
 - ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING : 현재 행을 기준으로 파티션 내에서 앞의 한건, 현재 행, 뒤의 한 건을 범위로 지정 . ROWS 는 현재 행의 앞뒤 ROWS 를 말함
 - RANGE BETWEEN 50 PRECEDING AND 150 FOLLOWING : 현재 행(Row)의 급여값을 기준으로 급여가 -50 에서 +150 의 범위 내에 포함된 모든 행이 대상. RANGE 는 현재 행의 데이터 값을 기준으로 앞뒤 데이터 값의 범위를 표시

그룹 내 행 순서 관련 함수 : FIRST_VALUE, LAST_VALUE, LAG, LEAD 함수 (ORACLE 에서만 지원)
- FIRST_VALUE : 파티션별 윈도우에서 가장 먼저 나온 값 구함, 다른 함수와 달리 공동 등수를 인정하지 않고 처음 나온 행만을 처리
- ROWS UNBOUNDED PRECEDING : 현재 행 기준으로 파티션 내의 첫 번째 행까지의 범위를 지정
- LAST_VALUE : 파티션별 윈도우에서 가장 나중에 나온 값을 구한다. 공동 등수를 인정하지 않음.

- ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING : 현재 행을 포함해서 파티 션 내의 마지막 행까지의 범위 지정
- LAG : 파티션별 윈도우에서 이전 몇 번째 행의 값을 가져 올 수 있다.
- LEAD : 파티션별 윈도우에서 이후 몇 번째 행의 값을 가져 올 수 있다.
그룹 내 비율 관련 함수 : CUME_DIST, PERCENT_RANK, RATIO_TO_REPORT, NTILE 칼럼 값에 대한 백분율 → RATIO_TO_REPORT
- 파티션 내 전체 SUM(칼럼) 값에 대한 행별 칼럼 값의 백분율을 소수점으로 구함
- 행의 순서에 대한 (0부터 1사이 값) 백분율 → PERCENT_RANK
- 파티션별 윈도우에서 제일 먼저 나오는 것을 0으로, 제일 늦게 나오는 것으로 1로하여 값이 아닌 행의 순서별 백분율을 구함
1/(파티션)전체 건수로 표현하는 백분율 → CUME_DIST
- 파티션별 윈도우에서 전체건수에 현재 행보다 작거나 같은 건수에 대한 누적백분율 구함
- 파티션별 전체 건수를 ARGUMENT 값으로 N 등분한 결과 구함 → NTILE


DCL(Data Cnotrol Language, 데이터 제어어)

- 저를 생성하고 권한을 제어할 수 있는 명령어 대부분의 데이터베이스는 데이터 보호와 보안을 위해서 유저와 권한을 관리
- 개별 오브젝트에 대한 작업을 위해서는 오브젝트 권한 부여 필요
- ROLE : 유저와 권한들 사이에서 중개 역할
- ROLE 을 생성하고, ROLE 에 각종 권한들을 부여한 후, ROLE 을 다른 ROLE 혹은 유저에 부여 ROLE 을 만들어 사용하는 것이 권한을 직접 부여하는 것보다 빠르고 안전하게 관리 가능
- 절차형 SQL 이용하여 SQL문의 연속적인 실행이나 조건에 따른 분기처리를 이용하여 특정 기능을 수행하는 저장모듈인 PROCEDURE, - TRIGGER, USER DEFINED FUNCTION을 만들 수 있다. T-SQL : SQL Server를 제어하기 위한 언어
- USER DEFINED FUNCTION : PROCEDURE 처럼 절차형 SQL을 로직과 함께 데이터베이스 내에 저장해 놓은 명령문의 집합을 의미. - PROCEDURE과 달리 RETURN 사용해서 하나의 값을 반드시 되 돌려주어야 한다.
- TRIGGER : 특정한 테이블에 INSERT,UPDATE,DELETE 와 같은 DML 문이 수행되었을 때, 데이터 베이스에서 자동으로 동작하도록 작성한 프로그램
- 사용자가 직접 호출하여 사용하는 것이 아니고 데이터베이스에서 자동적으로 수행
- 이벤트 발생 대상 : 테이블, 뷰, 데이터베이스
- 발생 범위 : 전체트랜잭션 작업, 각 행에 대해서 발생
 
옵티마이저
- 규칙기반 옵티마이저 : 우선순위가 높은 규칙이 적은 일량으로 해당작업을 수행하는 방법

- 규칙기반 옵티마이저는 적절한 인덱스가 존재하면 항상 인덱스를 사용하려고 한다.

- 비용기반 옵티마이저 : SQL문을 처리하는데 필요한 비용이 가장 적은 실행계획을 선택하는 방식

- SQL 수행시 소요되는 비용을 계산하여 실행계획을 생성하므로 인덱스가 존재해도, 전체 테이블 스캔이 유리하다고 판단할 수도 있다.


실행계획

- SQL에서 요구한 사항을 처리하기 위한 절차와 방법을 의미
- 실행계획을 구성하는 요소에는 조인순서(Join Order), 조인기법(Join Method), 엑세스 기법(Access Method), 최적화 정보(Optimization Information), 연산(Operation) 등이 있다.
- SQL처리흐름도 : 실행계획을 시각화한 도표, SQL 처리 흐름도를 보고 실행 시간을 알 수는 없다.
- ORACLE의 INDEX 액세스 기법의 종류
- INDEX UNIQU SCAN, INDEX RANGE SCAN, INDEX RANGE SCAN DESCNDING, INDEX FULL SCAN, FAST FULL INDEX SCAN, INDEX SKIP SCAN

 

인덱스
- 기본 인덱스 : UNIQUE & NOT NULL 제약조건을 갖는다.
- 보조 인덱스 : UNIQUE 인덱스가 아니라면 중복 데이터 입력이 가능
- 자주 변경되는 속성을 인덱스로 선정할 경우 UPDATE, DELETE 성능에 악양향을 주므로 인덱스 후보에 적합하지 않다.
- 인덱스 범위 스캔은 결과가 없으면 한 건도 반환하지 않을 수 있다.
- 인덱스를 생성할 때 정렬 순서를 내림차순으로 하면 내림차순으로 정렬된다.
- 인덱스 액세스는 테이블 전체 스캔보다 항상 유리하지 않다.
- 인덱스의 목적은 조회 성능 최적화이다.

여러 인덱스
- B-TREE 인덱스 : 브랜치 블록과 리프 블록으로 구성, 일치 및 범위 검색에 적합한 구조이다.
- CLUSTERED 인덱스 : 리프 페이지가 곧 데이터 페이지
- BITMAP 인덱스 : 포인터를 저장

728x90
반응형

'IT > SQLD' 카테고리의 다른 글

SQLD 데이터 모델과 성능  (1) 2023.03.01
SQLD 데이터 모델링의 이해  (2) 2023.02.28