출처 : 내 마음 속의 ⓟolaris ·‥…─━★
1. 두 개, 혹은 그 이상의 조건이 AND로 묶인다면, 가장 제한적인 조건을 먼저 지정하라.
예제쿼리문> SELECT COUNT(*) FROM student WHERE gender='F' AND gpa >= 3.5
위 예제쿼리문에서 gender필드는 성별 필드이고, gpa는 학점 필드입니다.
전체 테이블에서 성별이 F인 레코드의 개수보다는 gpa가 3.5이상인 레코드의 개수가 더 적을 것이라고 예상할 수 있습니다.
따라서 위 예제쿼리문보다는 다음 쿼리문이 더 빠른 속도를 낼 수 있습니다.
SELECT COUNT(*) FROM student WHERE gpa >= 3.5 AND gender='F'
2. 두 개, 혹은 그 이상의 조건이 OR로 묶인다면 가장 덜 제한적인 조건을 먼저 지정하라.
예제쿼리문> SELECT * FROM student WHERE gpa >= 3.5 OR gender='F'
OR조건문을 사용하는 경우에는 위 1번의 경우와 정반대라고 생각하면 됩니다.
gpa가 3.5이상인 레코드의 개수보다 성별필드가 F인 레코드의 개수보다 더 적습니다.
즉 더욱 제한적입니다.
이런 경우 다음과 같이 쿼리문을 작성하는 것이 더 빠른 속도를 낼 수 있습니다.
SELECT * FROM student WHERE gender='F' OR gpa >= 3.5
3. <>를 조심하라.
쿼리문에서 <>는 NOT을 의미합니다.
즉 SELECT * FROM student WHERE gpa <> 3.5와 같은 쿼리문은 학점(gpa)이 3.5가 아닌 레코드만을 뽑아내라는 의미입니다.
이 경우 학점이 3.5인 레코드의 개수보다 3.5가 아닌 레코드의 개수가 많다는 것을 쉽게 짐작할 수 있습니다.
일반적으로 대부분의 SQL옵티마이저는 <>를 사용하였을 때 반환되는 결과 레코드가 그렇지 않은 레코드의 개수보다 많을 것으로 추정하게 됩니다.
따라서 해당필드에 인덱스가 설정되어 있다 하더라도 전체 테이블을 읽게 됩니다.
결과적으로 쿼리의 수행속도가 느려집니다.
따라서 다음과 같은 쿼리문으로 수행속도를 증가시킬 수 있습니다.
SELECT * FROM student WHERE gpa < 3.5 OR gpa > 3.5
4. IN절을 사용할 때에는 가장 확률이 높은 비교치에서부터 가장 낮은 비교치로 순서를 정하라
SELECT * FROM student WHERE UPPER(last) IN ("SMITH", "PETERSON")
위 쿼리문은 last필드의 값이 SMITH인 것 또는 PETERSON인 것을 추출해 내라는 의미의 쿼리문이다.
이 경우 last필드에 PETERSON이 저장되어 있는 레코드의 개수보다 SMITH가 저장되어 있는 레코드의 개수가 더 많다는 가정하에 다음 쿼리문보다 더 빠르게 동작한다.
SELECT * FROM student WHERE UPPER(last) IN ("PETERSON", "SMITH")
5. LIKE절은 매우 조심스럽게 사용하라.
테이블에 대해 와일드 카드를 포함한 검색을 할 수 있는 LIKE절은 매우 조심스럽게 사용해야 한다.
그 자체로는 서버가 최적화시키기 어렵기 때문이다.
어떤 서버는 LIKE절과 인덱스를 같이 사용하지 않으며, 또 어떤 서버는 첫 글자가 와일드카드 기호 %나 _이 아니면 인덱스를 사용한다.
인덱스를 사용하기는 해도 대부분의 서버는 와일드카드를 접하고 나면 인덱스의 사용을 중단한다.
예를 들어 테이블에서 Sm_th를 찾기 위해 밑줄 기호를 사용하려면 다음과 같다.
SELECT * FROM student WHERE upper(last) LIKE "SM_TH"
그러나 만일 서버가 last필드를 기준으로 하는 인덱스를 사용하고 있다고 가정하면, 와일드카드 기호 뒤의 TH에는 인덱스를 사용하지 않는다.
이 사실은 끝의 두 글자는 무시하고 SM으로만 시작하는 레코드를 모두 찾아낸다는 뜻이다.
이러한 점을 해결하려면 BETWEEN연산자를 사용하면 된다.
SELECT * FROM student WHERE upper(last) BETWEEN "SMATH" AND "SMZTH"
이 경우에는 LIKE연산자가 필요없고, 데이터베이스는 일치하는 레코드를 찾는데 인덱스를 사용하게 된다.
따라서 LIKE연산자를 사용할 때 보다 속도가 빨라질 것이다.
1. 두 개, 혹은 그 이상의 조건이 AND로 묶인다면, 가장 제한적인 조건을 먼저 지정하라.
예제쿼리문> SELECT COUNT(*) FROM student WHERE gender='F' AND gpa >= 3.5
위 예제쿼리문에서 gender필드는 성별 필드이고, gpa는 학점 필드입니다.
전체 테이블에서 성별이 F인 레코드의 개수보다는 gpa가 3.5이상인 레코드의 개수가 더 적을 것이라고 예상할 수 있습니다.
따라서 위 예제쿼리문보다는 다음 쿼리문이 더 빠른 속도를 낼 수 있습니다.
SELECT COUNT(*) FROM student WHERE gpa >= 3.5 AND gender='F'
2. 두 개, 혹은 그 이상의 조건이 OR로 묶인다면 가장 덜 제한적인 조건을 먼저 지정하라.
예제쿼리문> SELECT * FROM student WHERE gpa >= 3.5 OR gender='F'
OR조건문을 사용하는 경우에는 위 1번의 경우와 정반대라고 생각하면 됩니다.
gpa가 3.5이상인 레코드의 개수보다 성별필드가 F인 레코드의 개수보다 더 적습니다.
즉 더욱 제한적입니다.
이런 경우 다음과 같이 쿼리문을 작성하는 것이 더 빠른 속도를 낼 수 있습니다.
SELECT * FROM student WHERE gender='F' OR gpa >= 3.5
3. <>를 조심하라.
쿼리문에서 <>는 NOT을 의미합니다.
즉 SELECT * FROM student WHERE gpa <> 3.5와 같은 쿼리문은 학점(gpa)이 3.5가 아닌 레코드만을 뽑아내라는 의미입니다.
이 경우 학점이 3.5인 레코드의 개수보다 3.5가 아닌 레코드의 개수가 많다는 것을 쉽게 짐작할 수 있습니다.
일반적으로 대부분의 SQL옵티마이저는 <>를 사용하였을 때 반환되는 결과 레코드가 그렇지 않은 레코드의 개수보다 많을 것으로 추정하게 됩니다.
따라서 해당필드에 인덱스가 설정되어 있다 하더라도 전체 테이블을 읽게 됩니다.
결과적으로 쿼리의 수행속도가 느려집니다.
따라서 다음과 같은 쿼리문으로 수행속도를 증가시킬 수 있습니다.
SELECT * FROM student WHERE gpa < 3.5 OR gpa > 3.5
4. IN절을 사용할 때에는 가장 확률이 높은 비교치에서부터 가장 낮은 비교치로 순서를 정하라
SELECT * FROM student WHERE UPPER(last) IN ("SMITH", "PETERSON")
위 쿼리문은 last필드의 값이 SMITH인 것 또는 PETERSON인 것을 추출해 내라는 의미의 쿼리문이다.
이 경우 last필드에 PETERSON이 저장되어 있는 레코드의 개수보다 SMITH가 저장되어 있는 레코드의 개수가 더 많다는 가정하에 다음 쿼리문보다 더 빠르게 동작한다.
SELECT * FROM student WHERE UPPER(last) IN ("PETERSON", "SMITH")
5. LIKE절은 매우 조심스럽게 사용하라.
테이블에 대해 와일드 카드를 포함한 검색을 할 수 있는 LIKE절은 매우 조심스럽게 사용해야 한다.
그 자체로는 서버가 최적화시키기 어렵기 때문이다.
어떤 서버는 LIKE절과 인덱스를 같이 사용하지 않으며, 또 어떤 서버는 첫 글자가 와일드카드 기호 %나 _이 아니면 인덱스를 사용한다.
인덱스를 사용하기는 해도 대부분의 서버는 와일드카드를 접하고 나면 인덱스의 사용을 중단한다.
예를 들어 테이블에서 Sm_th를 찾기 위해 밑줄 기호를 사용하려면 다음과 같다.
SELECT * FROM student WHERE upper(last) LIKE "SM_TH"
그러나 만일 서버가 last필드를 기준으로 하는 인덱스를 사용하고 있다고 가정하면, 와일드카드 기호 뒤의 TH에는 인덱스를 사용하지 않는다.
이 사실은 끝의 두 글자는 무시하고 SM으로만 시작하는 레코드를 모두 찾아낸다는 뜻이다.
이러한 점을 해결하려면 BETWEEN연산자를 사용하면 된다.
SELECT * FROM student WHERE upper(last) BETWEEN "SMATH" AND "SMZTH"
이 경우에는 LIKE연산자가 필요없고, 데이터베이스는 일치하는 레코드를 찾는데 인덱스를 사용하게 된다.
따라서 LIKE연산자를 사용할 때 보다 속도가 빨라질 것이다.
'쓸만한 글' 카테고리의 다른 글
[스크랩] <의학> 맹렬 여성이 아들 낳는다 (0) | 2006.03.09 |
---|---|
MS-SQL 개발자를 위한 튜닝 (0) | 2006.02.14 |
[스크랩] 우리나라 최초의 수출품은? (0) | 2006.01.16 |
가장 대중적인 거짓말들(myths) (0) | 2006.01.13 |
[스크랩] <과학> 블랙홀 `사건의 지평선' 증거 발견 (0) | 2006.01.10 |