결과건수는 많아야 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절에서 복합키 중 하나인 코드를 이미 조건으로 사용하고 있는 상황입니다.
정렬구문을 사용해도 인덱스를 타므로 실제로 정렬작업은 안합니다.
즉. 동일한 실행계획으로 동작하여 정렬결과를 얻는다면? 성능은 동일합니다.
그러나 조건절 사용시 동일한 정렬결과를 얻는다고 보장할 수는 없습니다.
비용기반이기 때문에 인덱스를 항상 탄다고 할 수는 없습니다.
해당 조건 안줘도 이미 선행 컬럼 조건이 있으므로 인덱스 타서 정렬될 가능성도 있구요.
해당 조건을 주므로 해서 인덱스 타서 정렬될 가능성이 더 커질수도 있겠지요.
하지만, 풀스캔이 유리하다고 판단할 가능성이 0.0001% 라도 존재한다면?
이는 정렬을 100% 보장할 수 있는게 아닙니다.
위의 경우엔 데이터 건수가 적어 풀스캔 할 가능성이 더욱 높아지구요.
인덱스 힌트와 함께 사용하는 방법도 있지만...
이 또한 맹신해서는 안될 부분이구요.
정렬을 원한다면 정렬구문을 명시적으로 적어주는게 최선입니다.
성능상 불리할게 하나도 없구요.
정렬없이 조건절만으로 정렬을 유도한 경우의 또다른 문제점은
가독성입니다.
유지보수 담당자가 바뀌어 해당 구문을 수정해야 할 필요가 있을 때.
정렬구문을 보면 확실하게 그 의도가 파악되지만
조건절만 보고는 정렬 의도를 파악하기 힘듭니다.
정리하면...
조건절만으로 정렬을 유도할 경우 문제점
1. 정렬이 안될 수도 있다.
2. 가독성이 떨어진다.
3. 성능상 장점 없음
정렬구문을 이용하여 정렬할 경우 장점
1. 정렬 보장
2. 가독성 보장
3. 성능상 단점 없음
추가로...
TO_DATE('19001112') 는 잘못된 사용법입니다.
실행 환경에 따라서 에러가 날 가능성이 높은 구문입니다.
TO_DATE('19001112', 'yyyymmdd') 로 명시적으로 포멧을 지정해 줘야
실행 환경에 영향을 받지 않습니다.
답변 감사합니다.
제가 명확히 정렬을 위한 순서를 말씀안드렷네요
날짜 순서로 정렬을 하고 싶어서 조건을 추가하려 했던겁니다
현제 sql문은
select *
from product
where pro_code = '2016030700001' 이상태이므로
날짜순서로 정렬이 되지는 않습니다.
그래서 정렬을 위해 인덱스에 포함되있는 날짜를 조건절에 추가함으로써
정렬을 하는것이 좋을지 order by 절을 사용하는것이 좋을지가 궁금하여 질문을 드렸던 겁니다
가독성이란 부분에 관해선 생각을 못햇엇네요 확실히 가독성 측면은 order by
를 사용하는곳이 좋은것 같아보이네요 감사합니다.
성능상으론 어떤것이 더 좋은지 궁금합니다