정렬를 위한 항상 참인 조건문 추가가 성능상 좋은건가요? 0 4 1,913

by 리뉴사 [2016.03.15 10:00:01]


결과건수는 많아야 10건내외 보통 5건정도로 예상이 되는 SQL문입니다.

 

이때 정렬을 위해서 order by절을 사용하지 않고

 

where 절에 항상 참인 조건 and enter_date > to_date('19001112')

을 추가하여 날짜순서로 정렬하려고 하는데 이것이 성능상 order by 절을 사용하는 것 보다 더 효율적일까요?

또는 더 좋은 방법이 있을까요?

현제 상황을 말씀드리면

select * 
from product
where pro_code = '2016030700001'


and enter_date > to_date('19001112') 정렬을 위해 이 조건절을 추가 할까 order by절을 사용할까 고민중입니다.

인덱스 (기본키 인덱스, 복합키 2개로 이루어짐, pro_code와 enter_date )

where pr.pro_code = '2016030700001'

첫번째 where절에서 복합키 중 하나인 코드를 이미 조건으로 사용하고 있는 상황입니다.

by 마농 [2016.03.15 10:20:00]

정렬구문을 사용해도 인덱스를 타므로 실제로 정렬작업은 안합니다.
즉. 동일한 실행계획으로 동작하여 정렬결과를 얻는다면? 성능은 동일합니다.
그러나 조건절 사용시 동일한 정렬결과를 얻는다고 보장할 수는 없습니다.
비용기반이기 때문에 인덱스를 항상 탄다고 할 수는 없습니다.


해당 조건 안줘도 이미 선행 컬럼 조건이 있으므로 인덱스 타서 정렬될 가능성도 있구요.
해당 조건을 주므로 해서 인덱스 타서 정렬될 가능성이 더 커질수도 있겠지요.
하지만, 풀스캔이 유리하다고 판단할 가능성이 0.0001% 라도 존재한다면?
이는 정렬을 100% 보장할 수 있는게 아닙니다.
위의 경우엔 데이터 건수가 적어 풀스캔 할 가능성이 더욱 높아지구요.


인덱스 힌트와 함께 사용하는 방법도 있지만...
이 또한 맹신해서는 안될 부분이구요.
정렬을 원한다면 정렬구문을 명시적으로 적어주는게 최선입니다.
성능상 불리할게 하나도 없구요.


정렬없이 조건절만으로 정렬을 유도한 경우의 또다른 문제점은
가독성입니다.
유지보수 담당자가 바뀌어 해당 구문을 수정해야 할 필요가 있을 때.
정렬구문을 보면 확실하게 그 의도가 파악되지만
조건절만 보고는 정렬 의도를 파악하기 힘듭니다.


정리하면...
조건절만으로 정렬을 유도할 경우 문제점
  1. 정렬이 안될 수도 있다.
  2. 가독성이 떨어진다.
  3. 성능상 장점 없음
정렬구문을 이용하여 정렬할 경우 장점
  1. 정렬 보장
  2. 가독성 보장
  3. 성능상 단점 없음


추가로...
TO_DATE('19001112') 는 잘못된 사용법입니다.
실행 환경에 따라서 에러가 날 가능성이 높은 구문입니다.
TO_DATE('19001112', 'yyyymmdd') 로 명시적으로 포멧을 지정해 줘야
실행 환경에 영향을 받지 않습니다.

 


by 리뉴사 [2016.03.15 11:42:23]

답변 감사합니다.

제가 명확히 정렬을 위한 순서를 말씀안드렷네요 

날짜 순서로 정렬을 하고 싶어서 조건을 추가하려 했던겁니다

현제 sql문은

select * 
from product
where pro_code = '2016030700001' 이상태이므로

날짜순서로 정렬이 되지는 않습니다.  

그래서 정렬을 위해 인덱스에 포함되있는 날짜를 조건절에 추가함으로써

정렬을 하는것이 좋을지 order by 절을 사용하는것이 좋을지가 궁금하여 질문을 드렸던 겁니다

 

가독성이란 부분에 관해선 생각을 못햇엇네요 확실히 가독성 측면은 order by

를 사용하는곳이 좋은것 같아보이네요 감사합니다.

 

성능상으론 어떤것이 더 좋은지 궁금합니다


by swlee710 [2016.03.15 11:45:32]

일단 order by절까지 적으시고 실행계획을 확인해 보시는게 좋을거같습니다.


by 마농 [2016.03.15 12:32:33]

앞서 이미 설명드린 부분입니다.

해당 선두컬럼 조건만 주었을 때 인덱스를 탈수도 있고 안탈 수도 있으며

인덱스를 탈 경우 후행 컬럼도 순서대로 나오게 됩니다.

위의 경우 순서대로 안나왔다면 인덱스를 안탄거죠.

후행 컬럼 조건까지 추가할 경우 인덱스 탈 가능성이 더 높아지구요.

물론 안 탈수도 있구요.

뭘 시도해 보시던 실행계획을 확인해 보시는게 좋습니다.

성능상 차이점도 이미 설명 드렸죠.

차이 없습니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입