문서의 이전 판입니다!
WHERE column1 comparison_operators constant AND column1 = column2
SELECT * FROM emp e, dept d WHERE e.deptno = 20 AND e.deptno = d.deptno;
WHERE column1 comparison_operators column3 AND column1 = column2
SELECT * FROM emp WHERE job = 'CLERK' OR deptno = 10;
SELECT * FROM emp WHERE deptno = 10 UNION ALL SELECT * FROM emp WHERE job = 'CLERK‘ and deptno <> 10;
SELECT * FROM emp WHERE deptno IN (SELECT deptno FROM dept WHERE loc = ‘NEW YORK’) ;
SELECT emp.* FROM emp, dept WHERE emp.deptno = dept.deptno AND dept.loc = ‘NEW YORK’ ;
뷰쿼리 | 뷰를 생성할때 사용한 SELECT 문 dictionary에 저장된 select문 |
---|---|
액세스쿼리 | 이 뷰를 수행하는 SQL문 |
뷰병합(View Merging)법 | 뷰쿼리를 액세스쿼리에 병합해 넣는 방식 |
---|---|
조건절 진입(Predicate pushing)법 | 뷰병합을 할 수 없는 경우를 대상으로 뷰쿼리 내부에 액세스쿼리의 조건절을 진입시키는 방식 |
CREATE VIEW emp_10 (e_no, e_name, job, manager, salary, commission, deptno) AS SELECT empno, ename, job, mgr, sal, comm, deptno FROM emp WEHRE deptno = 10;
SELECT e_no, e_name, salary, deptno FROM emp_10 WHERE salary > 1000000;
SELECT empno, ename, sal, hiredate FROM emp WHERE deptno = 10 AND sal > 1000000;
*
만약 EMP 테이블에 DEPTNO + SAL 로 구성된 인덱스가 있었다면 \\ 변환된 SQL에 의해 완벽한 실행계획을 갖게 된다</color> ==== View Merging이 불가능한 경우 ==== ===== 사용자 정의 바인드 변수의 엿보기(Peeking) ===== - 바인드 변수를 사용한 쿼리는 먼저 파싱과 최적화가 이루어진 후에 바인드 변수에 바인딩이 이루어진다 - 최적화가 이루어지는 시점에는 변수로 제공되는 컬럼은 바인딩 값에 대한 통계정보를 사용할 수 없다는 것을 의미 - **분포도가 균일하지 못한 컬럼에 바인드 변수를 사용하면 최악의 실행계획이 생성될 수도 있다** ==== Peeking ==== - 바인드 변수를 사용한 쿼리가 처음 실행될 때 \\ 옵티마이져는 사용자가 지정한 바인드 변수의 값을 살짝 커닝함으로써 \\ 조건절의 컬럼값이 상수값으로 제공될 때와 마찬가지로 선택도를 확인하여 최적화를 수행 - 첫번째 파싱 : 공유 SQL 영역에 처음 등록될 때 ==== Peeking의 비효율성 ==== === 성별 컬럼에 M 이 99% 이고, F가 1% 들어있는 경우 === <code sql> SELECT name FROM patients WHERE sex = :input_sex_value ;
WHERE sex =‘M’;
WHERE sex =‘F’;
* <color red>한가지 별도로 쿼리의 실행계획을 확인했을때와 실제로 수행된 실행계획은 다를 수 있다.</color>