要提高 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语句注意事项
《DB2 SQL性能调优秘笈》不仅详尽阐述了100余条SQL语句优化的技巧和最佳实践、编写高性能SQL语句的标准和原则,以及DB2数据库性能优化的“15步法”,而且还包含大量案例,为解决各种复杂的DB2性能问题提供了解决方案...
在编写SQL语句时我们应清楚优化器根据何种原则来删除索引,这有助于写出高性能的SQL语句。本文就某些SQL语句的where子句编写中需要注意的问题作详细介绍。在这些where子句中,即使某些列存在索引,但是由于编写了...
在应用系统开发初期,由于开发数据库数据比较少,对于查询SQL语句的编写等体会不出SQL语句各种写法的性能优劣,但是如果将应用系统提交实际应用后,随着数据库中数据的增加,...用索引,这有助于写出高性能的SQL语句。
由于开发数据库数据比较少,对于查询SQL语句,复杂视图的编写等体会...在编写SQL语句时我们应清楚优化器根据何种原则来删除索引,这有助于写出高性能的SQL语句。 下面从SQL语句的编写和SQL语句使用索引两方面来阐述。
完文档讲述了如何编写性能的sql语句,可以参考一下
mabatis-plus的一些知识点,1) SQL 语句可以自由控制, 更灵活, 性能较高(性能比 JPA 高)。 2) SQL 与代码分离, 易于阅读和维护。 SQL 是写到 XML 中, 它与 Java 代码进行了分离, 易于阅读, 代码非常清 晰。...
在应用系统开发初期,由于开发数据库数据比较少,对于查询SQL语句,复杂视图的的编写等体会不出SQL语句各种写法的性能优劣,但是如果将应用系统提交实际应用后,...本文主要介绍了如何编写高质量、高性能的MySQL语法。
PL/SQL是一种高性能的基于事务处理的语言,能运行在任何ORACLE环境中,支持所有数据处理命令。通过使用PL/SQL程序单元处理SQL的数据定义和数据控制元素。 . PL/SQL支持所有SQL数据类型和所有SQL函数,同时支持...
然后我们可以对比不同的执行计划,比如达到同样效果,两个开发人员编写的不同SQL语句谁的效率更高我们就可以对比它们的执行计划来分析。执行计划比较复杂的SQL语句质量就不是很高 我们还可以结合时间统计【set ...
PL/SQL是一种高性能的基于事务处理的语言,能运行在任何ORACLE环境中,支持所有数据处理命令。通过使用PL/SQL程序单元处理SQL的数据定义和数据控制元素。 . PL/SQL支持所有SQL数据类型和所有SQL函数,同时支持所有...
在多数情况下,oracle使用索引来更快地遍历表,优化器主要根据定义的索引来提高性能。但是,假如在sql语句的where子句中写的...在编写sql语句时我们应清楚优化器根据何种原则来删除索引,这有助于写出高性能的sql语句。
使用PL/SQL可以编写具有很多高级功能的程序,虽然通过多个SQL语句可能也能实现同样的功能,但是相比而言,PL/SQL具有更为明显的一些优点: 1.能够使一组SQL语句的功能更具模块化程序特点; 2.采用了过程性...
在编写SQL语句时我们应清楚优化器根据何种原则来删除索引,这有助于写出高性能的SQL语句。 二、SQL语句编写注意问题 下面就某些SQL语句的where子句编写中需要注意的问题作详细介绍。在这些where子句中,即使...
本书全面深入地介绍了...阅读本书,可以充分地理解T-SQL语言和良好的编程实践,学会如何编写更加有效而强大的查询语句。, 本书适合有经验的程序员和DBA阅读,是在SQL Server 2008中编写和优化SQL查询的必备参考图书。
它不但可以帮助mysql初学者提高使用技巧,更为有经验的mysql dba指出了开发高性能mysql应用的途径。全书包含14章和4个附录,内容覆盖mysql系统架构、设计应用技巧、sql语句优化、服务器性能调优、系统配置管理和安全...
mybatis是一种持久层框架,也属于ORM映射。前身是ibatis。 相比于hibernatehibernate为全自动化,配置文件书写之后不需要书写sql语句,但是欠缺灵活,很多时候需要...移植性不好,但是可编写灵活和高性能的sql语句。
通过提供联机分析处理(On-Line Analytical Processing,简称 OLAP),SQL Anywhere 提供了在单条 SQL 语句中执行复杂数据分析的功能,从而通过减少对数据库的查询次数来改进性能,而同时又能增加结果值。...