参考和引用:http://blog.itpub.net/post/26/12950
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;
并且USE_NL(t2)也表示t2作为inner table,也就是被驱动表;
没有矛盾
代码:
--------------------------------------------------------------------------------
SQL> select /*+ ordered USE_NL(t2) */ count(*)
2 from t3,t2
3 where t2.object_id=t3.object_id;
COUNT(*)
----------
7325
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=7365 Card=1 Bytes=8)
1 0 SORT (AGGREGATE)
2 1 NESTED LOOPS (Cost=7365 Card=7325 Bytes=58600)
3 2 TABLE ACCESS (FULL) OF 'T3' (Cost=39 Card=7326 Bytes=29304)
4 2 INDEX (RANGE SCAN) OF 'IN1' (NON-UNIQUE) (Cost=1 Card=1 Bytes=4)
--------------------------------------------------------------------------------
2.有ordered,按照t3驱动t2的顺序join;
但是USE_NL(t3)却表示t3作为inner table,也就是被驱动表;
有矛盾,所以oracle 忽视这个hint,执行hash join
代码:
--------------------------------------------------------------------------------
SQL> select /*+ ordered USE_NL(t3) */ count(*)
2 from t3,t2
3 where t2.object_id=t3.object_id;
COUNT(*)
----------
7325
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=48 Card=1 Bytes=8)
1 0 SORT (AGGREGATE)
2 1 HASH JOIN (Cost=48 Card=7325 Bytes=58600)
3 2 TABLE ACCESS (FULL) OF 'T3' (Cost=39 Card=7326 Bytes=29304)
4 2 INDEX (FAST FULL SCAN) OF 'IN1' (NON-UNIQUE) (Cost=4 Card=27325 Bytes=109300)
--------------------------------------------------------------------------------
3.单独使用ordered是执行hash join,也用来选择驱动表(join顺序)
代码:
--------------------------------------------------------------------------------
SQL> select /*+ ordered */ count(*)
2 from t3,t2
3 where t2.object_id=t3.object_id;
COUNT(*)
----------
7325
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=48 Card=1 Bytes=8)
1 0 SORT (AGGREGATE)
2 1 HASH JOIN (Cost=48 Card=7325 Bytes=58600)
3 2 TABLE ACCESS (FULL) OF 'T3' (Cost=39 Card=7326 Bytes=29304)
4 2 INDEX (FAST FULL SCAN) OF 'IN1' (NON-UNIQUE) (Cost=4 Card=27325 Bytes=109300)
SQL> select /*+ ordered */ count(*)
2 from t2,t3
3 where t2.object_id=t3.object_id;
COUNT(*)
----------
7325
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=52 Card=1 Bytes=8)
1 0 SORT (AGGREGATE)
2 1 HASH JOIN (Cost=52 Card=7325 Bytes=58600)
3 2 INDEX (FAST FULL SCAN) OF 'IN1' (NON-UNIQUE) (Cost=4 Card=27325 Bytes=109300)
4 2 TABLE ACCESS (FULL) OF 'T3' (Cost=39 Card=7326 Bytes=29304)
--------------------------------------------------------------------------------
4。第2个例子中,如果t3.object_id也建索引,仍然走hash join,只不过都变成FAST FULL SCAN
原因同2。当然,变成FAST FULL SCAN是因为select count(*),如果是select *的话就会是FTS了。
代码:
--------------------------------------------------------------------------------
SQL> create index in3 on t3(object_id);
索引已创建。
SQL> set autot on
SQL> select /*+ ordered USE_NL(t3) */ count(*)
2 from t3,t2
3 where t2.object_id=t3.object_id;
COUNT(*)
----------
7325
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=13 Card=1 Bytes=8)
1 0 SORT (AGGREGATE)
2 1 HASH JOIN (Cost=13 Card=7325 Bytes=58600)
3 2 INDEX (FAST FULL SCAN) OF 'IN3' (NON-UNIQUE) (Cost=4 Card=7326 Bytes=29304)
4 2 INDEX (FAST FULL SCAN) OF 'IN1' (NON-UNIQUE) (Cost=4 Card=27325 Bytes=109300)
--------------------------------------------------------------------------------
相关推荐
介绍了oracle中的hint,常用的 ordered、use_nl、use_hash、index、full 五种, 给出使用实例和适用场景
6.4.1 use_hash,use_nl和use_merge hint 127 6.4.2 no_use_hash hint 132 6.4.3 no_use_merge hint 133 6.4.4 no_use_nl hint 133 6.5 并行执行相关的hint 134 6.5.1 parallel hint 134 6.5.2 no_parallel hint 134...
6.4.1 use_hash,use_nl和use_merge hint 127 6.4.2 no_use_hash hint 132 6.4.3 no_use_merge hint 133 6.4.4 no_use_nl hint 133 6.5 并行执行相关的hint 134 6.5.1 parallel hint 134 6.5.2 no_parallel hint 134...
use_nl hint指示查询优化器使用nested loops方式连接指定表和其他行源,并且将强制指定表作为inner表。 在mysql中就有之对应的straight_join,由于mysql只支持nested loops的连接方式,所以这里的straight_join类似...
SQL语句优化过程优化策略 ...SELECT /*+ORDERED USE_NL(BSEMPMS)*/ BSDPTMS.DPT_NO,BSEMPMS.EMP_NO,BSEMPMS.EMP_NAM FROM BSEMPMS,BSDPTMS WHERE BSEMPMS.DPT_NO=BSDPTMS.DPT_NO; 23. /*+USE_MERGE(TABLE)*/
Subject: ORDERED Hint in Complex Searches Doc ID: 408049.1 Type: PROBLEM Modified Date : 08-JUL-2009 Status: PUBLISHED
在SQL优化过程中常见HINT的用法(前10个比较常用, 前3个最常用): 1. /*+ INDEX */ 和 /*+ INDEX(TABLE INDEX1, index2) */ 和 /*+ INDEX(tab1.col1 tab2.col2) */ 和 /*+ NO_INDEX */ 和 /*+ NO_INDEX(TABLE INDEX1...
其中一个可以选择的优化方式是dba通过分析表的结构,数据量,索引结构等信息,通过hint/*ordered*/和索引hint/*index(table_name index_name)*/强制oracle的执行路径.极端情况下,这种优化可以提高的查询速度是非常可观...
OrderedDictionary, 这里库提供OrderedDictionary和MutableOrderedDictionary子类 命令行目存储在NSDictionary中的对象的顺序未定义。 通常,可以以通过一组键/值对循环,并按照插入的顺序返回对象。 这个库提供了两...
这个函数可以方便地从大量变量中采样成对相关。 输入参数: N:定义数字的范围(从 1 到 N) pair_num:对的数量有序:1 表示有序对,0 表示无序。 默认值为 0。 self_pair: 1 允许自配对(例如,3-3 是自配对)。...
ordered-map:保留插入顺序的C ++哈希映射和哈希集
资源来自pypi官网。 资源全名:orderedset-1.2.tar.gz
gem 'ordered_find' 然后执行: $ bundle 或者自己安装: $ gem install ordered_find 用法 SomeModel.ordered_find([1, 3, 2, 1]) => [#, #, #, #] 或者 SomeModel.ordered_find(1, 3, 2) SomeModel....
java ordered接口应用,和gradle配置下部署了一个spring boot项目,并且写了一个例子,解压直接部署就可以用
资源分类:Python库 所属语言:Python 资源全名:ordered_argparse-1.0.10-py3-none-any.whl 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
M13OrderedDictionary, 带有有序对象和键的NSDictionary M13OrderedDictionaryM13OrderedDictionary是NSArray和NSDictionary之间的交叉。 它包含一个有序的对象和键列表。 所有这些都可以通过索引或者键访问。 这里...
bubble_plot 嗨,大家好! 我喜欢数据可视化! 而且,如果您也喜欢它们,我想您会发现这个泡泡图非常有用。... 功能签名: bubble_plot ( df , x , y , z_boolean = None , ordered_x_values = None , ordered_y_v
简而言之, OrderedSet是Array和Set的混合体。 像Array一样,它的元素具有定义的顺序,但是它像Set一样在其成员上强制唯一性。 在以下情况下,可以使用OrderedSet替代Array : 元素类型符合Hashable (例如Int , ...
last event might point to some random place in the list as it s the last queued event. We expect that the new event is close to this.
cartographer_2d 简介 这个 repository 旨在让更多人看到后可以更好的理解 google cartographer 这个项目的代码,不过由于我的项目主要是用到 2d 这一块,所以我删减掉了 mapping_3d 这个文件夹的内容,并将代码中...