About me:Oracle ACE pro,optimistic,passionate and harmonious. Focus on ORACLE,MySQL and other database programming,peformance tuning,db design, j2ee,Linux/AIX,Architecture tech,etc
全部博文(172)
分类: Oracle
2023-05-08 15:33:16
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无效。