Ver 14. Life is zero-sum game.

안군의 개념공간
  • Blog
  • Location
  • Tag
  • Guest Book

효율적인 쿼리문 작성을 위해 유의할 점 :: 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연산자를 사용할 때 보다 속도가 빨라질 것이다.



*참고 : 이 번호의 내용은 그대로 옮겼습니다.

안군
2008/01/16 13:55 2008/01/16 13:55
이 글의 관련글
  • 지능지수별로 알아보는 SQL쿼리
  • 25가지 SQL 작성법
DB튜닝, MSSQL, SQL, 쿼리
Trackback(0) : Comment(0)
Trackback Address :: http://jungkooki.byus.net/trackback/1840
Name
Password
Homepage
Secret
< PREV | 1| ... 3958|3959|3960|3961|3962|3963|3964|3965|3966| ... 5370| NEXT >
  • 관리
  • 새글
  • 차회예고

BLOG main image
트래픽=1% (16.57MB/1500MB)

Notice

Ver 14. Life is zero-sum game. - 최근 공지

  • 여기 주인장은 뭐하는 사람이냐?

Category

전체 (5370)
일상다반사 (1286)
① 다이어리 (906)
② 앨범 (340)
③ 코스프레 (40)
안군하우스 (3183)
① 잡담 (2215)
② 도시괴담 (343)
③ 사건사고 (97)
④ 연예인 (137)
⑤ 막장 (390)
생활의지혜 (673)
① 잡학다식 (318)
② Windows (89)
③ 컴퓨터 (88)
④ 블로그 (69)
⑤ 헬스 (53)
⑥ 생활속의 법 (56)
자료실 (160)
① 웹게임 (64)
② 닌텐도DS (54)
③ 프로그램 (2)
④ 소품제작 (27)
⑤ 문서&이미지 (13)
바로가기 (43)

Recent Entries

    Ver 14. Life is zero-sum game. - 최근 글

  • 남자 성기 15Cm 은근 크네요 (2)
  • 각 나이별 고민
  • 결혼식 갔다가 큰일 날... (1)
  • 교수님이랑 같은 엘레베...
  • 긍정적인 편의점 알바
  • 공포의 여중생 염색 이야기 (2)
  • 경력 10년 트레이너가 말... (1)
  • 나, 나이팅게일은 너희들...
  • 나는 자연인이다 출연자... (1)
  • 기업들이 경력자만 찾는...
  • 도둑이 제발 저림 (1)
  • 로데오 섹스 하는법 (1)
  • 미국에서 일어난 정액 요... (1)
  • 일본 국기의 비밀
  • 페트병에 꼬추낀 남동생...
  • 동정이 아니면 들어갈 수...
  • 사촌동생 속여서 라면 끓...
  • 사기꾼 참교육 시키는 법
  • 의미 부여 (1)
  • 숙명여대에서 유명한 사...

Recent Comments

    Ver 14. Life is zero-sum game. - 최근 댓글

  • 12/06 ProxySite.cоm이 해당...
  • 12/06 소개되는 웹하드 순위들...
  • 12/06 뉴이스트W 멤버 모여들...
  • 12/03 Best glasses check her...
  • 11/27 FIFA55 CASHLIVE FIFA5...
  • 11/25 fifa55cashlive FIFA55...
  • 11/25 역시 천조국의 위엄
  • 11/25 일본이 일본했네요
  • 11/25 한번 해보기라도 하고...
  • 11/25 잠시만 여중생인데 고추...
  • 11/25 아..금칙어가 뭔지좀 알...
  • 11/25 아 ㅋㅋ 우리딸내미는...
  • 11/25 맨 마지막... 말이 가슴...
  • 11/25 우리딸내미(현재초1) 수...
  • 11/25 이거 비하인드가 있는데...
  • 11/25 목욕탕에서 발기된채로...
  • 11/22 섬머캠프에는 질문이 있...
  • 11/20 섬머캠프에는 질문이 있...
  • 09/11 테터툴즈 블로그 패키지...
  • 09/11 퇴사했겠죠.
  • 09/11 현실남편 : 감사합니다....
  • 09/11 오마주...라 해주죠 -...
  • 09/11 그전에 사망하실수도 있...
  • 09/11 올린지 벌써 7년이 지났...
  • 09/11 작성하신 댓글이 더 드...
  • 09/11 영어를 못할수도 있잖아...
  • 09/11 어; 진짠가요?
  • 09/11 현생에 건물주 되어보는...
  • 09/11 방구석작가(남/무직/45세)
  • 09/11 그물은 괴기 잡을때 쓰...

Blog♥Rings

Family Blog & Sites T-Blog web site  
Total : 6055583
Today : 28
Yesterday : 366
RSS구독하기
안군's Blog is Powered by Tattertools.com / Designed by Daisy