인덱스 컬럼, 절을 변형한 경우
•
수식이나 함수 등으로 인덱스 컬럼 절을 변형하였을 경우
•
함수나 수식을 사용해야하는 경우에는 인덱스 컬럼 부분에 적용하지 말고 대입이 가능한 컬럼이나 상수 부분에 적용해야 한다.
•
인덱스 컬럼에 함수나 수식을 쓰지마라!!!!!
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
복사