`
ylz4647
  • 浏览: 49824 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
社区版块
存档分类
最新评论

关于ORDERED 和 USE_NL() hint

 
阅读更多

参考和引用: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函数

    介绍了oracle中的hint,常用的 ordered、use_nl、use_hash、index、full 五种, 给出使用实例和适用场景

    让Oracle跑得更快 Oracle 10g性能分析与优化思路.part2.rar

    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...

    让Oracle跑得更快 Oracle 10g性能分析与优化思路.part1.rar

    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...

    MySQL中一些优化straight_join技巧

    use_nl hint指示查询优化器使用nested loops方式连接指定表和其他行源,并且将强制指定表作为inner表。 在mysql中就有之对应的straight_join,由于mysql只支持nested loops的连接方式,所以这里的straight_join类似...

    oracle CBO HINT

    - `ORDERED` HINT:指示CBO保持查询结果的顺序,常与子查询和游标相关联。 - `FIRST_ROWS` HINT:优化器将优先返回前几行,适合于需要快速返回初步结果的场景。 4. **统计信息**: - `ANALYZE TABLE` 语句用于...

    Oracle hint

    - `/*+ USE_NL(TABLE) */`:强制使用嵌套循环连接,用于连接操作。 9. **CARTESIAN** - `/*+ CARTESIAN */`:指示使用笛卡尔积连接,尽管这通常不是优化查询的首选策略。 10. **NESTED_LOOPS** - `/*+ NESTED_...

    使用hint强制基于规则的查询优化

    其中一个可以选择的优化方式是dba通过分析表的结构,数据量,索引结构等信息,通过hint/*ordered*/和索引hint/*index(table_name index_name)*/强制oracle的执行路径.极端情况下,这种优化可以提高的查询速度是非常可观...

    ORACLE优化

    ### 使用ORDERED和USE_NL提示 `ORDERED`提示用于指定SQL语句中的表连接顺序,可以配合`USE_NL`提示使用,以控制表连接的具体方式,确保查询按照最有效的顺序进行,从而提高查询效率。 ### 使用FIRST_ROWS提示 `...

    ORDERED Hint in Complex Searches

    Subject: ORDERED Hint in Complex Searches Doc ID: 408049.1 Type: PROBLEM Modified Date : 08-JUL-2009 Status: PUBLISHED

    ordered-map:保留插入顺序的C ++哈希映射和哈希集

    这种设计简化了集成过程,用户可以直接在项目中包含`<ordered_map>`头文件即可使用。 ### 3. 兼容性和API设计 库的设计目标是与`std::unordered_map`保持尽可能的兼容性,允许开发者轻松地替换已有的`std::...

    PyPI 官网下载 | orderedset-1.2.tar.gz

    描述简洁明了,告诉我们资源来源于PyPI官网,具体是`orderedset-1.2.tar.gz`,这通常是一个压缩文件,包含了`orderedset`库的所有源代码和必要的元数据,以便开发者能够在他们的Python项目中使用或进一步开发这个库...

    利用Oracle执行计划机制提高查询性能

    例如,通过在查询中使用"/*+ ordered use_nl(bonus) parallel(e, 4) */"这样的提示,可以指示优化器按照特定的顺序执行连接,并使用嵌套循环(nested loop)和并行执行(parallel)等策略。 总结来说,理解Oracle的...

    java ordered接口应用

    Java中的`Ordered`接口主要用在需要定义顺序或者排列规则的场景,特别是在Spring框架中,它在Bean的初始化和销毁顺序、AOP切面的执行顺序等方面起到关键作用。`Ordered`接口仅包含一个方法`getOrder()`,返回一个...

    rand_unique_pairs(N , pair_num,ordered, self_pair):该函数随机生成唯一的整数对,有序或无序。-matlab开发

    这个函数可以方便地从大量变量中采样成对相关。 输入参数: N:定义数字的范围(从 1 到 N) pair_num:对的数量有序:1 表示有序对,0 表示无序。 默认值为 0。 self_pair: 1 允许自配对(例如,3-3 是自配对)。...

    Oracle表连接方式

    可以用ordered提示来改变CBO默认的驱动表,或者用USE_NL(table_name1 table_name2)提示来强制使用nested loop。 HASH JOIN HASH JOIN是CBO做大数据集连接时的常用方式。优化器扫描小表(或数据源),利用连接键...

    ordered_find

    gem 'ordered_find' 然后执行: $ bundle 或者自己安装: $ gem install ordered_find 用法 SomeModel.ordered_find([1, 3, 2, 1]) => [#, #, #, #] 或者 SomeModel.ordered_find(1, 3, 2) SomeModel....

    SQL语句优化过程策略,帮助您优化Oracle查询语句

    SELECT /*+ ORDERED USE_NL(BSEMPMS) */ BSDPTMS.DPT_NO, BSEMPMS.EMP_NO, BSEMPMS.EMP_NAM FROM BSEMPMS, BSDPTMS WHERE BSEMPMS.DPT_NO = BSDPTMS.DPT_NO; ``` ##### /*+USE_MERGE(TABLE)*/ - **含义**:此...

    Python库 | ordered_argparse-1.0.10-py3-none-any.whl

    资源分类:Python库 所属语言:Python 资源全名:ordered_argparse-1.0.10-py3-none-any.whl 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059

    oracle_hints

    例如,如果`employees`表有`emp_id`和`dept_id`两个索引,但优化器选择了全表扫描,你可以加入hint `/*+ USE_INDEX(emp employees.emp_id, employees.dept_id) */` 强制使用这两个索引。 2. **连接优化**:`LEADING...

    用智能优化限制提高Oracle数据库性能

    例如,在SQL语句中添加`/*+ ordered use_nl(bonus) parallel(e,4) */`这样的Hint,可以明确指定使用嵌套循环连接(Nested Loop Join)的方式,并行执行特定的子查询,从而在某些场景下进一步提升查询效率。...

Global site tag (gtag.js) - Google Analytics