`

用EXISTS替换DISTINCT

阅读更多

Oracle SQL 性能优化技巧

 

1.选用适合的ORACLE优化器
ORACLE的优化器共有3种

A、RULE (基于规则) b、COST (基于成本) c、CHOOSE (选择性)

设置缺省的优化器,可以通过对init.ora文件中OPTIMIZER_MODE参数的各种声明,如RULE,COST,CHOOSE,ALL_ROWS,FIRST_ROWS 。 你当然也在SQL句级或是会话(session)级对其进行覆盖。

为了使用基于成本的优化器(CBO, Cost-Based Optimizer) , 你必须经常运行analyze 命令,以增加数据库中的对象统计信息(object statistics)的准确性。

如果数据库的优化器模式设置为选择性(CHOOSE),那么实际的优化器模式将和是否运行过analyze命令有关。 如果table已经被analyze过, 优化器模式将自动成为CBO , 反之,数据库将采用RULE形式的优化器。

在缺省情况下,ORACLE采用CHOOSE优化器, 为了避免那些不必要的全表扫描(full table scan) , 你必须尽量避免使用CHOOSE优化器,而直接采用基于规则或者基于成本的优化器。

 

2.访问Table的方式
ORACLE 采用两种访问表中记录的方式:

A、 全表扫描

全表扫描就是顺序地访问表中每条记录。ORACLE采用一次读入多个数据块(database block)的方式优化全表扫描

B、 通过ROWID访问表

你可以采用基于ROWID的访问方式情况,提高访问表的效率, ROWID包含了表中记录的物理位置信息。ORACLE采用索引(INDEX)实现了数据和存放数据的物理位置(ROWID)之间的联系。通常索引提供了快速访问ROWID的方法,因此那些基于索引列的查询就可以得到性能上的提高。

 

3.共享SQL语句
为了不重复解析相同的SQL语句,在第一次解析之后,ORACLE将SQL语句存放在内存中。这块位于系统全局区域SGA(system global area)的共享池(shared buffer pool)中的内存可以被所有的数据库用户共享。 因此,当你执行一个SQL语句(有时被称为一个游标)时,如果它和之前的执行过的语句完全相同, ORACLE就能很快获得已经被解析的语句以及最好的执行路径。ORACLE的这个功能大大地提高了SQL的执行性能并节省了内存的使用。

可惜的是ORACLE只对简单的表提供高速缓冲(cache buffering),这个功能并不适用于多表连接查询。

共享的语句必须满足三个条件:

A、 字符级的比较: 当前被执行的语句和共享池中的语句必须完全相同。

B、 两个语句所指的对象必须完全相同:

C、 两个SQL语句中必须使用相同的名字的绑定变量(bind variables)。

 

4.选择最有效率的表名顺序(只在基于规则的优化器中有效)
ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,因此FROM子句中写在最后的表(基础表 driving table)将被最先处理。在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表。当ORACLE处理多个表时, 会运用排序及合并的方式连接它们。首先,扫描第一个表(FROM子句中最后的那个表)并对记录进行派序,然后扫描第二个表(FROM子句中最后第二个表),最后将所有从第二个表中检索出的记录与第一个表中合适记录进行合并。

如果有3个以上的表连接查询, 那就需要选择交叉表(intersection table)作为基础表, 交叉表是指那个被其他表所引用的表。

 

5.WHERE子句中的连接顺序
ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾。

 

8.使用DECODE函数来减少处理时间
使用DECODE函数可以避免重复扫描相同记录或重复连接相同的表。

 

13.计算记录条数
和一般的观点相反,count(*) 比count(1)稍快,当然如果可以通过索引检索,对索引列的计数仍旧是最快的。例如 COUNT(EMPNO)

 

21.用EXISTS替换DISTINCT
当提交一个包含一对多表信息(比如部门表和雇员表)的查询时,避免在SELECT子句中使用DISTINCT。 一般可以考虑用EXIST替换

select distinct u.oid, u.cust_id, u.cust_name
                 from
                 d_user             u, 
                  d_user_map map   
                where u.status = 1 and map.user_oid = u.oid
                  
        
  select u.oid, u.cust_id, u.cust_name
                 from
                 d_user             u 
                where u.status = 1 and
                   exists (select 1 from   d_user_map map  where
                    map.user_oid = u.oid)
                  

分享到:
评论

相关推荐

    Oracle SQL编写规范

    在编写SQL语句时,用EXISTS替换DISTINCT可以提高执行效率。 14. 识别'低效执行'的SQL语句 在编写SQL语句时,识别'低效执行'的SQL语句可以提高执行效率。 15. 用EXPLAIN PLAN工具分析SQL语句 在编写SQL语句时,用...

    SQL性能调优

    最后,需要注意常用关键字优先级,使用EXISTS替代IN,使用NOT EXISTS替代NOT IN,使用表连接替换EXISTS,使用 EXISTS替换DISTINCT,避免在索引列上使用IS NULL和IS NOT NULL等。 SQL性能调优是一项非常重要的技术,...

    Oracle SQL性能

    #### 十二、用EXISTS替换DISTINCT 在某些情况下,使用EXISTS子查询代替DISTINCT可以提高查询性能。DISTINCT需要先对结果集进行排序,然后再去除重复值,而EXISTS则不需要这个过程。因此,如果只需要检查是否存在某...

    Oracle+SQL大全解析

    用UNION替代OR,用IN替换OR,以及用EXISTS替换DISTINCT都是常见的优化手段。使用索引时,还要注意索引的创建、管理和操作,如何在不改变索引列类型的前提下优化性能。在优化GROUP BY时,可以考虑使用并行查询和哈希...

    OracleSql脚本书写规范

    用EXISTS替换DISTINCT** 如果只是为了检测是否存在唯一值,使用EXISTS通常更快,因为它不需要创建临时结果集。 **14. 使用UNION-ALL和UNION** 如果不需要消除重复行,使用UNION-ALL代替UNION可以节省去重的时间...

    sql优化技巧

    用EXISTS替换DISTINCT** 在某些情况下,使用EXISTS代替DISTINCT可以提高查询性能。这是因为DISTINCT需要对结果集进行排序和去重,而EXISTS只需要检查是否存在满足条件的行。 **13. 用UNION-ALL替换UNION** UNION...

    经常要用的DB2优化

    #### 十二、用EXISTS替换DISTINCT - **DISTINCT与EXISTS的比较**:在查询一对多关系的表时,使用EXISTS代替DISTINCT可以使查询更加高效。 - **例子**: - **低效**: `SELECT DISTINCT DEPT_NO, DEPT_NAME FROM ...

    PLSQL程序优化和性能分析方法

    7. 用EXISTS替换DISTINCT:EXISTS可以避免全表扫描,减少计算量。 8. 减少对表的查询次数,通过批量操作和缓存数据来提高效率。 9. 避免在循环中嵌套查询,尽可能将查询逻辑移出循环。 10. 使用UNION ALL代替UNION,...

    SQL编写规范

    #### 五、规范四:用EXISTS替换DISTINCT 在某些场景下,如果查询中包含一对多的表信息,且需要去除重复数据,则使用 `DISTINCT` 可能会导致性能下降。这时可以考虑使用 `EXISTS` 替代 `DISTINCT`,因为 `EXISTS` 在...

    Oracle语句规划详解

    用EXISTS替换DISTINCT - **规则描述**:在一对多的关系查询中,使用EXISTS子句可以提高效率,尤其是在处理大量数据时。 - **示例**:查询所有至少有一个订单的客户信息: - 低效:`SELECT DISTINCT CUST_ID FROM ...

    ORACLE SQL性能調整

    用EXISTS替换DISTINCT 在查询中,使用EXISTS代替DISTINCT可以减少数据排序和去重操作,提升查询速度。 #### 17. 识别低效执行的SQL语句 通过SQL监控工具,如AWR报告,可以识别出执行效率低下的SQL语句,并对其...

    Oracle SQL优化

    ##### 3.21 用EXISTS替换DISTINCT - **方法**: 在查询中使用EXISTS来避免DISTINCT带来的性能损失。 ##### 3.22 识别“低效执行”的SQL语句 - **工具**: 使用Oracle提供的性能监控工具,如V$SQL、V$SESSION等。 #...

    Oracle SQL优化.pdf

    用EXISTS替换DISTINCT** 使用`EXISTS`子查询来代替`DISTINCT`关键字,可以避免全表扫描,提高查询速度。 **19. 识别“低效执行”的SQL语句** 定期审查执行计划,找出执行效率低下的SQL语句,并进行优化。 **20. ...

    ORACLE+SQL性能调整

    19. **用 EXISTS 替换 DISTINCT**:在某些情况下,用 EXISTS 能避免 DISTINCT 的额外处理。 20. **使用 TKPROF 工具**:通过 TKPROF 分析 SQL 执行计划,找出性能瓶颈。 21. **用 EXPLAIN PLAN 分析 SQL 语句**:...

    Oracle SQL性能优化.doc

    #### 十八、用EXISTS替换DISTINCT - **DISTINCT与EXISTS**:使用EXISTS来实现DISTINCT的效果可以提高查询效率。 #### 十九、识别"低效执行"的SQL语句 - **性能分析**:定期检查SQL执行计划,识别并优化低效的SQL...

    Oracle+SQL优化

    **3.21 用EXISTS替换DISTINCT** - **问题**:`DISTINCT`操作可能涉及排序和去重,消耗额外资源。 - **建议**:使用`EXISTS`和子查询来替代`DISTINCT`,特别是在大型数据集上。 #### 四、识别低效SQL语句 - **问题...

    Oracle Sql 优化

    ##### 3.18 用EXISTS替换DISTINCT 在某些情况下,使用`EXISTS`代替`DISTINCT`可以简化查询,提高效率,特别是当关注的是记录是否存在而非具体数值时。 ##### 3.19 识别低效执行的SQL语句 定期审查SQL执行计划,...

    SQL编码规范.pdf

    - **建议6.15 用EXISTS替换DISTINCT**:在某些场景下,使用EXISTS代替DISTINCT可以减少处理时间。 - **建议6.17 避免在索引列上使用计算**:计算会导致索引失效,从而降低查询效率。 - **建议6.18 避免在索引列上...

    ORACLE_SQL优化

    ##### 3.21 用EXISTS替换DISTINCT - **问题描述**:DISTINCT操作可能导致额外的数据处理。 - **优化建议**:使用EXISTS来避免重复记录的处理。 ##### 3.22 识别“低效执行”的SQL语句 - **问题描述**:某些SQL...

Global site tag (gtag.js) - Google Analytics