SQL优化

转载 2006年06月21日 14:44:00
1. 索引的使用:
(1).当插入的数据为数据表中的记录数量的10%以上,首先需要删除该表的索引来提高数据的插入效率,当数据插入后,再建立索引。
(2).避免在索引列上使用函数或计算,在where子句中,如果索引是函数的一部分,优化器将不再使用索引而使用全表扫描。如:
低效:select * from dept where sal*12 >2500;
高效:select * from dept where sal>2500/12;
(3).避免在索引列上使用not和 “!=”,索引只能告诉什么存在于表中,而不能告诉什么不存在于表中,当数据库遇到not 和 “!=”时,就会停止使用索引而去执行全表扫描。
(4).索引列上>=代替>
 低效:select * from emp where deptno > 3
 高效:select * from emp where deptno >=4
两者的区别在于,前者dbms将直接跳到第一个deptno等于4的记录,而后者将首先定位到deptno等于3的记录并且向前扫描到第一个deptno大于3的。
(5).非要对一个使用函数的列启用索引,基于函数的索引是一个较好的方案。
2. 游标的使用:
   当在海量的数据表中进行数据的删除、更新、插入操作时,用游标处理的效率是最慢的,但是游标又是必不可少的,所以正确使用游标十分重要:
   (1). 在数据抽取的源表中使用时间戳,这样每天的维表数据维护只针对更新日期为最新时间的数据来进行,大大减少需要维护的数据记录数。
   (2). 在insert和update维表时都加上一个条件来过滤维表中已经存在的记录,例如:
insert into dim_customer select * from ods_customer where ods_customer.code not exists (dim_customer.code)
 ods_customer为数据源表。dim_customer为维表。
   (3). 使用显式的游标,因为隐式的游标将会执行两次操作,第一次检索记录,第二次检查too many rows这个exception,而显式游标不执行第二次操作。
3. 据抽取和上载时的sql优化:
(1). Where 子句中的连接顺序:
oracle采用自下而上的顺序解析where子句,根据这个原理,表之间的连接必须写在其他where条件之前,那些可以过滤掉大量记录的条件必须写在where子句的末尾。如:
低效:select * from emp e where sal>5000 and job = ‘manager’ and 25<(select count (*) from emp where mgr=e.empno);
高效:select * from emp e where 25<(select count(*) from emp where mgr=e.empno) and sal>5000 and job=’manager’;
   (2). 删除全表时,用truncate 替代 delete,同时注意truncate只能在删除全表时适用,因为truncate是ddl而不是dml。
   (3). 尽量多使用commit
只要有可能就在程序中对每个delete,insert,update操作尽量多使用commit,这样系统性能会因为commit所释放的资源而大大提高。
   (4). 用exists替代in ,可以提高查询的效率。
   (5). 用not exists 替代 not in
   (6). 优化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 having job=’president’ or job=’manager’ group by job;
   (7). 有条件的使用union-all 替代 union:这样做排序就不必要了,效率会提高3到5倍。
   (8). 分离表和索引
       总是将你的表和索引建立在不同的表空间内,决不要将不属于oracle内部系统的对象存放到system表空间内。同时确保数据表空间和索引表空间置于不同的硬盘控制卡控制的硬盘上。

sql优化in语句

在很多时候我们在sql中会用到in语句,in语句会使得sql查询不使用索引,这也大大减低了sql执行的效率,为了能够让sql在查询中使用索引,有很多种方式可以优化,比如如果in中的类型是确定值,那么可...
  • lilovfly
  • lilovfly
  • 2016年11月03日 08:57
  • 1064

SQL语句常见优化十大案例

1、慢SQL消耗了70%~90%的数据库CPU资源; 2、SQL语句独立于程序设计逻辑,相对于对程序源代码的优化,对SQL语句的优化在时间成本和风险上的代价都很低; 3、SQL语句可以有不同的写法; ...
  • z719725611
  • z719725611
  • 2016年10月25日 15:15
  • 3593

如何优化sql语句

 (1)选择最有效率的表名顺序(只在基于规则的优化器中有效):    ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将...
  • e3002
  • e3002
  • 2007年10月10日 10:18
  • 27874

面试中SQL优化回答思路

面试中,相信不少人遇到个SQL优化的问题,答案基本都是千篇一律,用数据库索引技术。 对此问题,在闲暇之余进行了思路,阅读了mysql技术内幕的相关书籍。根本的优化之道还的从SQL语句出发。 ...
  • RodJohnsonDoctor
  • RodJohnsonDoctor
  • 2015年03月22日 21:08
  • 17595

SQL里IN的用法以及优化

1.in后条件不多,可以考虑主表建索引,或用union all 代替   2. in 和 exists的区别: 如果子查询得出的结果集记录较少,主查询中的表较大且又有索引时应该用in, 反之如果...
  • wwsscc168
  • wwsscc168
  • 2016年06月08日 15:29
  • 2621

sql简单优化之in字句

如下: SQL> select empno,ename,sal,mgr from emp where mgr in(7902,7566,7788);      EMPNO ENAME   ...
  • woqiang68
  • woqiang68
  • 2014年04月03日 22:30
  • 1227

sql优化经典例子

场景 我用的数据库是mysql5.6,下面简单的介绍下场景 课程表 create table Course( c_id int PRIMARY KEY, name varchar...
  • fangqun663775
  • fangqun663775
  • 2017年05月16日 16:37
  • 1303

sql优化心得

sql语句优化  性能不理想的系统中除了一部分是因为应用程序的负载确实超过了服务器的实际处理能力外,更多的是因为系统存在大量的SQL语句需要优化。 为了获得稳定的执行性能,SQL语句越简单...
  • wang1127248268
  • wang1127248268
  • 2016年11月30日 20:51
  • 1521

对超长sql优化体会

可能对于大多数人对于超长的sql优化,可能看sql去理解逻辑都要花很长时间,尤其在帮别人优化的过程中,在不理解业务的情况下更是无从下手,其实对于超长sql的优化,其实并没有想象中的那么难,对于那些超长...
  • qq_22140799
  • qq_22140799
  • 2016年11月04日 09:26
  • 417

高级sql优化详解

1. 什么时候使用索引? (1) 如果检索全表,不必要建索引,因为索引会带来额外的IO操作 (2) 如果检索的记录数占全部表记录的10%以下,可以考虑建索引(大 ) (3) 表之间的关联字段可以考虑建...
  • zdp072
  • zdp072
  • 2016年04月08日 11:33
  • 1983
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:SQL优化
举报原因:
原因补充:

(最多只允许输入30个字)