加快sql查询是很是重要的技巧,简单来讲加快sql查询的方式有如下几种:
1、索引的引用html
一、索引通常能够加速数据的检索速度,加速表与表之间的连接,提升性能,因此在对海量数据进行处理时,考虑到信息量比较大,应该对表创建索引,包括在主键上创建聚簇索引,将聚合索引创建在日期刊上等。索引的优势有不少,可是对于索引的创建,还须要考虑实际状况,而不是对每个列创建一个索引,好比针对大表的分组、排序等字段,都要创建相应索引,同时还应该考虑创建符合索引。增长索引的同时也有不少很差的方面,首先,建立索引和维护索引都耗费时间,且随着数据量的增长而增长;其次,索引占据物理空间,聚簇索引的空间更大。最后,当对表进行增长、删除和修改的时候,索引也要动态的维护。因此索引的引用有如下几个原则:java
(1)当插入数据为表中数据的百分之10以上时,首先须要删除该表的索引来提升数据的插入效率,而后再从新创建索引;sql
(2)避免在索引列上使用函数或计算,在where字句中,若是索引是函数的一部分,优化器将再也不使用索引,将使用全表扫描;例如:数据库
select * from table where hh*10>1000;//低效 select * from table where hh>1000/10;//更高效
(3)尽可能避免在索引列上使用not,!=和<>,索引只能告诉什么在表中,而不能告诉什么不在表中,当数据库赶上以上几种符号时,将再也不使用索引,使用全表扫描oracle
(4)检索中不要对索引进行处理,如TRIM,TO_DATE,类型转换等,这会破坏索引函数
(5)避免在索引列上使用IS NULL 或 IS NOT NULL。避免在索引列上使用任何能够为空的列,这样将没法使用此索引。由于空值不存在于索引列中,因此当where字句中对索引进行空值比较,将没法使用该索引。性能
(6)在索引列上,使用>=代替>,好比:优化
select * from table where hh>10;//低效 select * from table where hh>=10.0000001//相对高效
2、SQL语句的优化spa
介绍几种SQL语句的优化技巧:3d
(1)where字句中的连接顺序
oracle采用自下而上的顺序解析where字句,因此表之间的连接必须写在其余where条件以前,那些能够滤过大量纪录的条件必须写在where字句的末尾,例如:
select * from table e where h>500 and d='001' and 25<(select count(*) from table where count=e.count); //低效 select * from table e where 25<(select count(*) from table where count=e.count); and h>500 and d='001';//更高效
(2)删除全表时,用truncate而不用delete。由于truncate是ddl不是dml(truncate只能在删除全表时使用),例如:
Truncate table account; 比 delete from account; 快1000倍
(3)尽可能多使用commit,只要有可能就对程序中每一个delete,insert,update使用commit,这样系统会由于commit所释放的资源而大大提升效率。
(4)用exists代替in,能够提升查询的效率。例如:
SELECT * FROM ACCOUNT WHERE AC_CODE NOT IN ( SELECT CODE FROM GOODS WHERE NUM='001') //低效 SELECT * FROM ACCOUNT WHERE NOT EXISTS (SELECT CODE FROM GOODS WHERE CODE=ACCOUNT.AC_CODE AND NUM='001') //更高效
(5)使用group by
能够将不须要的语句在group by以前过滤掉
(6)避免使用HAVING字句
HAVING字句只有在检索出全部记录以后,才会对结果集进行过滤,这样涉及到排序,统计等操做,若是能经过WHERE字句限制记录的数目,就能够减小开销。用Where子句替换HAVING子句,若是能经过WHERE子句限制记录的数目,那就能减小这方面的开销. (非oracle中)on、where、having这三个均可以加条件的子句中,on是最早执行,where次之,having最后,由于on是先把不 符合条件的记录过滤后才进行统计,它就能够减小中间运算要处理的数据,按理说应该速度是最快的,where也应该比having快点的,由于它过滤数据后 才进行sum,在两个表联接时才用on的,因此在一个表的时候,就剩下where跟having比较了。在这单表查询统计的状况下,若是要过滤的条件没有涉及到要计算字段,那它们的结果是同样的,只是where可使用rushmore技术,而having就不能,在速度上后者要慢若是要涉及到计算的字 段,就表示在没计算以前,这个字段的值是不肯定的,根据上篇写的工做流程,where的做用时间是在计算以前就完成的,而having就是在计算后才起做 用的,因此在这种状况下,二者的结果会不一样。在多表联接查询时,on比where更早起做用。系统首先根据各个表之间的联接条件,把多个表合成一个临时表 后,再由where进行过滤,而后再计算,计算完后再由having进行过滤。因而可知,要想过滤条件起到正确的做用,首先要明白这个条件应该在何时起做用,而后再决定放在那里 。
(7)有条件的使用union-all代替union提升效率
(8)在全部查询的SQL语句中要特别注意减小对表的查询,如:
(9)select字句中避免使用*
当想在select字句中列出全部的列时,使用*是一个很方便,可是很低效的方法,由于在oracle中,会经过查询数据字典,将*依次转换为全部的列名,很耗时
(10)Order by语句
ORDER BY语句决定了Oracle如何将返回的查询结果排序。Order by语句对要排序的列没有什么特别的限制,也能够将函数加入列中(象联接或者附加等)。任何在Order by语句的非索引项或者有计算表达式都将下降查询速度。仔细检查order by语句以找出非索引项或者表达式,它们会下降性能。解决这个问题的办法就是重写order by语句以使用索引,也能够为所使用的列创建另一个索引,同时应绝对避免在order by子句中使用表达式。
(11)带通配符(%)的like语句
目前的需求是这样的,要求在职工表中查询名字中包含cliton的人。能够采用以下的查询SQL语句:
select * from employee where last_name like '%cliton%';
这里因为通配符(%)在搜寻词首出现,因此Oracle系统不使用last_name的索引。在不少状况下可能没法避免这种状况,可是必定要心中有底,通配符如此使用会下降查询速度。然而当通配符出如今字符串其余位置时,优化器就能利用索引。在下面的查询中索引获得了使用:
select * from employee where last_name like 'c%';
(12)选择最有效率的表名顺序(只在基于规则的优化器中有效):
ORACLE 的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最早处理,在FROM子句中包含多个表的状况下,你必须选择记录条数最少的表做为基础表。若是有3个以上的表链接查询, 那就须要选择交叉表(intersection table)做为基础表, 交叉表是指那个被其余表所引用的表。
(13) 整合简单,无关联的数据库访问:
若是你有几个简单的数据库查询语句,你能够把它们整合到一个查询中(即便它们之间没有关系)
(14)删除重复记录:
最高效的删除重复记录方法 ( 由于使用了ROWID)例子:
DELETE FROM EMP E WHERE E.ROWID > (SELECT MIN(X.ROWID)
FROM EMP X WHERE X.EMP_NO = E.EMP_NO);
(15)使用表的别名(Alias):
当在SQL语句中链接多个表时, 请使用表的别名并把别名前缀于每一个Column上.这样一来,就能够减小解析的时间并减小那些由Column歧义引发的语法错误。
(16)sql语句用大写的;由于oracle老是先解析sql语句,把小写的字母转换成大写的再执行
(17) 在java代码中尽可能少用链接符“+”链接字符串!
(18) 老是使用索引的第一个列:
若是索引是创建在多个列上, 只有在它的第一个列(leading column)被where子句引用时,优化器才会选择使用该索引. 这也是一条简单而重要的规则,当仅引用索引的第二个列时,优化器使用了全表扫描而忽略了索引
3、函数的使用技巧
虽然有时肆意的使用函数,会将性能下降,可是用好函数有时也能提升性能和可读性。如:
其余的一些方法能够参考http://www.cnblogs.com/ziyiFly/archive/2008/12/24/1361380.html