효율적인 쿼리문 작성을 위해 유의할 점 :: 2008/01/16 13:55
다음은 Delphi Client/Server Developer's Guide(삼각형)에서 발췌한 글입니다.
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연산자를 사용할 때 보다 속도가 빨라질 것이다. |
*참고 : 이 번호의 내용은 그대로 옮겼습니다.
Trackback Address :: http://jungkooki.byus.net/trackback/1840