검색조건 순서 변경에 따른 실행계획의 차이가 발생하는가요? 0 7 11,355

by 빠쿄 [2009.07.22 10:14:25]


예로써 아래와 같은 검색인데요

select *from test_table

where Adata = ’100’

AND Bdata = ’ABC’

AND Cdata = ’20090722’;

---------------------------------------------------

select *from test_table

where Bdata = ’ABC’

AND Cdata = ’20090722’;

AND Adata = ’100’

-------------------------------------------------

첫번째 질문은...이런 검색문 일때 A,B,C 의 순서가 바뀌어도 속도가 차이가 나는가 이구요

두번째로는 만약 저중에 pk 가 있다면 pk 를 맨 위에 노으면 빠른가 입니다.

ps: 빠른 검색을 위한 팁 이 있는 글이 있다면 알려주시면 감사하겠습니다.~

읽어주셔서 감사합니다^^ 좋은하루 되세요~

by 박민석 [2009.07.22 10:53:45]
질문을 검색조건 순서 변경에 따른 실행계획의 차이가 발생하는가? 라고 올리셨으면 더 좋을뻔했네요..^^
실행계획이 바뀌면 수행 속도에 영향은 당연히 미치는 거구요..
결론적으로 말하면.. optimizer가 실행계획을 새울때 모든 경우의 수만큼 체크를 하지 않습니다. 정해진 숫자(몇 번인지는..기억이..^^) 만큼만 실행 계획을 만들어 보고 그중에서 가장 좋은 것을 뽑아서 채택하게 되죠..
따라서 join 문에서 테이블 순서, 검색 조건 순서에 따라서 실행계획이 바뀌고, 수행 속도도 차이가 날수는 있습니다.
하지만 위와 같이 single table의 경우에는 글너 경우가 거의 발생하지 않을듯 합니다.

by 빠쿄 [2009.07.22 11:04:33]
답변감사합니다!
그렇군요 사실 위의것은 예시적인것이고 실제로 다루는 정보는 10000 행이상의 정보를 담고 있습니다 이런 경우에는 차이가 꽤 많이 나겠네요...
그리고 하나더 질문 하자면...
where Adata = ’100’

AND Bdata = ’ABC’

AND Cdata = ’20090722’;

일때 A가 pk 일때와 pk 가 아닐때도 속도의 차이가 생길까요???




by 박민석 [2009.07.22 11:18:07]
return 되는 결과 set이 1 row 라면 차이가 없을듯 합니다.
빠쿄님을 말씀은 pk 또는 unique index로 잡아도 되는 index를 nunuique index로 잡았다는 뜻인데요..
PK가 따로 존재하고 unique index가 필요한 경우 그냥 unique index로 잡으시면 차이가없을듯 합니다.

PK = unique index + not null 입니다.

by 전창환 [2009.07.22 11:24:03]
순서에따른 속도차이는 없습니다.

옵티마이져는 rbo라면 우선순위 규칙등 요인에 의거하여 실행계획을 수립할 것이고,
cbo라면 통계정보등의 요인에 의거하여 실행계획을 수립합니다.
순서와는 무관합니다.



by 마농 [2009.07.22 11:28:54]
대부분의 경우 차이가 거의 발생하지 않습니다.
그러나 더러 차이가 발생하는 수도 있습니다.
조건 순서와 전혀 무관하다고 단정지을수는 없습니다.
조건 순서와 거의 무관하다고 표현하는것이 맞겠네요.
옵티마이져가 3가지 조건중에 어떤것을 우선으로 정해야 할지 갈피를 잡지 못하는 경우 뒤에 나오는 조건을 우선시 하는것으로 압니다.

by 전창환 [2009.07.22 12:20:14]
마농님의 좋은지적 감사합니다...
RBO에서 우선순위가 모두 동등했을시 where절에서는 뒤에서부터 from절에서도 뒤에서부터 우선순위를 갖게됩니다..
무조건 순서와 속도는 상관없다는 표현은 잘못된거 같네요.
모든우선순위가 동등하여 뒤에서부터 우선순위가 부여된다면 매핑되는 데이터가 적은 조건부터 뒤에기술하여 처리범위를 줄이는 방식을 유용하겠습니다.

by 빠쿄 [2009.07.22 13:13:04]
넘넘넘 감사합니다!!^^
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입