본문 바로가기
Skills/MsSQL

인덱스를 타지 않는 10가지 CASE와 예제

by Hoseok 2023. 9. 5.
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
반응형