`
myboy123
  • 浏览: 13434 次
  • 性别: Icon_minigender_1
  • 来自: 郑州
社区版块
存档分类
最新评论

编写高性能的 SQL 语句

    博客分类:
  • SQL
阅读更多

提高 SQL 语句的性能,就要保证 SQL 语句结构的合理,可能简单地改变查询条件的书写顺序,就能导致语句执行性能的大大不同。所以,我们在编写语句时,特别是编写 WHERE 子句时,安排好它的各组成部分的排序很重要。这些组成部分的排序是否
最佳是依赖于特定实现的处理顺序,WHERE 子句中查询条件的安排顺序依赖于被索引的列,同时也依赖于哪个条件检索的记录最少。 
      我们先了解一个概念:“最严格限定条件”。最严格限定条件是指返回一个表中最少记录数的条件。我们在 Oracle 系统中编写 SQL 语句时,最严格限定条件一般放在WHERE 子句的最后,因为 Oracle 的查询优化器是从后向前读 WHERE 子句的。先处理最严格限定条件,返回的记录最少,也就是在处理下一个条件之前得到最小的结果集,后面条件的处理花费的时间也就越少,系统的性能就到了提高。如下例(表 Employee见附录 I): 

SELECT name, sex, id, salary 
FROM Employee 
WHERE id < 5000 AND salary > 4000 

我们对上面的 SQL 语句进行分析,可以把这个过程想象为对表进行两次扫描操作的组合。在表 Employee 中,符合条件 salary > 4000 的记录列表如下: 

Results 
name        sex      id     salary 
————   ———   ——   ———— 
林志千       男     1001    6000.00 
李明         男     1002    5000.00 
陈广海       男     2001    5000.00 
张宇         男     3001    5000.00 
张峰         男     4001    7000.00  
魏华翔       男     4003    6000.00 
王亚鹏       男     4004    6000.00 
李志深       男     5001    5000.00 
魏成         男     6001    5000.00 
[9rows] 

得到这个结果,是经过了整个表的扫描,即读取了 24 条记录。接着处理条件 id < 5000,这一次只需要在上面的结果集中进行扫描,扫描的记录数为 9 条,总共扫描记录数为 33 次。如果我们将语句的条件换个顺序: 

SELECT name, sex, id, salary 
FROM Employee 
WHERE salary > 4000 AND id < 5000 

我们再次对上面的 SQL 语句进行分析,同样,把语句的执行过程想象为对表进行两次扫描操作的组合。在表 Employee 中,符合条件 id < 5000 的记录列表如下: 

Results 
name       sex      id     salary 
————   ——    ——   ———— 
林志千      男     1001    6000.00 
李明        男     1002    5000.00 
李大平      男     1003    3000.00 
林国荣      男     1004    4000.00 
庞文凯      男     1005    3000.00 
陈广海      男     2001    5000.00 
刘燕        女     2002    3000.00 
林志祥      男     2003    3000.00 
张宇        男     3001    5000.00 
吴忠彦      男     3002    3000.00 
魏箐        女     3003    4000.00 
王静        女     3004    3000.00 
张峰        男     4001    7000.00 
张敏燕      女     4002    4000.00 
魏华翔      男     4003    6000.00 
王亚鹏      男     4004    6000.00 
林雪飞      女     4005    4000.00 
姜艳成      女     4006    4000.00 
[18rows]  



这个中间结果共有 18 条记录,它的得出也是经过了整个表的扫描,即读取了 24 条记录。接着处理条件 salary > 4000,这一次扫描的记录数为 18 条,总共扫描记录数为42 次,大于第一种写法的 33 次。可见,SQL 语句组成成分的执行顺序会影响语句的性
能。上面举的只是一个小表的例子,对于一个大表,不合理的条件书写顺序可能会导致有一个中间结果的记录条数非常庞大,从而大大降低了 SQL 执行的速度。所以我们一定要注意安排这些组成部分的书写顺序,尽量安排返回结果集最小的条件先被查询优化
器处理。 以上两个 SQL 语句运行的最后结果是相同的: 

Results 
name        sex      id     salary 
————   ———   ——   ———— 
林志千       男     1001    6000.00 
李明         男     1002    5000.00 
陈广海       男     2001    5000.00 
张宇         男     3001    5000.00 
张峰         男     4001    7000.00 
魏华翔       男     4003    6000.00 
王亚鹏       男     4004    6000.00 
李志深       男     5001    5000.00 
[8rows] 

要保证编写的 SQL 语句的高性能,大家还要尽量避免使用逻辑操作符 OR,因为OR 运算不可避免地会降低几乎所有查询的执行效率。笔者由经验所得,使用 IN 运算来代替 OR 运算,系统的效率可以得到提高。 

SELECT  name, sex, id, salary 
FROM Employee 
WHERE SUBSTR(TO_CHAR(id),1,1) = ’1’ OR 
SUBSTR(TO_CHAR(id),1,1) = ’2’ OR  
SUBSTR(TO_CHAR(id),1,1) = ’3’ OR 
SUBSTR(TO_CHAR(id),1,1) = ’4’  

我们可以将上面的使用了大量OR运算符的SQL语句在不改变它的查询结果的条件下进行修改, 用 IN 来替换操作符 OR, 以增加语句的执行效率,提高数据库系统的性能。下面是被修改后的 SQL 语句: 

SELECT  name, sex, id, salary  
FROM Employee 
WHERE SUBSTR(TO_CHAR(id),1,1)  
IN (’1’, ’2’, ’3’, ’4’) 

Results 
name        sex      id     salary 
————   ———   ——   ———— 
林志千       男     1001    6000.00 
李明         男     1002    5000.00 
李大平       男     1003    3000.00 
林国荣       男     1004    4000.00 
庞文凯       男     1005    3000.00 
陈广海       男     2001    5000.00 
刘燕         女     2002    3000.00 
林志祥       男     2003    3000.00 
张宇         男     3001    5000.00 
吴忠彦       男     3002    3000.00 
魏箐         女     3003    4000.00 
王静         女     3004    3000.00 
张峰         男     4001    7000.00 
张敏燕       女     4002    4000.00 
魏华翔       男     4003    6000.00 
王亚鹏       男     4004    6000.00 
林雪飞       女     4005    4000.00 
姜艳成       女     4006    4000.00 
[18rows]

 

转载请注明出处:http://www.dnew168.com/thread-1815-1-1.html

分享到:
评论

相关推荐

    编写高性能的SQL语句注意事项

    本文将探讨编写高性能SQL语句时应注意的一些事项。 1. **处理NULL值**: - `IS NULL` 和 `IS NOT NULL` 操作在含有NULL值的列上不会使用索引,导致全表扫描。因此,尽量避免在索引列上使用NULL值,同时避免在WHERE...

    写出高性能SQL语句的35条方法

    ### 高性能SQL语句编写技巧详析 在数据库管理和数据处理领域,SQL语句的性能直接影响着应用程序的响应时间和整体效率。以下是对《写出高性能SQL语句的35条方法》部分要点的深入解析,旨在帮助DBA、开发者和其他...

    高性能sql语句讲解

    ### 高性能SQL语句详解 #### 一、SQL优化的重要性 在软件开发过程中,数据库查询性能直接影响到应用的整体响应速度及用户体验。SQL优化技术能够帮助开发者提高查询效率,减少资源消耗,提升整体系统的性能。 #### ...

    DB2 SQL性能调优秘笈

    《DB2 SQL性能调优秘笈》不仅详尽阐述了100余条SQL语句优化的技巧和最佳实践、编写高性能SQL语句的标准和原则,以及DB2数据库性能优化的“15步法”,而且还包含大量案例,为解决各种复杂的DB2性能问题提供了解决方案...

    自己编写sql语句分析工具

    而"自己编写sql语句分析工具"则是一个专为SQL解析而设计的自定义程序,它能帮助用户对各种SQL语句进行深入的分析,提取其中的关键信息。 首先,SQL解析涉及到的是SQL语法的理解和分解。一个SQL解析器通常会通过词法...

    教你编写高质量、高性能的MySQL语法

    因此,掌握编写高性能SQL语句的技巧,对于提高系统的可用性和性能至关重要。 #### 索引与SQL优化 在多数数据库系统中,如MySQL,优化器会依赖索引加速数据检索过程。然而,不当的SQL编写方式可能导致优化器放弃...

    SQL优化的好工具——SQL Expert介绍.pdf

    4. In-Process Training(过程内培训):这个功能是为了帮助程序员和数据库管理员提升他们编写高性能SQL语句的能力。利用“SQL Comparor”工具,它可以将原始的SQL语句和经过Syntactical SQLOptimizer调整后的SQL...

    高清完整版 Oracle 高性能SQL引擎剖析SQL优化与调优机制详解

    Oracle数据库是全球领先的企业级...由于是关于Oracle高性能SQL引擎的深入剖析,这本资料是数据库开发者和管理员难得的参考资料,尤其对于处理复杂业务逻辑和海量数据的场景下,掌握这些优化和调优技巧显得尤为重要。

    如何编写高效SQL语句

    在数据库管理中,编写高效的SQL语句对于系统性能的优化至关重要。本篇将深入探讨性能调整的综合观点、有效应用设计以及SQL语句处理的过程,帮助你提升数据库系统的整体效率。 首先,性能调整是一项团队工作,涉及到...

    SQL语句编写优化和基本原理总结

    SQL语句编写优化是数据库性能提升的关键一环,特别是在大数据量处理和高并发环境下,优化得当的SQL语句能够显著提升系统的响应速度和资源利用率。本文将基于王崇安于2012年8月24日发布的《SQL语句编写优化和基本原理...

    利用MD5 求sql语句中的sql_id

    在IT行业中,数据库管理和性能优化是关键领域,而SQL_ID是Oracle数据库中一个重要的概念,它用于唯一标识SQL语句。SQL_ID是一个14字符的字符串,能够帮助我们跟踪和分析SQL查询的性能。MD5(Message-Digest ...

    编写优化的sql语句.

    编写高效的SQL语句对于提升系统性能至关重要,尤其是在处理大量数据时。优化SQL语句能够减少查询时间,降低资源消耗,从而提高整体应用的响应速度。 1. **SQL优化器的作用** SQL优化器是数据库管理系统中的核心...

    自动生成SQL语句_C#_sql_

    本文将深入探讨如何在C#中自动生成SQL语句,以提高开发效率并减少手动编写SQL可能导致的错误。 一、Entity Framework与自动SQL生成 1. Entity Framework(EF)是微软提供的一个开源ORM(对象关系映射)框架,它...

    delphi编写的SQL语句生成器(不是sql语法解析器)

    总结来说,Delphi编写的SQL语句生成器是一个实用的开发辅助工具,它帮助用户更高效、准确地构建和分析SQL查询,同时提供性能评估和优化建议,对于任何频繁与数据库打交道的开发者而言,都是宝贵的资源。

    微型Sql Server查询分析器、数据库比较工具,SQL语句编写助手

    最后,SQL语句编写助手通常具备智能提示、错误检查和优化建议等功能,帮助用户编写高质量的SQL语句。这些工具能够: 1. **智能补全**:根据上下文提供关键词和函数建议,减少手动输入的错误。 2. **错误检测**:...

    mybatis直接执行sql语句后续之一

    在IT行业中,MyBatis是一个广泛使用的持久层框架,它允许开发者直接编写SQL语句,提供了灵活的数据访问和映射机制。这篇博客“mybatis直接执行sql语句后续之一”可能探讨了如何在MyBatis中高效且有效地执行SQL操作。...

    Sql语句生成器

    Sql语句生成器会生成ALTER TABLE语句来复制这些元数据,确保目标数据库的完整性和性能。 4. **视图和存储过程**:对于包含视图和存储过程的数据库,工具会生成对应的CREATE VIEW和CREATE PROCEDURE语句,以便在新...

    如何编写高性能的MySQL语句

    总结来说,编写高性能的MySQL语句需要注意避免使用可能导致优化器放弃索引的条件,如`IS NULL`、联接操作和不合适的`LIKE`通配符。同时,合理的`ORDER BY`语句设计也对性能优化起到关键作用。在开发过程中,应尽量...

Global site tag (gtag.js) - Google Analytics