篇一 :SQL语句优化方法大总结

SQL语句优化方法30例

—————————————————————————————————— 在SQL语句优化过程中,我们经常会用到hint,现总结一下在SQL优化过程中常见Oracle HINT的用法:

1. /*+ALL_ROWS*/

表明对语句块选择基于开销的优化方法,并获得最佳吞吐量,使资源消耗最小化. 例如:

SELECT /*+ALL+_ROWS*/ EMP_NO,EMP_NAM,DAT_IN FROM BSEMPMS WHERE EMP_NO='SCOTT';

2. /*+FIRST_ROWS*/

表明对语句块选择基于开销的优化方法,并获得最佳响应时间,使资源消耗最小化. 例如:

SELECT /*+FIRST_ROWS*/ EMP_NO,EMP_NAM,DAT_IN FROM BSEMPMS WHERE

EMP_NO='SCOTT';

3. /*+CHOOSE*/

表明如果数据字典中有访问表的统计信息,将基于开销的优化方法,并获得最佳的吞吐量;

表明如果数据字典中没有访问表的统计信息,将基于规则开销的优化方法;

例如:

SELECT /*+CHOOSE*/ EMP_NO,EMP_NAM,DAT_IN FROM BSEMPMS WHERE EMP_NO='SCOTT';

4. /*+RULE*/

表明对语句块选择基于规则的优化方法.

例如:

SELECT /*+ RULE */ EMP_NO,EMP_NAM,DAT_IN FROM BSEMPMS WHERE EMP_NO='SCOTT';

5. /*+FULL(TABLE)*/

表明对表选择全局扫描的方法.

例如:

SELECT /*+FULL(A)*/ EMP_NO,EMP_NAM FROM BSEMPMS A WHERE EMP_NO='SCOTT';

…… …… 余下全文

篇二 :Oracle Sql语句优化总结

ORACLE SQL语句优化总结

(1) 选择最有效率的表名顺序(只在基于规则的优化器中有效):

ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处理,在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表。如果有3个以上的表连接查询, 那就需要选择交叉表(intersection table)作为基础表, 交叉表是指那个被其他表所引用的表.

(2) WHERE子句中的连接顺序.:

ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾.

(3) SELECT子句中避免使用 ‘ * ‘:

ORACLE在解析的过程中, 会将'*' 依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间

(4) 减少访问数据库的次数:

ORACLE在内部执行了许多工作: 解析SQL语句, 估算索引的利用率, 绑定变量 , 读数据块等;

(5) 在SQL*Plus , SQL*Forms和Pro*C中重新设置ARRAYSIZE参数, 可以增加每次数据库访问的检索数据量 ,建议值为200

(6) 使用DECODE函数来减少处理时间:

使用DECODE函数可以避免重复扫描相同记录或重复连接相同的表.

(7) 整合简单,无关联的数据库访问:

如果你有几个简单的数据库查询语句,你可以把它们整合到一个查询中(即使它们之间没有关系)

(8) 删除重复记录:

