"오라클 인덱스 타지 않는 경우"의 두 판 사이의 차이
DB CAFE
(→인덱스 컬럼 절을 변형한 경우) |
|||
(같은 사용자의 중간 판 3개는 보이지 않습니다) | |||
6번째 줄: | 6번째 줄: | ||
- 반드시 함수나 수식을 사용해야 하는 경우에는 인덱스 컬럼 부분에 적용하지 말고, 여기에 대입되는 컬럼이나 상수부분에 | - 반드시 함수나 수식을 사용해야 하는 경우에는 인덱스 컬럼 부분에 적용하지 말고, 여기에 대입되는 컬럼이나 상수부분에 | ||
적용해야 한다. | 적용해야 한다. | ||
+ | <source> | ||
SELECT column_name FROM table_name WHERE TO_CHAR(column_name, 'YYYYMMDD') = '20130909'; | SELECT column_name FROM table_name WHERE TO_CHAR(column_name, 'YYYYMMDD') = '20130909'; | ||
+ | </source> | ||
+ | |||
<source lang=sql> | <source lang=sql> | ||
SELECT column_name FROM table_name WHERE column_name = TO_DATE('20130909', 'YYYYMMDD'); | SELECT column_name FROM table_name WHERE column_name = TO_DATE('20130909', 'YYYYMMDD'); | ||
+ | </source> | ||
+ | <source> | ||
SELECT column_name FROM table_name WHERE column_name * 100 > 10000; | SELECT column_name FROM table_name WHERE column_name * 100 > 10000; | ||
− | + | </source> | |
<source lang=sql> | <source lang=sql> | ||
> SELECT column_name FROM table_name WHERE column_name = 10000 / 100; | > SELECT column_name FROM table_name WHERE column_name = 10000 / 100; | ||
18번째 줄: | 23번째 줄: | ||
== 내부적으로 데이터 형 변환이 일어난 경우 == | == 내부적으로 데이터 형 변환이 일어난 경우 == | ||
- 서로 대입되는 항목끼리 데이터 타입이 다르면 내부적인 형 변환에 의해 컬럼이 함수를 사용한 효과를 나타낸다. | - 서로 대입되는 항목끼리 데이터 타입이 다르면 내부적인 형 변환에 의해 컬럼이 함수를 사용한 효과를 나타낸다. | ||
− | + | <source> | |
SELECT column_name FROM table_name WHERE column_name = '20130909'; // DATE 타입의 column | SELECT column_name FROM table_name WHERE column_name = '20130909'; // DATE 타입의 column | ||
+ | </source> | ||
<source lang=sql> | <source lang=sql> | ||
> SELECT column_name FROM table_name WHERE column_name = TO_DATE('20130909', 'YYYYMMDD'); | > SELECT column_name FROM table_name WHERE column_name = TO_DATE('20130909', 'YYYYMMDD'); | ||
</source> | </source> | ||
− | + | <source> | |
SELECT column_name FROM table_name WHERE column_name = 100; // 문자 타입의 column | SELECT column_name FROM table_name WHERE column_name = 100; // 문자 타입의 column | ||
− | + | </source> | |
<source lang=sql> | <source lang=sql> | ||
> SELECT column_name FROM table_name WHERE column_name = '100'; | > SELECT column_name FROM table_name WHERE column_name = '100'; | ||
35번째 줄: | 41번째 줄: | ||
는 것이 좋다. | 는 것이 좋다. | ||
만약, NOT NULL이 분석 대상이라면 해당 컬럼을 NULL 허용 컬럼으로 두는 것이 좋다. | 만약, NOT NULL이 분석 대상이라면 해당 컬럼을 NULL 허용 컬럼으로 두는 것이 좋다. | ||
− | + | <source> | |
SELECT column_name FROM table_name WHERE column_name IS NULL; | SELECT column_name FROM table_name WHERE column_name IS NULL; | ||
SELECT column_name FROM table_name WHERE column_name IS NOT NULL; | SELECT column_name FROM table_name WHERE column_name IS NOT NULL; | ||
+ | </source> | ||
<source lang=sql> | <source lang=sql> | ||
SELECT column_name FROM table_name WHERE column_name > ''; | SELECT column_name FROM table_name WHERE column_name > ''; | ||
45번째 줄: | 52번째 줄: | ||
== 부정형으로 조건을 사용한 경우 == | == 부정형으로 조건을 사용한 경우 == | ||
- 부정문은 인덱스를 활용하지 못한다. | - 부정문은 인덱스를 활용하지 못한다. | ||
+ | <source> | ||
SELECT column_name FROM table_name WHERE column_name != 30; | SELECT column_name FROM table_name WHERE column_name != 30; | ||
+ | </source> | ||
<source lang=sql> | <source lang=sql> | ||
SELECT column_name FROM table_name WHERE column_name < 30 AND column_name > 30; | SELECT column_name FROM table_name WHERE column_name < 30 AND column_name > 30; | ||
57번째 줄: | 66번째 줄: | ||
== LIKE 연산자를 사용하였을 경우 == | == LIKE 연산자를 사용하였을 경우 == | ||
- LIKE 연산자를 이용하여 검색을 할 경우 %를 앞에 넣어 사용하게 되면 인덱스를 타지 않는다. | - LIKE 연산자를 이용하여 검색을 할 경우 %를 앞에 넣어 사용하게 되면 인덱스를 타지 않는다. | ||
+ | <source> | ||
SELECT column_name FROM table_name WHERE column_name LIKE '%S%'; | SELECT column_name FROM table_name WHERE column_name LIKE '%S%'; | ||
+ | </source> | ||
<source lang=sql> | <source lang=sql> | ||
SELECT column_name FROM table_name WHERE column_name LIKE 'S%'; | SELECT column_name FROM table_name WHERE column_name LIKE 'S%'; | ||
69번째 줄: | 80번째 줄: | ||
== OR 조건 사용 == | == OR 조건 사용 == | ||
+ | <source> | ||
SELECT column_name FROM table_name1 t1, table_name2 t2 | SELECT column_name FROM table_name1 t1, table_name2 t2 | ||
WHERE (t1.column_name1 = t2.column_name1 OR t1.column_name2 = t2.column_name2) | WHERE (t1.column_name1 = t2.column_name1 OR t1.column_name2 = t2.column_name2) | ||
AND t1.column_name3 = 'cmp_value'; | AND t1.column_name3 = 'cmp_value'; | ||
− | + | </source> | |
<source lang=sql> | <source lang=sql> | ||
SELECT column_name FROM table_name1 t1, table_name2 t2 | SELECT column_name FROM table_name1 t1, table_name2 t2 | ||
80번째 줄: | 92번째 줄: | ||
WHERE t1.column_name2 = t2.column_name2 AND t1.column_name3 = 'cmp_value'; | WHERE t1.column_name2 = t2.column_name2 AND t1.column_name3 = 'cmp_value'; | ||
</source> | </source> | ||
+ | [[Category:oracle]] |
2019년 12월 19일 (목) 12:37 기준 최신판
thumb_up 추천메뉴 바로가기
- DBA { Oracle DBA 명령어 > DBA 초급 과정 > DBA 고급 과정 }
- 튜닝 { 오라클 튜닝 목록 }
- 모델링 { 데이터 모델링 가이드 }
목차
1 인덱스가 타지 않는 경우[편집]
1.1 인덱스 컬럼 절을 변형한 경우[편집]
- 수식이나 함수 등으로 인덱스 컬럼 절을 변형하였을 경우 - 반드시 함수나 수식을 사용해야 하는 경우에는 인덱스 컬럼 부분에 적용하지 말고, 여기에 대입되는 컬럼이나 상수부분에 적용해야 한다.
SELECT column_name FROM table_name WHERE TO_CHAR(column_name, 'YYYYMMDD') = '20130909';
SELECT column_name FROM table_name WHERE column_name = TO_DATE('20130909', 'YYYYMMDD');
SELECT column_name FROM table_name WHERE column_name * 100 > 10000;
> SELECT column_name FROM table_name WHERE column_name = 10000 / 100;
1.2 내부적으로 데이터 형 변환이 일어난 경우[편집]
- 서로 대입되는 항목끼리 데이터 타입이 다르면 내부적인 형 변환에 의해 컬럼이 함수를 사용한 효과를 나타낸다.
SELECT column_name FROM table_name WHERE column_name = '20130909'; // DATE 타입의 column
> SELECT column_name FROM table_name WHERE column_name = TO_DATE('20130909', 'YYYYMMDD');
SELECT column_name FROM table_name WHERE column_name = 100; // 문자 타입의 column
> SELECT column_name FROM table_name WHERE column_name = '100';
1.3 조건절에 NULL 또는 NOT NULL을 사용하는 경우[편집]
- 기본적으로 인덱스를 구성한 컬럼 값이 전부 NULL이라면 인덱스는 null값을 저장하지 않음. 따라서 NULL인 값이 많지 않아 인덱스를 통해 엑세스를 하고자 한다면 데이터 생성 시 디폴트로 0과 같이 데이터를 만들어주 는 것이 좋다. 만약, NOT NULL이 분석 대상이라면 해당 컬럼을 NULL 허용 컬럼으로 두는 것이 좋다.
SELECT column_name FROM table_name WHERE column_name IS NULL;
SELECT column_name FROM table_name WHERE column_name IS NOT NULL;
SELECT column_name FROM table_name WHERE column_name > '';
SELECT column_name FROM table_name WHERE column_name >= 0;
1.4 부정형으로 조건을 사용한 경우[편집]
- 부정문은 인덱스를 활용하지 못한다.
SELECT column_name FROM table_name WHERE column_name != 30;
SELECT column_name FROM table_name WHERE column_name < 30 AND column_name > 30;
또는 테이블을 한 번 더 읽어 NOT EXIST S를 사용
SELECT column_name FROM table_name WHERE NOT EXISTS
(SELECT column_name FROM table_name WHERE column_name = 30);
1.5 LIKE 연산자를 사용하였을 경우[편집]
- LIKE 연산자를 이용하여 검색을 할 경우 %를 앞에 넣어 사용하게 되면 인덱스를 타지 않는다.
SELECT column_name FROM table_name WHERE column_name LIKE '%S%';
SELECT column_name FROM table_name WHERE column_name LIKE 'S%';
가능하면 INSTR을 사용 INSTR('비교할 대상', '비교하고자하는 값', 비교를 시작할 위치, 검색된 결과의 순번);
SELECT column_name FROM table_name WHERE INSTR(column_name , 'cmp_value') > 0;
1.6 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';
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';