用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
分享到:
相关推荐
在SQL查询中,`EXISTS`和`NOT EXISTS`是两个非常...这两个操作符可以替代`IN`和`NOT IN`,在某些情况下提供更高的性能,尤其是在处理大量数据或复杂关联时。理解和熟练运用这些操作符,能够提高SQL查询的效率和灵活性。
MySQL中的`NOT IN`, `LEFT JOIN`, `IS NULL`, 和 `NOT EXISTS` 是四种不同的SQL查询方式,它们在特定情况下可以实现相似的功能,但实际执行效率可能会有很大差异。本文主要探讨这四种方法在处理大数据量时的性能表现...
在 SQL 中,in 和 exists 的使用场景可以互换,但是在某些情况下,exists 的效率可能要高于 in。例如: ```sql SELECT ID, NAME FROM A WHERE ID IN (SELECT AID FROM B); ``` 这个查询将返回表 A 中所有与表 B 相...
### SQL中EXISTS与IN的区别及应用场景 #### EXISTS详解 **定义与原理** - **基本概念**:`EXISTS` 是 SQL 中的一个谓词,用于判断子查询是否有结果返回,而不是关心具体的返回值。它主要关注子查询是否至少有一行...
用NOT EXISTS替代NOT IN可以提高执行效率。 13. 用EXISTS替换DISTINCT,如: 在编写SQL语句时,用EXISTS替换DISTINCT可以提高执行效率。 14. 识别'低效执行'的SQL语句 在编写SQL语句时,识别'低效执行'的SQL语句...
MySQL中的`EXISTS`和`IN`都是在SQL查询中用来检查某条记录是否符合特定条件的子查询操作符,但它们的工作原理和使用场景有所不同。 `EXISTS`子查询主要检查子查询是否能返回至少一行数据。在这个过程中,子查询的...
与使用EXISTS替代IN类似,使用NOT EXISTS代替NOT IN也可以提高查询效率。NOT EXISTS通常比NOT IN更高效,因为它只需要找到一个不存在的匹配项即可返回FALSE,而NOT IN则需要完全遍历整个列表。 #### 十一、用表连接...
- **优化建议**:在查询中使用EXISTS替代IN、NOT EXISTS替代NOT IN可以提高查询效率,特别是涉及到多个表的联接查询时。 - **例子**: - **低效**: `SELECT * FROM EMP WHERE EMPNO > 0 AND DEPTNO IN (SELECT ...
最后,需要注意常用关键字优先级,使用EXISTS替代IN,使用NOT EXISTS替代NOT IN,使用表连接替换EXISTS,使用 EXISTS替换DISTINCT,避免在索引列上使用IS NULL和IS NOT NULL等。 SQL性能调优是一项非常重要的技术,...
用NOT EXISTS替代NOT IN** 类似地,对于否定条件,NOT EXISTS也通常优于NOT IN,尤其是在存在NULL值时。 **11. 用表连接替换EXISTS** 某些情况下,用JOIN代替EXISTS可以简化查询并提高性能,特别是当JOIN条件与...
SELECT DISTINCT Sno FROM SC AS X WHERE NOT EXISTS ( SELECT * FROM SC AS Y WHERE Y.Sno='S3' AND NOT EXISTS ( SELECT * FROM SC AS Z WHERE Z.Sno=X.Sno AND Z.Cno=Y.Cno ) ); 此外,该资源摘要信息还包括...
通过使用 `NOT EXISTS` 和 `IN` 等逻辑运算符结合子查询和聚合函数,该SQL查询能够有效地完成任务。此外,通过 `GROUP BY` 和 `HAVING` 子句进一步确保了查询结果的准确性和精确度。这种查询方式在处理复杂的关系型...
用UNION替代OR,用IN替换OR,以及用EXISTS替换DISTINCT都是常见的优化手段。使用索引时,还要注意索引的创建、管理和操作,如何在不改变索引列类型的前提下优化性能。在优化GROUP BY时,可以考虑使用并行查询和哈希...
用NOT EXISTS替代NOT IN - **规则描述**:与第18条规则类似,但针对否定情况。使用NOT EXISTS代替NOT IN可以提高效率。 - **示例**:查询没有订单的客户信息: - 低效:`SELECT * FROM CUSTOMER WHERE CUST_ID NOT...
类似地,使用NOT EXISTS替代NOT IN也可以提高性能。NOT EXISTS在找到第一个不匹配项后即可停止搜索,而NOT IN需要遍历整个子查询结果。 **11. 用表连接替换EXISTS** 当涉及到多个表的查询时,使用表连接代替EXISTS...
* 合理使用 Not in 和 Not Exists:可以使用索引来加速 Not in 和 Not Exists 语句的执行。 * 防止使用 distinct:可以使用 Group By 语句来替换 distinct 语句。 * 不兼容的数据类型:可以使用 Cast 语句来转换数据...
18. **用NOT EXISTS替代NOT IN**:同样,NOT EXISTS通常优于NOT IN,因为NOT EXISTS停止在找到第一个匹配项时。 19. **用表连接替换EXISTS**:某些情况下,JOIN操作比EXISTS更有效率。 20. **用EXISTS替代DISTINCT...
#### 三、规范二:用EXISTS替代IN、用NOT EXISTS替代NOT IN 在某些查询场景中,为了判断某条记录是否存在于另一张表中,经常会使用 `IN` 或 `NOT IN`。然而,这两种方式在性能上可能不如使用 `EXISTS` 或 `NOT ...