前两天,在给一只report写一个Validation Set.发现把这三个table PO_AGENTS PA, PER_PEOPLE_F PAPF,HR_LOCATIONS_ALL_TL HL 串起来后语句执行的像蜗牛一样慢啊,用户每次跑个报表是都会抱怨说在挑选参数时太慢。不得不优化语句啊。后来想用用oralce 的优化器rule(基于规则)来优化语句。但是依然很慢。无意间看到了Use_NL()。没想到还真的有效果。当然我们也可以通过新建Index的方式来实现语句的速度。主要是我们公司每上传一支程式到正式环境走的签核流程实在太多太慢。让人根本不想去走那繁琐的流程。后来上网查了一下Use_NL()的用法。现在整理一下,给有需要的兄弟分享一下。
ORDERED好理解,就是表示根据 from 后面表的顺序join,从左到右,左边的表做驱动表
USE_NL(),先看看oracle doc怎么说:
In this statement, the USE_NL hint explicitly chooses a nested loops join with the customers table as the inner table:
SELECT /*+ ORDERED USE_NL(customers) to get first row faster */
accounts.balance, customers.last_name, customers.first_name
FROM accounts, customers
WHERE accounts.customer_id = customers.customer_id;
customers 作为inner table,也就是说作为被驱动表。驱动表称为outer table。
也就是说use_nl如果只带了一个表名作为参数,则该表为被驱动表。
如果带了2个以上的参数,oracle 并没有指出 use_nl(a b) 中 哪个是驱动表,所以常使用 ordered 或者 full() 或者 index() 来强化我们的目标
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
试验模拟:
t2: 27325 rows, object_id 上有索引in1
t3: 7326 rows,无索引
两表都已经分析
1.有ordered,按照t3驱动t2的顺序join