안녕하세요 오랜만에 글을 남기네요
쿼리를 작성하다가 궁금한점이 있어서요
저힇 회사 선배님들 쿼리를 짜놓은걸 보다가
비슷한 쿼리인데 A선배는
WITH STF_TABLE AS
(
SELECT '20200001' AS STF_NO , 'AA' AS DEPT_CD FROM DUAL
UNION ALL
SELECT '20200002' AS STF_NO , 'AA' AS DEPT_CD FROM DUAL
)
, DEPT_TABLE AS
(
SELECT 'AA' AS DEPT_CD FROM DUAL
UNION ALL
SELECT 'BB' AS DEPT_CD FROM DUAL
UNION ALL
SELECT 'CC' AS DEPT_CD FROM DUAL
)
SELECT *
FROM STF_TABLE A
, DEPT_TABLE B
WHERE A.DEPT_CD = B.DEPT_CD
AND A.DEPT_CD = 'AA' 바인드변수(파라미터)
AND B.DEPT_CD = 'AA' 바인드변수(파라미터)
위와같이 A B테이블 둘다 부서 조건을 걸어놓고
B선배는
WITH STF_TABLE AS
(
SELECT '20200001' AS STF_NO , 'AA' AS DEPT_CD FROM DUAL
UNION ALL
SELECT '20200002' AS STF_NO , 'AA' AS DEPT_CD FROM DUAL
)
, DEPT_TABLE AS
(
SELECT 'AA' AS DEPT_CD FROM DUAL
UNION ALL
SELECT 'BB' AS DEPT_CD FROM DUAL
UNION ALL
SELECT 'CC' AS DEPT_CD FROM DUAL
)
SELECT *
FROM STF_TABLE A
, DEPT_TABLE B
WHERE A.DEPT_CD = B.DEPT_CD
AND A.DEPT_CD = 'AA' 바인드변수(파라미터)
A테이블의 부서코드에만 조건을 걸어놨더라구용...
데이터는 동일하게 출력되는거같은데 성능적으로는 어떤식으로 쿼리를 짜는게..도움이 될까 궁금해서요
제생각에는 A, B 테이블에 각각 변수를 대입하는게 성능적으로 유리하지 않을까라는..생각이 들기는하는데(A B테이블에 각각 범위를 줄여주니..) 제 생각이 맞는지..
고수님들의 답변 부탁드리겠습니다.
상수조건 : a=b, a=1 의 경우 b=1 조건이 자동으로 생성됨.
조인조건 : a=b, a=c 의 경우 b=c 조건이 생성되지 않음.
상수조건의 경우 조건절 이행이라는 쿼리 변환이 수행됩니다.
따라서 굳이 조건을 추가로 적어주지 않아도 됩니다.
조인조건의 경우엔 조건절 이행이 되지 않습니다.
따라서 조건을 어떻게 주느냐에 따라 실행계획이 달라질 수 있습니다.
(a=b, a=c, b=c) 3개 조건 중 2개 조건 만으로도 충분조건이 되지만
어떤 조건을 선택하느냐에 따라 성능이 달라질 수 있습니다.
최적의 실행계획을 수립할 수 있는 조건 2개를 선택하거나
선택이 어려우면 차라리 3개 조건 다주는 방법도 있습니다.