데이터를 가져오는 SELECT문과 FROM절만으로 데이터를 가져오게 되면 흔히 말하는 FTS(Full Table Scan)이 일어납니다. 이 FTS는 모두 SQL 튜닝의 1차 검토대상이 되죠. 그 이유는 디스크의 I/O량이 데이터 크기만큼 커지기 때문에 성능적으로 저하가 일어날 수 있습니다.
그렇기 때문에 WHERE 절에 구체적인 조건문을 통하여 인덱스를 활용해 데이터를 가져오죠. 사실 인덱스를 이용하지 않는다면 FTS가 일어나기 때문에 인덱스를 활용하지 않는 조건문은 FTS를 유발합니다. 그럼 이러한 조건문에서 어떠한 연산자를 통해 데이터를 구별하는지 우선순위부터 알아보겠습니다.
1. 연산자 우선순위
()괄호 -> NOT -> 비교문, SQL비교문 -> AND -> OR
사람들이 가장 많이 실수하는 부분이 OR과 AND부분입니다.
SELECT *FROM TEAM WHERE TEAM_ID = 1 OR TEAM_NAME = 'ONCE RUN' AND TEAM_LOC = '서울';
우선순위를 고려하지 않는다면 다음과 같은 SQL문은 팀이름과 위치를 만족하는 것과 팀 아이디가 1인 행을 가져옵니다.
순서대로 연산자가 사용되길 원했다면 원하는 결과를 가져오지 못할 것입니다. ( 팀 아이디가 1이거나 이름이 ONCE RUN이고 팀 위치가 서울인 팀들만)
우선순위를 원한다면 괄호를 통해 묶어주어야 합니다.
SELECT *FROM TEAM WHERE (TEAM_ID = 1 OR TEAM_NAME = 'ONCE RUN') AND TEAM_LOC = '서울';
2. 연산자 종류
논리연산자는 비교 연산자 또는 SQL 비교 연산자 들로 이루어진 여러 개의 조건들을 논리적으로 연결시키기 위해서 사용되는 연산자라고 생각하면 됩니다.
논리 연산자 : AND, OR , NOT
부정 논리 연산자 : !=, ^=, <> , NOT COLUMN, NOT COLUMN >
비교 연산자 : =, > , < , <= , >=
SQL 연산자 : BETWEEN A AND B, IN(LIST), LIKE, IN NULL
부정 SQL 연산자 NOT BETWEEN a AND b , NOT IN (LIST), IS NOT NULL
3. IN 연산자의 다중 리스트
IN연산자의 다중 리스트는 SQL문을 간단히 줄여줄 수 있으며 성능 측면에서도 잠정을 가질 수 있는 유영한 연산입니다.
간단한 예시를 보면 다음과 같습니다. WHERE (ColumnA , ColumnB) IN ( ('A', 'B'), ('C', 'D') );
이 조건문은 다음과 같습니다.
칼럼A가 'A'값을 가지면서 칼럼 B가 'B'값을 가진 경우이거나, 칼럼 A가 'C'값을 가지면서 칼럼 B가 'D'값을 가진 경우인 경우입니다. 즉 여러 개의 칼럼 값에 일치하는 행을 찾을 경우 사용합니다.
4. LIKE
LIKE은 비교와 같지만 와일드 카드를 사용할 수 있다는 것이 장점입니다. _는 1개의 단일 문자를 의미하며, % 는 0개 이상의 어떤 문자를 의미합니다.
5. IN과 OR은 결과도 같고 내부적으로 처리하는 방법도 같다.
TIP : NULL 값과 비교 연산을 하게 되면 해당 조건은 FALSE가 고정되어 리턴됩니다. NULL은 수치연산자를 통해 NULL과 연산하게 되면 NULL 값을 리턴합니다.
* ROWNUM은 칼럼과 비슷한 성격은 Pseudo Column으로써 SQL 처리 결과 집합이 각 행에 대해 임시로 부여되는 임시번호이며, 원하는 만큼만 행을 가져오고 싶을 때 WHERE 절에서 행의 개수를 제한하는 목적으로 사용합니다.
추가적인 ROWNUM의 용도로는 테이블에 고유한 키나 인덱스값을 만들 수 있습니다.
'Database' 카테고리의 다른 글
내장 함수(BUILT-IN-FUNCTION) - 숫자형 (0) | 2021.04.27 |
---|---|
내장 함수(BUILT-IN-FUNCTION) - 문자형 (0) | 2021.04.27 |
제약조건 (Constraint) (0) | 2021.04.26 |
짧) 인덱스 특성을 통한 DB 성능 향상 (0) | 2021.04.24 |
반정규화와 성능 (0) | 2021.04.24 |
댓글