`

NOT EXISTS替代NOT IN ,EXISTS替换DISTINCT

阅读更多

用NOT EXISTS替代NOT IN 

  在子查询中,NOT IN子句将执行一个内部的排序和合并。 无论在哪种情况下,NOT IN都是最低效的 (因为它对子查询中的表执行了一个全表遍历)。 为了避免使用NOT IN ,我们可以把它改写成外连接(Outer Joins)或NOT EXISTS.

  例如:

  SELECT … 
  FROM EMP 
  WHERE DEPT_NO NOT IN (SELECT DEPT_NO 
  FROM DEPT 
  WHERE DEPT_CAT=’A’);

  为了提高效率。改写为:

 (方法一: 高效)

  SELECT …. 
  FROM EMP A,DEPT B 
  WHERE A.DEPT_NO = B.DEPT(+) 
  AND B.DEPT_NO IS NULL 
  AND B.DEPT_CAT(+) = ‘A’

  (方法二: 最高效)

  SELECT …. 
  FROM EMP E 
  WHERE NOT EXISTS (SELECT ‘X’ 
  FROM DEPT D 
  WHERE D.DEPT_NO = E.DEPT_NO 
  AND DEPT_CAT = ‘A’);
用EXISTS替换DISTINCT 

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

  例如:

  低效:

  SELECT DISTINCT DEPT_NO,DEPT_NAME 
  FROM DEPT D,EMP E 
  WHERE D.DEPT_NO = E.DEPT_NO

 高效:

  SELECT DEPT_NO,DEPT_NAME 
  FROM DEPT D 
  WHERE EXISTS ( SELECT ‘X’ 
  FROM EMP E 
  WHERE E.DEPT_NO = D.DEPT_NO);

  EXISTS 使查询更为迅速,因为RDBMS核心模块将在子查询的条件一旦满足后,立刻返回结果。

识别‘低效执行’的SQL语句

  用下列SQL工具找出低效SQL:

  SELECT EXECUTIONS , DISK_READS, BUFFER_GETS, 
  ROUND((BUFFER_GETS-DISK_READS)/BUFFER_GETS,2) Hit_radio, 
  ROUND(DISK_READS/EXECUTIONS,2) Reads_per_run, 
  SQL_TEXT 
  FROM V$SQLAREA 
  WHERE EXECUTIONS>0 
  AND BUFFER_GETS > 0 
  AND (BUFFER_GETS-DISK_READS)/BUFFER_GETS < 0.8 
  ORDER BY 4 DESC;

  (虽然目前各种关于SQL优化的图形化工具层出不穷,但是写出自己的SQL工具来解决问题始终是一个最好的方法)

转自:http://blog.csdn.net/zhuangzhineng/archive/2009/08/19/4463396.aspx

分享到:
评论

相关推荐

    mysql not in、left join、IS NULL、NOT EXISTS 效率问题记录

    NOT IN、JOIN、IS NULL、NOT EXISTS效率对比 语句一:select count(*) from A where A.a not in (select a from B) 语句二:select count(*) from A left join B on A.a = B.a where B.a is null 语句三:select ...

    Oracle数据库Sql性能调优

    1.20 用NOT EXISTS替代NOT IN 12 1.21 用表连接替换EXISTS 13 1.22 用EXISTS替换DISTINCT 13 1.23 识别’低效执行’的SQL语句 14 1.24 用索引提高效率 14 1.25 索引的操作 15 1.26 多个平等的索引 16 1.27 等式比较...

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

    2.4.5 用NOT EXISTS替代NOT IN 9 2.4.6 用表连接替换EXISTS 9 2.4.7 用EXISTS替换DISTINCT 10 2.4.8 减少对表的查询 10 2.4.9 避免循环(游标)里面嵌查询 11 2.4.10 尽量用union all替换union 13 2.4.11 使用DECODE...

    sql中exists的用法

    sql server中exists的用法简介

    数据库的操作练习和讲解

    萨师煊、王珊老师的 ... select * from teacher where tid not in ( select distinct tid from tb ) 或者 select * from teacher where not exists ( select * from tb where teacher.tid=tb.tid )

    关系型数据库性能体系设计和效率提升.docx

    7.9 用EXISTS替代IN 22 7.10 用表连接替换EXISTS 23 7.11用EXISTS替换DISTINCT 24 7.12 尽量用union all替换union 24 7.13 使用DECODE函数来减少处理时间 24 7.14 尽量避免用order by 25 7.15 用Where子句替换HAVING...

    使用GROUP BY的时候如何统计记录条数 COUNT(*) DISTINCT

    例如这样一个表,我想统计email和passwords都不相同的记录的条数 复制代码 代码如下: CREATE TABLE IF NOT EXISTS `test_users` ( `email_id` int(11) unsigned NOT NULL auto_increment, `email` char(100) NOT ...

    城院数据库系统原理实验9.doc

    select LastName,FirstName from Employees where not exists( select * from Orders where Employees.EmployeeID=EmployeeID ) select LastName,FirstName from Employees where EmployeeID in( select EmployeeID...

    SQL语句教程.doc

    DISTINCT 3 WHERE 4 AND OR 5 IN 5 BETWEEN 6 LIKE 7 ORDER BY 8 函数 10 COUNT 11 GROUP BY 12 HAVING 13 ALIAS 13 表格链接 15 外部链接 16 CONCATENATE 17 SUBSTRING 18 TRIM 19 表格处理 21 CREATE TABLE 21 ...

    Navicat连接postgreSQL 报错error:column找不到,亲测是Navicat版本不够,下载12版本有用-附件资源

    Navicat连接postgreSQL 报错error:column找不到,亲测是Navicat版本不够,下载12版本有用-附件资源

    微软内部资料-SQL性能优化5

    If even one column in the query is not part of the index, the data rows must be accessed. The leaf level of an index is the only level that contains every key value, or set of key values. For a ...

    COM Standard Library

    However, such functions should have fairly distinct names because they will still be in the global namespace; that is, they will be callable from anywhere in the script. If a library file uses #...

    oracle的sql优化

    用Exist或Not Exists来代理In。In进行子查询效率很差。 5.SQL语句分析  通过SQLPLUS中的SET TRACE 功能对Sql语句的性能进行分析  通过Toad或PL/SQL Developer对语句的性能进行和索引的使用情况进行分析  对Oracle...

    T-SQL高级查询

    exists和not exists查询需要内部查询和外部查询进行一个关联的条件,如果没有这个条件将是查询到的所有信息。如:id等于student.id; # some、any、all子句查询示例 查询班级的学生年龄大于班级的学生的年龄的...

    MOOC-数据库系统概论-实验操作之多表查询.pdf

    查询选修了全部课程的学⽣姓名(输出列为:SNAME) SELECT Sname FROM Student WHERE NOT EXISTS (SELECT * FROM Course WHERE NOT EXISTS (SELECT * FROM SC WHERE Sno= Student.Sno AND Cno= Course.Cno));...

    3、查询与增删改操作

    / 最小值MIN()3、连接查询(1)内连接查询(2)外连接查询(3)复合条件连接查询4、子查询(1)带ANY/SOME和ALL关键字的子查询(2)带EXISTS/NOT EXISTS关键字的子查询(3)使用操作符的子查询5

    Oracle SQL最佳实践

    1.用EXISTS代替DISTINCT,消除sort operation  2.如果在GROUP BY中过滤数据,在WHERE从句中指定条件比在HAVING从句中有更好的性能,因为在GROUP之前已经过滤掉数据,因此更少的行被汇总  3.UNION会对两个SELECT...

    wireless sensor network 2010

    what already exists and how these networks can further be improved and advanced by pointing out grand research challenges in the final chapter of the book. Chapter 1 is a comprehensive introduction to...

    Dundas.Chart.for.Winform.Enterprise.v7.1.0.1812.for.VS2008

    This property only exists in the WinForms Chart. The ASP.NET Chart ignores this property by default now. Chart .NET: Stacked Column + 3D throws an Index was out of range exception when series have a ...

    sql游标实例,更新行

    Select Distinct FBillNo From tmp_Last Open subgroup Fetch Next From subgroup Into @BillNo While @@FETCH_STATUS = 0 Begin set @i =1 Declare detail Cursor For Select FDetailID From tmp_Last Where ...

Global site tag (gtag.js) - Google Analytics