执行计划PL/SQL 按键 F5可以查看执行计划注意该执行计划并非实际执行之后的反馈而是按照既定规则进行评估执行顺序按照右上优先顺序执行通俗来说的优化方式观察耗费/时间高的访问谓词优化这部分SQL计划解释Decription名称适用符号备注TABLE ACCESS FULL全表扫描TABLE ACCESS BY INDEX SCAN索引扫描whereINDEX UNIQUE SCAN索引唯一扫描INDEX RANGE SCAN索引范围扫描, ,, , ,betweenINDEX FULL SCAN索引全局扫描INDEX FAST FULL SCAN索引快速扫描类似索引全局扫描区别是不进行排序INDEX SKIP SCAN索引跳跃扫描HASH JOIN哈希连接等值连接基础优化查询时应尽量减少多余数据的读取如Select * from table如果在语句中有not inin操作应尽量用not existsexists来代替。特别对大数据量的两者检索速度有很明显的区别查询语句中查询条件里尽可能减少子查询SQL语句中不宜使用3层以上的嵌套查询查询语句条件中应尽量避免使用order by或group by对索引列的比较应尽量避免使用not 或 !应尽量将数据库函数、计算表达式写在逻辑操作符右边。因为这些对列的操作会将导致表扫描影响性能在where子句中若有多个过滤条件应将索引列或过滤记录数最多的列放在后面因为SQL执行顺序是自下而上自右向左能用连接方式实现的功能不得用子查询避免在索引列上使用函数或者表达式举例SELECT CONTNO FROM Person WHERE TRIM(name) ‘张三’name是索引列使用函数后会导致索引失效。用not exists代替 not in、用decode代替case when、用UNION替换OR多表联查时必须存在准确的关联条件避免出现笛卡尔积举例:SELECT A.name FROM Student A,Person B WHERE B.age ‘20’由于AB没有明确关联会产生巨量A表总条数*B表符合条件的总条数的查询结果。应尽量避免在where 子句中使用!或操作符否则引擎将放弃使用索引而进行全表扫描。对查询进行优化应尽量避免全表扫描首先应考虑在where 及orderby 涉及的列上建立索引。应尽量避免在where 子句中对字段进行null 值判断否则将导致引擎放弃使用索引而进行全表扫描。如select id from t where num is null。可以在num 上设置默认值0确保表中num 列没有null 值然后这样查询select id from t where num0尽量避免在where 子句中使用or 来连接条件否则将导致引擎放弃使用索引而进行全表扫描如select id from t where num10 or num20。可以这样查询select id from t where num10union allselect id from t where num20尽量少用或者不用sqlserver 自带的函数select id from t where substring(name,1,3) ’abc’select id from t where datediff(day,createdate,’2005-11-30′) 0可以这样查询select id from t where name like ‘abc%’select id from t where createdate ‘2005-11-30’ and createdate ‘2005-12-1’连续数值条件用BETWEEN 不用INSELECT id FROM t WHERE num BETWEEN 1 AND 5Update 语句如果只更改1.2 个字段不要Update 全部字段否则频繁调用会引起明显的性能消耗尽量使用数字型字段若只含数值信息的字段尽量不要设计为字符型不建议使用select * from t 用具体的字段列表代替“*”不要返回用不到的任何字段。尽量避免向客户端返回大数据量若数据量过大应该考虑相应需求是否合理表与表之间通过一个冗余字段来关联要比直接使用JOIN 有更好的性能