伪指令可以变更查询计划。可以使用特定伪指令来强制优化器选择特定类型的查询计划,例如一个使用散列连接和查询中显示表的顺序的查询计划。
以下示例显示了伪指令如何变更查询计划。
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