Search
Duplicate
🔥

인덱스를 타지 않는 쿼리

인덱스 컬럼, 절을 변형한 경우

수식이나 함수 등으로 인덱스 컬럼 절을 변형하였을 경우
함수나 수식을 사용해야하는 경우에는 인덱스 컬럼 부분에 적용하지 말고 대입이 가능한 컬럼이나 상수 부분에 적용해야 한다.
인덱스 컬럼에 함수나 수식을 쓰지마라!!!!!
SELECT column_name FROM table_name WHERE TO_CHAR(column_name, 'YYYYMMDD') = '20130909';
SQL
복사
SELECT column_name FROM table_name WHERE column_name = TO_DATE('20130909', 'YYYYMMDD');
SQL
복사
SELECT column_name FROM table_name WHERE column_name * 100 > 10000;
SQL
복사
SELECT column_name FROM table_name WHERE column_name > 100;
SQL
복사

내부적으로 데이터 형 변환이 일어난 경우

서로 대입되는 항목끼리 데이터 타입이 다르면 내부적인 형 변환에 의해 컬럼이 함수를 사용한 효과를 나타낸다. 바로 위의 경우와 유사
SELECT column_name FROM table_name WHERE column_name = '20130909'; //DATE 타입의 Column이나 Varchar로 형 변환됨
SQL
복사
SELECT column_name FROM table_name WHERE column_name = TO_DATE('20130909', 'YYYYMMDD');
SQL
복사
SELECT column_name FROM table_name WHERE column_name = 100; // 문자 타입의 Column이나 Int로 형 변환됨
SQL
복사
SELECT column_name FROM table_name WHERE column_name = '100';
SQL
복사

조건절에 NULL 또는 NOT NULL을 사용하는 경우

기본적으로 인덱스를 구성한 컬럼 값이 전부 NULL이라면 인덱스는 NULL을 저장하지 않는다.
따라서 NULL인 값이 많지 않아 인덱스를 통해 액세스하려 한다면 데이터 생성 시 디폴트로 0과 같이 데이터를 만들어주는 것이 좋다.
만약 NOT NULL을 조건으로 걸고자 한다면 해당 컬럼에 NULL을 허용하는 것도 좋다.
SELECT column_name FROM table_name WHERE column_name = IS NULL:
SQL
복사
SELECT column_name FROM table_name WHERE column_name > '';
SQL
복사
SELECT column_name FROM table_name WHERE column_name IS NOT NULL;
SQL
복사
SELECT column_name FROM table_name WHERE column_name >= 0;
SQL
복사

부정형으로 조건을 사용한 경우

부정문은 인덱스를 활용하지 못 한다.
SELECT column_name FROM table_name WHERE column_name != 30;
SQL
복사
SELECT column_name FROM table_name WHERE column_name < 30 AND column_name > 30;
SQL
복사
SELECT column_name FROM table_name WHERE NOT EXISTS (SELECT column_name FROM table_name WHERE column_name = 30);
SQL
복사

LIKE 연산자를 사용하였을 경우

LIKE 연산자를 이용하여 검색할 경우 %을 앞에 넣으면 인덱스를 타지 않는다.
가능하면 INSTR을 사용하는 것도 나쁘지 않다.
SELECT column_name FROM table_name WHERE column_name LIKE '%S%';
SQL
복사
SELECT column_name FROM table_name WHERE column_name LIKE 'S%';
SQL
복사
SELECT column_name FROM table_name WHERE INSTR(column_name, 'cmp_value') > 0;
SQL
복사

OR 조건 사용

SELECT column_name FROM table_name1 t1, table_name2 t2 WHERE (t1.column_name1 = t2.column_name1 OR t1.column_name2 = t2.column_name2) AND t1.column_name3 = 'cmp_value';
SQL
복사
SELECT column_name FROM table_name1 t1, table_name2 t2 WHERE t1.column_name1 = t2.column_name1 AND t1.column_name3 = 'cmp_value'; UNION ALL SELECT column_name FROM table_name1 t1, table_name2 t2 WHERE t1.column_name2 = t2.column_name2 AND t1.column_name3 = 'cmp_value';
SQL
복사

참고