伪指令可以变更查询计划。可以使用特定伪指令来强制优化器选择特定类型的查询计划,例如一个使用散列连接和查询中显示表的顺序的查询计划。
以下示例显示了伪指令如何变更查询计划。
SELECT * FROM emp,job,dept WHERE emp.location = 10 AND emp.jobno = job.jobno AND emp.deptno = dept.deptno AND dept.location = "DENVER";
ix1:emp(empno、jobno、deptno、location) ix2:job (jobno) ix3:dept (location)
QUERY: ------ SELECT * FROM emp,job,dept WHERE emp.location = "DENVER" AND emp.jobno = job.jobno AND emp.deptno = dept.deptno AND dept.location = "DENVER" Estimated Cost: 5 Estimated # of Rows Returned: 1 1) gbasedbt.emp: INDEX PATH Filters: gbasedbt.emp.location = 'DENVER' (1) Index Keys: empno jobno deptno location (Key-Only) 2) gbasedbt.dept: INDEX PATH Filters: gbasedbt.dept.deptno = gbasedbt.emp.deptno (1) Index Keys: location Lower Index Filter: gbasedbt.dept.location = 'DENVER' NESTED LOOP JOIN 3) gbasedbt.job: INDEX PATH (1) Index Keys: jobno (Key-Only) Lower Index Filter: gbasedbt.job.jobno = gbasedbt.emp.jobno NESTED LOOP JOIN
图: 不使用伪指令的可能查询计划
图: 使用伪指令的可能查询计划
QUERY: ------ SELECT {+ORDERED, INDEX(emp ix1), FULL(job), USE_HASH(job /BUILD), USE_HASH(dept /BUILD), INDEX(dept ix3)} * FROM emp,job,dept WHERE emp.location = 1 AND emp.jobno = job.jobno AND emp.deptno = dept.deptno AND dept.location = "DENVER" DIRECTIVES FOLLOWED: ORDERED INDEX ( emp ix1 ) FULL ( job ) USE_HASH ( job/BUILD ) USE_HASH ( dept/BUILD ) INDEX ( dept ix3 ) DIRECTIVES NOT FOLLOWED: Estimated Cost: 7 Estimated # of Rows Returned: 1 1) gbasedbt.emp: INDEX PATH Filters: gbasedbt.emp.location = 'DENVER' (1) Index Keys: empno jobno deptno location (Key-Only) 2) gbasedbt.job: SEQUENTIAL SCAN DYNAMIC HASH JOIN Dynamic Hash Filters: gbasedbt.emp.jobno = gbasedbt.job.jobno 3) gbasedbt.dept: INDEX PATH (1) Index Keys: location Lower Index Filter: gbasedbt.dept.location = 'DENVER' DYNAMIC HASH JOIN Dynamic Hash Filters: gbasedbt.emp.deptno = gbasedbt.dept.deptno