最高效的删除重复记录方法 ( 因为使用了ROWID)例子: DELETE FROM EMP E WHERE E.ROWID > (SELECT MIN(X.ROWID)

…… …… 余下全文

篇三 :SQL语句优化总结[1]

数据库优化总结

一、

二、

三、

四、

五、

六、

七、

八、

九、

十、

十一、

十二、

十三、

十四、

十五、

十六、

十七、

十八、 前言 ................................................................................................................... 1 在SELECT子句中避免使用‘*’ .............................................................. 1 删除重复记录 ................................................................................................... 1 计算记录条数 ................................................................................................... 2 减少对表的查询 ............................................................................................... 2 EXISTS 与IN使用 ......................................................................................... 2 使用索引 ........................................................................................................... 3 UNION与UNION ALL的使用 ...................................................................... 4 驱动表的选择 ................................................................................................... 5 Where语句中条件的顺序 ............................................................................... 5 使用where代替having语句 .......................................................................... 5 使用表的别名 ................................................................................................... 5 表记录删除 ....................................................................................................... 6 Decode函数使用 .............................................................................................. 6 尽量少用子查询 ............................................................................................... 6 SQL语句拆分 .................................................................................................. 6 SQL语句中参数的使用 .................................................................................. 7 解释计划 ........................................................................................................... 7

…… …… 余下全文

篇四 :Sql查询语句优化心得MySQL优化

Sql查询语句优化心得MySQL优化

2010-12-24 14:31

作为一个互联网开发工程师,数据库的知识是必不可少的,要是写几条查询效率很差的SQL,当数据库的数据到达一定级别以后,没几个人同时访问你的网 站,就能把你的一台服务器高挂啦!【个人认为:最为简单的测试方法就是把SQL语句在命令行下运行,若查询的语句需要0.03秒以上的SQL语句都需要优 化。】

如下的大多都来自网络:终归起来、都是一些简单SQL优化,不敢保证这说法绝对的权威哦。phpma

1、用程序中,保证在实现功能的基础上,尽量减少对数据库的访问次数;通过搜索参数,尽量减少对表的访问行数,最小化结果集,从而减轻网络负担;能 够分开的操作尽量分开处理,提高每次的响应速度;在数据窗口使用SQL时,尽量把使用的索引放在选择的首列;算法的结构尽量简单;在查询时,不要过多地使 用通配符如SELECT * FROM T1语句,要用到几列就选择几列如:SELECT COL1,COL2 FROM T1;在可能的情况下尽量限制尽量结果集行数如:SELECT TOP 300 COL1,COL2,COL3 FROM T1,因为某些情况下用户是不需要那么多的数据的。不要在应用中使用数据库游标,游标是非常有用的工具,但比使用常规的、面向集的SQL语句需要更大的开 销;按照特定顺序提取数据的查找。

2、避免使用不兼容的数据类型。例如float和int、char和varchar、binary和varbinary是不兼容的。数据类型的不兼容可能使优化器无法执行一些本来可以进行的优化操作。例如: SELECT name FROM employee WHERE salary > 60000

在这条语句中,如salary字段是money型的,则优化器很难对其进行优化,因为60000是个整型数。我们应当在编程时将整型转化成为钱币型,而不要等到运行时转化。 phpma.com

…… …… 余下全文

篇五 :sql语句优化建议

SQL的优化应该从5个方面进行调整:

1.去掉不必要的大型表的全表扫描

2.缓存小型表的全表扫描

3.检验优化索引的使用

4.检验优化的连接技术

5.尽可能减少执行计划的Cost

SQL语句:

是对数据库(数据)进行操作的惟一途径;

消耗了70%~90%的数据库资源;独立于程序设计逻辑,相对于对程序源代码的优化,对SQL语句的优化在时间成本和风险上的代价都很低;

可以有不同的写法;易学,难精通。

SQL优化:

固定的SQL书写习惯,相同的查询尽量保持相同,存储过程的效率较高。

应该编写与其格式一致的语句,包括字母的大小写、标点符号、换行的位置等都要一致

ORACLE优化器:

在任何可能的时候都会对表达式进行评估,并且把特定的语法结构转换成等价的结构,这么做的原因是

要么结果表达式能够比源表达式具有更快的速度

要么源表达式只是结果表达式的一个等价语义结构

不同的SQL结构有时具有同样的操作(例如:= ANY (subquery) and IN (subquery)),ORACLE会把他们映射到一个单一的语义结构。

1 常量优化:

常量的计算是在语句被优化时一次性完成,而不是在每次执行时。下面是检索月薪大于2000的的表达式:

sal > 24000/12

sal > 2000

sal*12 > 24000

如果SQL语句包括第一种情况,优化器会简单地把它转变成第二种。

优化器不会简化跨越比较符的表达式,例如第三条语句,鉴于此,应尽量写用常量跟字段比较检索的表达式,而不要将字段置于表达式当中。否则没有办法优化,比如如果sal上有索引,第一和第二就可以使用,第三就难以使用。

2 操作符优化:

优化器把使用LIKE操作符和一个没有通配符的表达式组成的检索表达式转换为一个“=”操作符表达式。

例如:优化器会把表达式ename LIKE 'SMITH'转换为ename = 'SMITH'

…… …… 余下全文

篇六 :sql语句优化之降龙十八掌

基于索引的SQL语句优化之降龙十八掌 1

2

3 前言 ................................................................................................................................... 2 总纲 ................................................................................................................................... 2 降龙十八掌 ....................................................................................................................... 3

第一掌 避免对列的操作 ................................................................................................. 3

第二掌 避免不必要的类型转换 ..................................................................................... 4

第三掌 增加查询的范围限制 ......................................................................................... 4

第四掌 尽量去掉"IN"、"OR"......................................................................................... 4

…… …… 余下全文

篇七 :SQL语句优化规律总结

SQL语句优化规律总结(ORACLE)

1、FROM: ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,因此FROM子句中写在最后的表(基础表 driving table)将被最先处理. 在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表(放在where的最后) 。如果有3个以上的表连接查询, 那就需要选择交叉表(intersection table)作为基础表, 交叉表是指那个被其他表所引用的表.

2、WHERE: ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾。

3、在where子句中使用is null或is not null的语句优化器是不允许使用索引的,尽量不用。

4、少使用或不使用NOT。

5、如果通配符(%)在搜寻词首出现, Oracle系统不使用此列做索引。在很多情况下可能无法避免这种情况,但是一定要

心中有底,通配符如此使用会降低查询速度。然而当通配符出现在字符串其他位置时,优化器就能利用索引。在下面的查询中索引得到了使用

select * from employee where last_name like 'c%';

6、 SELECT子句中避免使用 ‘ * ‘

7、避免在索引列上使用计算.如(WHERE SAL > 25000/12)

8、任何在Order by语句的非索引项或者有计算表达式都将降低查询速度。

9、关于IN、exists和DISTINCT

第一种格式是使用IN操作符:

... where column in(select * from ... where ...);

第二种格式是使用EXIST操作符:

…… …… 余下全文

篇八 :Sql server20xx 优化查询速度50个方法小结

I/O吞吐量小,形成了瓶颈效应。

没有创建计算列导致查询不优化。

内存不足。

网络速度慢。

查询出的数据量过大(可以采用多次查询,其他的方法降低数据量)。

锁或者死锁(这也是查询慢最常见的问题,是程序设计的缺陷)。

sp_lock,sp_who,活动的用户查看,原因是读写竞争资源。

返回了不必要的行和列。

查询语句不好,没有优化。

可以通过如下方法来优化查询 :

1、把数据、日志、索引放到不同的I/O设备上,增加读取速度,以前可以将Tempdb应放在RAID0上,SQL2000不在支持。数据量(尺寸)越大,提高I/O越重要。

2、纵向、横向分割表,减少表的尺寸(sp_spaceuse)。

3、升级硬件。

4、根据查询条件,建立索引,优化索引、优化访问方式,限制结果集的数据量。注意填充因子要适当(最好是使用默认值0)。索引应该尽量小,使用字节数小的列建索引好(参照索引的创建),不要对有限的几个值的字段建单一索引如性别字段。

5、提高网速。

6、扩大服务器的内存,Windows 2000和SQL server 2000能支持4-8G的内存。配置虚拟内存:虚拟内存大小应基于计算机上并发运行的服务进行配置。运行 Microsoft SQL Server? 2000 时,可考虑将虚拟内存大小设置为计算机中安装的物理内存的 1.5 倍。如果另外安装了全文检索功能,并打算运行 Microsoft 搜索服务以便执行全文索引和查询,可考虑:将虚拟内存大小配置为至少是计算机中安装的物理内存的 3 倍。将 SQL Server max server memory 服务器配置选项配置为物理内存的 1.5 倍(虚拟内存大小设置的一半)。

7、增加服务器 CPU个数;但是必须明白并行处理串行处理更需要资源例如内存。使用并行还是串行程是MsSQL自动评估选择的。单个任务分解成多个任务,就可以在处理器上运行。例如耽搁查询的排序、连接、扫描和GROUP BY字句同时执行,SQL SERVER根据系统的负载情况决定最优的并行等级,复杂的需要消耗大量的CPU的查询最适合并行处理。但是更新操作Update,Insert, Delete还不能并行处理。

…… …… 余下全文