728x90
반응형
1. 인덱스 컬럼의 변형
FULL SCAN
-- 인덱스 컬럼의 변형 (인덱스 컬럼과 검색 조건 컬럼이 다른 데이터 형식)
CREATE TABLE ExampleTable (
ID INT PRIMARY KEY,
Name VARCHAR(50)
)
-- 인덱스 컬럼은 Name이지만 검색 조건에서 변형된 데이터 형식 사용
SELECT * FROM ExampleTable WHERE UPPER(Name) = 'JOHN'
2. 데이터 형 변환이 일어난 경우
FULL SCAN
-- 데이터 형 변환이 일어난 경우 (인덱스 컬럼과 검색 조건 컬럼의 데이터 형식이 다름)
CREATE TABLE ExampleTable (
ID INT PRIMARY KEY,
Age INT
)
-- 인덱스 컬럼은 INT이지만 검색 조건에서 문자열로 변환
SELECT * FROM ExampleTable WHERE Age = '30'
3. where 조건절에 null 또는 not null을 사용하는 경우
FULL SCAN
-- WHERE 조건절에 NULL 또는 NOT NULL을 사용하는 경우
CREATE TABLE ExampleTable (
ID INT PRIMARY KEY,
Name VARCHAR(50) NULL
)
-- NULL 여부를 검사 (인덱스 사용이 제한될 수 있음)
SELECT * FROM ExampleTable WHERE Name IS NULL
4. 부정형으로 조건을 사용한 경우
FULL SCAN
-- 부정형으로 조건을 사용한 경우 (!= 연산자 사용)
CREATE TABLE ExampleTable (
ID INT PRIMARY KEY,
Status VARCHAR(20)
)
-- != 연산자를 사용하여 조건을 부정
SELECT * FROM ExampleTable WHERE Status != 'Inactive'
5. LIKE 연산자에서 %가 앞쪽에서 사용될 경우
FULL SCAN
-- LIKE 연산자에서 %가 앞쪽에서 사용된 경우 (앞쪽의 와일드카드 사용)
CREATE TABLE ExampleTable (
ID INT PRIMARY KEY,
Title VARCHAR(100)
)
-- %가 앞쪽에 있어서 인덱스 사용이 제한될 수 있음
SELECT * FROM ExampleTable WHERE Title LIKE '%keyword'
6. NOT 또는 IN 연산자 사용(NOT에 사용된 값이 아닌 데이터의 비율이 높은 경우, IN에 포함된 데이터들의 비율이 높은 경우)
FULL SCAN할 가능성이 높음
-- NOT 또는 IN 연산자 사용 (비정상적으로 많은 결과를 반환하는 경우)
CREATE TABLE ExampleTable (
ID INT PRIMARY KEY,
Category VARCHAR(50)
)
-- IN 연산자를 사용하여 많은 결과를 반환
SELECT * FROM ExampleTable WHERE Category IN ('A', 'B', 'C', ...)
-- NOT을 사용하여 많은 결과를 반환
SELECT * FROM ExampleTable WHERE NOT Category = 'D'
7. OR 조건을 사용하는 경우
FULL SCAN
-- OR 조건을 사용하는 경우
CREATE TABLE ExampleTable (
ID INT PRIMARY KEY,
Age INT
)
-- OR 조건으로 여러 옵션을 검색
SELECT * FROM ExampleTable WHERE Age = 25 OR Age = 30
8. 복합 인덱스의 순서를 정확하게 사용하지 않은 경우
FULL SCAN
-- 복합 인덱스에서는 인덱스의 순서가 중요하다.
CREATE TABLE ExampleTable (
ID INT PRIMARY KEY,
Age INT,
Category VARCHAR(50)
);
-- 복합 인덱스 생성 (Age, Category 순서로)
CREATE INDEX idx_test ON ExampleTable (Age, Category);
-- 인덱스를 타지 않는 예제
SELECT * FROM ExampleTable WHERE Category = 'A' AND Age = 25;
-- 인덱스를 타는 예제
SELECT * FROM ExampleTable WHERE Age = 25 AND Category = 'A';
9. 인덱스가 2개 이상 있을 경우(OR 조건)
FULL SCAN할 가능성이 높음
-- 예제 테이블 생성
CREATE TABLE ExampleTable (
ID INT PRIMARY KEY,
Name VARCHAR(50),
IndexValue INT
);
-- Name 컬럼에 인덱스 생성
CREATE INDEX idx_name ON ExampleTable (Name);
-- IndexValue 컬럼에 인덱스 생성
CREATE INDEX idx_indexvalue ON ExampleTable (IndexValue);
-- OR 조건을 사용하는 쿼리 (최적의 인덱스 선택이 어려운 상황)
SELECT * FROM ExampleTable WHERE Name = 'word' OR IndexValue = 5;
10. 인덱스가 2개 이상 있을 경우(AND 조건)
Optimizer 의 선택(하나를 선택하거나, 둘 다 선택하거나)
-- 예제 테이블 생성
CREATE TABLE ExampleTable (
ID INT PRIMARY KEY,
Name VARCHAR(50),
UserID VARCHAR(50)
);
-- Name 컬럼에 인덱스 생성
CREATE INDEX idx_name ON ExampleTable (Name);
-- UserID 컬럼에 인덱스 생성
CREATE INDEX idx_userid ON ExampleTable (UserID);
-- AND 조건을 사용하는 쿼리 (인덱스 선택 시뮬레이션)
SELECT * FROM ExampleTable WHERE Name = 'word' AND UserID = 'elky';
728x90
반응형
'Skills > MsSQL' 카테고리의 다른 글
동적 쿼리 사용 이유, 예시, 장단점, 플랜캐시, 주의점 (1) | 2023.09.06 |
---|---|
WHERE 1=1 조건절 사용 이유 (0) | 2023.09.06 |
SQL Server 테이블, 프로시저 조회 (0) | 2023.09.06 |
LIKE, CONTAINS 차이점 및 성능 비교 (0) | 2023.09.05 |
MSSQL SQL Server 공식문서 (0) | 2023.09.05 |