HINTS之qb_name和失效情形

840阅读 0评论2023-05-08 dingjun123
分类:Oracle

HINTS之查询块query block:
  对于不在同一层的,不能直接用HINTS来访问,比如这个例子的子查询b与a不在同一层,内部使用query block实现,诸如SEL$n,DEL$n,UPD$n,MRG$n,然后用@query_block访问,如例子中的LEADING(@"SEL$5DA710D3" "B"@"SEL$2" "A"@"SEL$1")

HINTS之自定义query block:
  
自定义查询块使用qb_name hints,然后访问是用别名@query_block,实现hints可以引用不在同一层的对象。

SELECT/*+leading(b@subq,a) use_hash(a)*/ * FROM a

WHERE exists

(SELECT/*+qb_name(subq)*/ 1 FROM b

 WHERE a.object_id = b.object_id);



HINTS失效的场景:
1)
HINTS要使用别名,否则失效
2)
对于视图对象的hints,要用视图别名.对象别名
3)
语义不正确的,如果使用hints可能结果不对
4)
优化器觉得hints不好的
5)
HINTS未被采用有很多情况,主要是符合语法语义以及对应hints使用场景。

看下面两个例子的区别:


 使用hints能否用上索引,要看语义是否正确,因为OBJECT_ID没有NOT NULL约束,强制使用hints无效。

上一篇:使用HINTS控制执行计划
下一篇:使用索引进行高效分页pagination_PART1