`
肖福燕
  • 浏览: 12103 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

SQL查询简单优化

阅读更多
1、ORACLE 的解析器按照从右到左的顺序处理 FROM 子句中的表名,因此 FROM 子句中写在最后的表(基础表 driving table)将被最先处理。在FROM 子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表。
例如:
表ceshi_xiao有969条记录,emp_xiao有14条记录。
select count(*) from emp_xiao, ceshi_xiao;(低效方法)
select count(*) from ceshi_xiao, emp_xiao;(高效方法)

注意:这里由于ceshi_xiao表记录太少差别不明显,但已经能看出差别。当表记录上百万条时,该差距会无限放大。

2、ORACLE 采用自下而上的顺序解析 WHERE 子句。
根据这个原理,表之间的连接必须写在其他 WHERE 条件之前, 那些可以过滤掉最大数量记录的条件必须写在 WHERE 子句的末尾。
例如:
SELECT …
FROM EMP E
WHERE SAL > 50000
AND JOB = ‘MANAGER'
AND 25 < (SELECT COUNT(*) FROM EMP
WHERE MGR=E.EMPNO); (低效,执行时间 156.3秒)
SELECT …
FROM EMP E
WHERE 25 < (SELECT COUNT(*) FROM EMP
WHERE MGR=E.EMPNO)
AND SAL > 50000
AND JOB = ‘MANAGER';(高效,执行时间 10.6秒)
注意:在进行多表关联时,多用 Where 语句把单个表的结果集最小化,多用聚合函数汇总结果集后再与其它表做关联,以使结果集数据量最小化。

3、减少对表的查询。
在含有子查询的 SQL语句中,要特别注意减少对表的查询。

4、用EXISTS替代IN。
在许多基于基础表的查询中,为了满足一个条件,往往需要对另一个表进行联接。在这 种情况下, 使用 EXISTS(或 NOT EXISTS)通常将提高查询的效率。使用 exists 而不用 IN 因为 Exists 只检查行的存在,而 in 检查实际值。
例如:
SELECT *
FROM EMP (基础表)
WHERE EMPNO > 0
AND DEPTNO IN (SELECT DEPTNO
FROM DEPT
WHERE LOC = ‘MELB')(低效)
SELECT *
FROM EMP (基础表)
WHERE EMPNO > 0
AND EXISTS (SELECT ‘X'
FROM DEPT
WHERE DEPT.DEPTNO = EMP.DEPTNO
AND LOC = ‘MELB') (高效)
用 IN 的 SQL 性能总是比较低,原因是:对于用 IN 的 SQL 语句 ORACLE 总是试图将其转换成多个表的连接,如果转换不成功则先执行 IN里面的子查询,再查询外层的表记录如果转换成功就转换成多个表的连接。因此 不管理怎么,用 IN 的 SQL 语句总是多了 一个转换的过程。因此在业务密集的SQL当中尽量不采用IN操作符。

5、用EXISTS替换DISTINCT。
当提交一个包含一对多表信息(比如部门表和雇员表)的查询时,避免在SELECT 子句 中使用 DISTINCT. 一般可以考虑用 EXIST 替换。
例如:SELECT DISTINCT DEPT_NO,DEPT_N
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);(高效)

6、用表连接替换EXISTS。
通常来说 ,采用表连接的方式比 EXISTS 更有效率。
例如:
SELECT ENAME
FROM EMP E
WHERE EXISTS (SELECT ‘X'
FROM DEPT
WHERE DEPT_NO = E.DEPT_NO
AND DEPT_CAT = ‘A');
为了提高效率。改写为:
SELECT ENAME
FROM DEPT D,EMP E
WHERE E.DEPT_NO = D.DEPT_NO
AND DEPT_CAT = ‘A' ;

7、避免在索引列上使用计算。
WHERE 子句中,如果索引列是函数的一部分。优化器将不使用索引而使用全表扫描。这是一个非常实用的规则,请务必牢记。
例如:
SELECT …
FROM DEPT
WHERE SAL * 12 > 25000; (低效)
SELECT …
FROM DEPT
WHERE SAL > 25000/12; (高效)

8、避免在索引列上使用NOT。
通常,我们要避免在索引列上使用 NOT,NOT 会产生在和在索引列上使用函数相同 的影响。当ORACLE“遇到”NOT,他就会停止使用索引转而执行全表扫描。

9、不使用<>、!=、~=、^=操作符。
不等于操作符是永远不会用到索引的,因此对它的处理只会产生全表扫描。
a <> 0 ==> a > 0 or a < 0

10、用>=替代>。
SELECT *
FROM EMP
WHERE DEPTNO >3(低效)
SELECT *
FROM EMP
WHERE DEPTNO >=4(高效)
两者的区别在于, 前者 DBMS将直接跳到第一个 DEPT 等于 4的记录而后者将首先定位到 DEPTNO=3的记录并且向前扫描到第一个 DEPT 大于 3的记录。

11、不使用like 操作符。
遇到 需要用到 LIKE 过滤的SQL语句,完全可以用 instr 代替,处理速度将显著提高。

12、用(UNION)UNION ALL替换OR (适用于索引列)。
通常情况下, 用 UNION替换 WHERE 子句中的 OR将会起到较好的效果。对索引列使用 OR将造成全表扫描。注意, 以上规则只针对多个索引列有效。 如果有 column没有被索引, 查询效率可能会因为你没有选择 OR而降低。
如果你坚持要用 OR, 那就需要返回记录最少的索引列写在最前面。注意, 以上规则只针对多个索引列有效. 如果有column没有被索引, 查询效率可能会因为你没有选择OR而降低。

13、优化GROUP BY。
提高 GROUP BY 语句的效率, 可以通过将不需要的记录在 GROUP BY 之前过滤掉。下面两个查询返回相同结果但第二个明显就快了许多。
例如:
SELECT JOB , AVG(SAL)
FROM EMP
GROUP by JOB
HAVING JOB = ‘PRESIDENT'
OR JOB = ‘MANAGER'(低效)
SELECT JOB , AVG(SAL)
FROM EMP
WHERE JOB = ‘PRESIDENT'
OR JOB = ‘MANAGER'GROUP by JOB(高效)
使用 where 而不是 having ,where是用于过滤行的,而having是用来过滤组的,因为行被分组后,having 才能过滤组,所以尽量用 WHERE 过滤。

14、避免改变索引列的类型。
当比较不同数据类型的数据时, ORACLE自动对列进行简单的类型转换。

15、SQL书写的影响。
同一功能同一性能不同写法SQL的影响。
例如:
如一个SQL在A程序员写的为select * from zl_yhjbqk
B程序员写的为select * from dlyx.zl_yhjbqk(带表所有者的前缀)
C程序员写的为select * from DLYX.ZLYHJBQK(大写表名)
D程序员写的为select *  from DLYX.ZLYHJBQK(中间多了空格)
四个SQL在ORACLE分析整理之后产生的结果及执行的时间是一样的,但是从ORACLE共享内存SGA的原理,可以得出ORACLE对每个SQL都会对其进行一次分析,并且占用共享内存,如果将SQL的字符串及格式写得完全相同则ORACLE只会分析一次,共享内存也只会留下一次的分析结果,这不仅可以减少分析SQL的时间,而且可以减少共享内存重复的信息,ORACLE也可以准确统计SQL的执行频率。

总结:
1).应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描。
2).应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。
3).应尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描。
4).in 和 not in 也要慎用,否则会导致全表扫描。
5).在使用索引字段作为条件时,如果该索引是复合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,否则该索引将不会被使用,并且应尽可能的让字段顺序与索引顺序相一致。
6).任何地方都不要使用 select * from t ,用具体的字段列表代替“*”,不要返回用不到的任何字段。
  • 大小: 5.5 KB
2
0
分享到:
评论

相关推荐

    informix数据库sql查询优化

    - **访问数据架构**:理解数据库的数据存储方式是优化查询的基础。例如,在Informix中,数据被组织成不同的表空间(tablespace),每个表空间包含一系列数据页。 - **谓词**:谓词是在WHERE子句中用于过滤结果集的...

    sql面试题(sql查询优化)

    - **优化查询计划**:通过设置数据库参数,影响查询执行计划的选择,以达到最佳性能。 ### SQL查询优化实例分析 以下是从给定的部分内容中抽取的一个SQL查询优化实例: ```sql -- 创建测试表testA CREATE TABLE ...

    SQL语言查询优化方案探究

    ### SQL语言查询优化方案探究 #### 一、问题提出与根源 在当今信息化时代,关系数据库系统作为数据管理和处理的核心工具,其效率直接影响着信息系统的整体性能。SQL(Structured Query Language)作为关系数据库的...

    SQL Server SQL优化

    在数据库环境中,一个简单的低效SQL查询就足以让整个数据库系统陷入瘫痪状态。 #### 二、数据库性能瓶颈分析 数据库性能问题通常可以从硬件和软件两个层面进行排查: - **硬件层面**包括内存、硬盘、CPU以及网络...

    SQL 查询语句优化

    ### SQL查询语句优化策略详解 #### 一、选择最有效率的表名顺序 在基于规则的优化器中,如Oracle,SQL语句中表的处理顺序至关重要。Oracle的解析器遵循从右至左的处理逻辑,因此,位于FROM子句最右侧的表将被最先...

    OracleSQL的优化.pdf

    例如,在检索月薪大于 2000 的表达式中,如果 SQL 语句包括第一种情况,优化器会简单地把它转变成第二种。优化器不会简化跨越比较符的表达式,因此我们应该尽量写用常量跟字段比较检索的表达式,而不要将字段置于...

    SQL.rar_java sql_java sql查询_query optimization_sql_sql优化

    然而,如果不进行适当的优化,即使是简单的SQL查询也可能导致性能问题。以下是一些常见的SQL优化策略: 1. **查询语句优化**:避免使用全表扫描,尽可能利用索引。这通常意味着在WHERE子句中使用索引字段,而不是在...

    SQL查询语句优化研究.pdf

    SQL查询语句优化是数据库管理和维护中的一项关键技术,对于提升数据库系统的性能和效率具有至关重要的作用。在处理大量的数据时,查询操作是最常见也是最消耗资源的操作之一。若不进行优化,执行查询可能需要数十...

    sql命令优化小窍门

    SQL 优化是数据库性能优化的关键部分,好的 SQL 命令优化可以大大提高查询速度和数据库性能。在 SQL 命令优化中,索引的建立和使用非常关键。本文总结了一些常用的 SQL 命令优化小窍门,旨在帮助提高查询速度和...

    SQL简易查询工具

    用户可以查看查询执行时间,帮助优化查询效率,找出性能瓶颈。对于长时间运行的查询,工具可能提供中断或取消功能,避免占用过多系统资源。 最后,考虑到日志记录和历史查询的需要,SQL简易查询工具通常会保存用户...

    SQL Server数据库查询优化方法探究

    ### SQL Server数据库查询...综上所述,通过合理使用索引、优化查询结构等方法,可以有效地提高SQL Server数据库的查询效率和整体性能。这些方法不仅适用于SQL Server,对于其他类型的数据库系统也有很好的参考价值。

    SQL Server数据库查询速度慢原因及优化方法

    ●可以通过以下方法来优化查询 : 1、把数据、日志、索引放到不同的I/O设备上,增加读取速度,以前可以将Tempdb应放在RAID0上,SQL2000不在支持。数据量(尺寸)越大,提高I/O越重要。 2、纵向、横向分割表,减少...

    SQL简易分析查询器

    "SQL简易分析查询器"是一款专为用户设计的轻量级数据库查询工具,它简化了SQL查询过程,使得数据分析更为便捷。这款软件的核心特点在于其绿色小巧的特性,无需安装即可使用,大大降低了用户的使用门槛,尤其适合那些...

    KD_SQL查询的优化转换方法.pdf

    在KD-SQL中,优化查询的一个重要方面是将嵌套查询转换为简单非嵌套查询,以提高查询效率。文章指出,当嵌套查询涉及到聚集函数COUNT时,直接使用传统方法可能会导致错误,因为这可能会破坏临时关系中属性之间的联系...

    SQL查询分析器修正分离版

    4. **性能分析**:高级的SQL查询分析器可能会提供性能分析功能,帮助用户识别慢速查询并优化SQL语句,这对于大型数据库系统尤其重要。 5. **数据库连接管理**:支持多种数据库管理系统(如MySQL, PostgreSQL, SQL ...

    Oracle提高SQL查询效率(SQL优化).doc

    Oracle 提高 SQL 查询效率(SQL 优化) 本文将详细介绍 Oracle 中提高 SQL 查询效率的技巧和策略,包括选择最有效率的表名顺序、WHERE 子句中的连接顺序、SELECT 子句中避免使用‘*’、减少访问数据库的次数、使用 ...

    SQL优化 SQL 优化

    - **优化查询结构**:简化查询逻辑,避免不必要的子查询和复杂连接。 - **合理使用索引**:为频繁查询的字段创建合适的索引,并定期维护索引。 - **数据分区**:对大数据表进行分区以改善查询性能。 - **硬件升级**...

    SQL语句优化,语法优化

    优化SQL语句能够显著提高查询速度,减少服务器负载,提升系统整体效率。以下是一些关于SQL语句优化的重要知识点: 1. **选择最有效的表名顺序**:在FROM子句中,应将记录最少的表放在最前面,因为在基于规则的优化...

    Sql Server简易版查询分析器

    通过查询分析,我们可以发现潜在的性能问题,例如不必要的全表扫描、缺少索引或者不当的JOIN策略等,并针对性地优化查询,提高数据库的响应速度。 总的来说,Sql Server简易版查询分析器是一款强大的数据库管理工具...

    收获,不止SQL优化--抓住SQL的本质1

    - **性能问题的根源**:随着系统数据量的增长和并发访问需求的增加,原本简单的SQL语句可能变得复杂,导致性能下降。 - **识别问题SQL**:在大规模系统中,找出哪些具体的SQL语句影响了系统性能是一项挑战。 - **...

Global site tag (gtag.js) - Google Analytics