`

【转】Oracle优化之旅:使用leading, use_nl, rownum调优例子

阅读更多
注意:本文章为转帖,只为学习记录。原文链接http://blog.chinaunix.net/u/28618/showart_353192.html

1、使用leading和use_nl来设置表的查询顺序,来加快查询速度,一般把小表设为第一个表。
/*+LEADING(TABLE)*/
  将指定的表作为连接次序中的首表.
/*+USE_NL(TABLE)*/
  将指定表与嵌套的连接的行源进行连接,并把指定表作为内部表.
成本计算方法:
设小表100行,大表100000行。

两表均有索引:
如果小表在内,大表在外(驱动表)的话,则扫描次数为:
100000+100000*2 (其中2表示IO次数,一次索引,一次数据)
如果大表在内,小表在外(驱动表)的话,则扫描次数为:
100+100*2.

两表均无索引:
如果小表在内,大表在外的话,则扫描次数为:
100000+100*100000
如果大表在内,小表在外的话,则扫描次数为:
100+100000*100

注意:如果一个表有索引,一个表没有索引,ORACLE会将没有索引的表作驱动表。如果两个表都有索引,则外表作驱动表。如果两个都没索引的话,则也是外表作驱动表。

2、使用index直接匹配索引来查询数据提高查询速度
/*+INDEX(TABLE INDEX_NAME)*/
  表明对表选择索引的扫描方法.
3、当判断某几个表中是否存在某种关系的行时可使用rownum=1来作为条件而加快速度,如果必须有多行才满足条件时,可设置rownum <= n。
例如:获得一个v_count值判断是否大于0
equipment表 几万条,controledpnsnrange 几千条
select count(sc.pmnum)
  into v_count
  from equipment e,
       sal_controledpnsnrange sc
 where (sc.new_min_item_no <= e.itemnum)
   and (sc.new_max_item_no >= e.itemnum)
   and (sc.new_min_serial_no <= e.serialnum)
   and (sc.new_max_serial_no >= e.serialnum)
   and e.itemnum = a_item_no;

执行时间大约为3分钟。
代码修改后:
select /*+ leading(e) use_nl(sc) */
       count(sc.pmnum)
  into v_count
  from equipment e,
       sal_controledpnsnrange sc
 where (sc.new_min_item_no <= e.itemnum)
   and (sc.new_max_item_no >= e.itemnum)
   and (sc.new_min_serial_no <= e.serialnum)
   and (sc.new_max_serial_no >= e.serialnum)
   and e.itemnum = a_item_no;

执行时间大约为45秒。
代码再次修改后:
select /*+ leading(e) use_nl(sc) */
       count(sc.pmnum)
  into v_count
  from equipment e,
       sal_controledpnsnrange sc
 where (sc.new_min_item_no <= e.itemnum)
   and (sc.new_max_item_no >= e.itemnum)
   and (sc.new_min_serial_no <= e.serialnum)
   and (sc.new_max_serial_no >= e.serialnum)
   and e.itemnum = a_item_no
   and rownum = 1;

执行时间大约为4秒。
分享到:
评论
1 楼 fanth 2011-02-15  
正好今天用上了,多谢!

相关推荐

    oracle查询效率调优实例

    这些技术包括正确使用 `LEADING` 和 `USE_NL` 提示来指导连接顺序和连接算法的选择,利用 `INDEX` 提示来利用索引,以及使用 `ROWNUM` 来限制结果集的大小。掌握这些技巧对于提高 Oracle 查询效率至关重要。

    oracle rownum 的使用 和sqlserver有区别的!

    ### Oracle ROWNUM 使用详解与 SQL Server 区别 在数据库操作中,ROWNUM 是一个非常重要的伪列,主要用于返回查询结果的行序号。它在 Oracle 数据库中有着广泛的应用场景,尤其是在需要对查询结果进行分页显示、...

    ROWNUM的使用技巧

    ROWNUM 的使用技巧和陷阱 ROWNUM 是 Oracle 中的一种伪列,它可以根据返回记录生成一个序列化的数字。利用 ROWNUM,我们可以生产一些原先难以实现的结果输出,但是因为它是伪列的特殊性,在使用时需要注意一些事项...

    Mysql转oracle工具

    例如,MySQL支持的`LIMIT`在Oracle中需用`ROWNUM`或`FETCH FIRST`来实现分页;MySQL的`INFORMATION_SCHEMA`在Oracle中对应的是`DBA_`或`USER_`视图;此外,存储过程、触发器和函数的语法也有区别。 2. **数据类型...

    ORACLE 中ROWNUM用法总结

    在Oracle数据库中,`ROWNUM`是一个非常有用的伪列,用于限制查询结果的行数,尤其是在处理大数据量或进行分页查询时。然而,`ROWNUM`的使用并不直观,尤其是当涉及到比较运算符(如`&gt;`, `&gt;=`, `=`等)时,容易引发...

    oracle rownum 学习

    Oracle ROWNUM学习 Oracle ROWNUM是Oracle系统顺序分配的行号,用于限制查询返回的总行数。ROWNUM是一个伪字段,不能以任何表的名称作为前缀。下面是对ROWNUM的详细讲解: 一、ROWNUM的基本用法 ROWNUM是一个伪...

    Oracle里抽取随机数的多种方法

    Oracle 中抽取随机数的多种方法 在 Oracle 中抽取随机数是许多应用场景中常见的问题,例如在某个活动中需要随机取出一些符合条件的...使用 dbms_random 程序包可以方便地生成随机数,并且可以根据需要进行调整和优化。

    oracle rownum和distinct

    "Oracle 中的 ROWNUM 和 DISTINCT" Oracle 中的 ROWNUM 和 DISTINCT 是两个非常重要的关键词,它们在查询数据时发挥着至关重要的作用。然而,许多开发者在使用这两个关键词时,却常常会遇到一些不太理解的地方,...

    在oracle中灵活使用Rownum和rowId

    ### 在Oracle中灵活使用Rownum和RowId 在Oracle数据库中,`ROWNUM` 和 `ROWID` 是两个非常重要的概念,它们可以帮助我们在查询数据时实现更灵活的数据管理。本文将详细介绍这两个概念的区别及其使用方法,并通过...

    oracle之SQL优化

    Oracle数据库是全球广泛使用的大型关系型数据库管理系统之一,SQL(结构化查询语言)是与数据库交互的基础工具。在Oracle环境中,SQL优化对于提升系统性能、减少资源消耗至关重要。本篇文章将深入探讨Oracle中的SQL...

    对于 Oracle 的 rownum 问题

    对于 Oracle 的 rownum 问题,很多资料都说不支持&gt;,&gt;=,=,between...and,只能用以上符号(&lt;、、!=),并非说用&gt;,&gt;=,=,between..and 时会提示SQL语法错误,而是经常是查不出一条记录来,还会出现似乎是莫名其妙的结果来...

    oracle DBA_TAB_MODIFICATIONS 刷新

    此外,对于使用 /*+ APPEND */ 指令的插入操作,这种优化过的插入方式仍然会被DBA_TAB_MODIFICATIONS追踪。这意味着无论何种插入方式,只要操作发生,视图都会记录下来。 当对表进行 `TRUNCATE` 操作时,DBA_TAB_...

    Oracle中rownum的使用

    Oracle中rownum的使用

    SqlServer转换Oracle.docx

    - **TOP子句**:SQL Server中的`TOP`子句在Oracle中可以使用`WHERE ROWNUM 替代。 - **GUID生成**:SQL Server中的`NEWID()`函数在Oracle中可以通过自定义函数实现,例如文档中提供的`NEWID`函数示例。 #### 六、...

    MLDN魔乐科技JAVA培训_Oracle课堂19_修改约束、ROWNUM.rar

    【标题】"MLDN魔乐科技JAVA培训_Oracle课堂19_修改约束、ROWNUM.rar"涉及的是Java编程与Oracle数据库管理的相关知识,主要聚焦在如何在Oracle数据库中修改约束以及使用ROWNUM函数进行数据筛选。 【描述】描述中提到...

    Oracle数据库通用的分页存储过程

    Oracle数据库是一种广泛使用的大型关系型数据库管理系统,其在处理大量数据时,为了提高查询效率和用户体验,往往需要采用分页查询。本主题将详细介绍Oracle数据库中的分页存储过程及其应用场景。 分页查询允许用户...

    Oracle--ROWNUM.rar_oracle

    Oracle数据库系统是世界上最广泛使用的数据库之一,尤其在企业级应用中占据重要地位。在Oracle中,`ROWNUM`是一个非常重要的概念,它涉及到数据检索、分页查询以及优化查询性能等多个方面。本篇将深入探讨`ROWNUM`的...

    Oracle.VS.Mysql

    综上所述,Oracle和MySQL在命令行工具、用户管理、SQL语法、日期处理等方面存在诸多不同之处。这些差异反映了两者设计理念和技术路线的不同,也体现了它们各自的优势和特点。对于数据库开发者来说,熟悉这两种数据库...

    Oracle DBA性能优化实践

    Hint.pdf Oracle中rowid与rownum的使用.pdf Oracle优化 之 索引.pdf Oracle优化器.pdf STATSPACK详解.pdf 学用ORACLE_AWR和ASH特性.pdf 执行计划.pdf

    Oracle语句优化规则汇总

    Oracle数据库是全球广泛使用的数据库管理系统,其性能优化是数据库管理员和开发人员的重要任务。本文将深入探讨Oracle语句优化的若干关键规则,帮助你提升数据库的运行效率。 1. **选择正确的索引策略**:索引是...

Global site tag (gtag.js) - Google Analytics