SQL语句优化系列二(编写最优的SQL语句)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL语句优化系列二(编写最优的SQL语句)相关的知识,希望对你有一定的参考价值。
编写最优的SQL语句
一,编写SQL语句的一些基本原则
IN 操作符
用IN写出来的SQL的优点是比较容易写及逻辑清晰易懂,比较适合新手和结构复杂的SQL语句,缺点是性能往往是比较低的。ORACLE执行此类SQL时,会试图将其转换成多个表的连接,如果转换不成功则先执行IN里面的子查询,再查询外层的表记录,如果转换成功则直接采用多个表的连接方式查询。由此可见用IN的SQL至少多了一个转换的过程。一般的SQL都可以转换成功,但对于含有分组统计等方面的SQL就不能转换了,通常用EXISTS替换IN,或者使用表关联
NOT IN操作符,<> 操作符,IS NULL或IS NOT NULL操作符
此类操作符尽量不要使用,因为它不能应用表的索引 NOT IN 可以用NOT EXISTS 或(外连接+判断为空)方案代替,不等于操作符可以用其它操作符替代,如:<>a 改为>a or <a,<>’’ 改为IS NULL 或IS NOT NULL操作(判断字段是否为空)
用表连接替换EXISTS
灵活使用> 及 < 操作符(大于或小于操作符)
大于或小于操作符一般不调整也会使用索引查找,但有的情况下可以对它进行优化,如一个表有100万记录,一个数值型字段A,30万记录的A=0,30万记录的A=1,39万记录的A=2,1万记录的A=3。那么执行A>2与A>=3的效果就有很大的区别了,因为A>2时ORACLE会先找出为2的记录索引再进行比较,而A>=3时ORACLE则直接找到=3的记录索引
灵活使用LIKE操作符
LIKE操作符的通配符组合可能达到几乎是任意的查询,但是如果用得不好则会产生性能上的问题,如LIKE ‘%5400%’ 这种查询不会引用索引,而LIKE ‘X5400%’则会引用范围索引。一个实际例子:用YW_YHJBQK表中营业编号后面的户标识号可来查询营业编号 YY_BH LIKE ‘%5400%’ 这个条件会产生全表扫描,如果改成YY_BH LIKE ’X5400%’ OR YY_BH LIKE ’B5400%’ 则会利用YY_BH的索引进行两个范围的查询,性能就会大大提高
用Where子句替换HAVING子句
避免使用HAVING子句,HAVING 只会在检索出所有记录之后才对结果集进行过滤。这个处理需要排序、总计等操作。如果能通过WHERE子句限制记录的数目,那就能减少这方面的开销
用TRUNCATE替代DELETE
当删除表中的记录时,在通常情况下,用回滚段(rollback segments ) 来存放可以被恢复的信息。如果你没有COMMIT事务,ORACLE会将数据恢复到删除之前的状态(准确地说是恢复到执行删除命令之前的状况),而当运用TRUNCATE时,回滚段不再存放任何可被恢复的信息。当命令执行后,数据不能被恢复。因此很少的资源被调用,执行时间也会很短
减少对表的查询
使用别名
当在SQL语句中连接多个表时,请使用表的别名并把别名前缀于每个Column上。这样一来,就可以减少解析的时间并减少那些由Column歧义引起的语法错误
使用内部函数
尽量多使用COMMIT
尽可能利用索引和分区
二,使用索引的一些注意事项
尽量使用索引的第一个列
不要在WHERE子句中转换索引字段的类型
尽量避免在索引上使用计算
同时有两个可用索引时,主键索引和唯一索引的级别高于普通索引
强制使用制定索引
强制索引失效
通过该表该字段的类型或增加连接符
分离表和索引
尽量把表和索引建在不同的表空间中,确保数据表空间和索引表空间置于不同的磁盘上。
定期对索引进行统计信息的收集
Oracle 10g 自动收集统计信息,也会自动分析索引。
应用程序中,尽量使用绑定变量的SQL语句
以上是关于SQL语句优化系列二(编写最优的SQL语句)的主要内容,如果未能解决你的问题,请参考以下文章
openGauss数据库源码解析系列文章—— SQL引擎源解析
SQL Server调优系列玩转篇三(利用索引提示(Hint)引导语句最大优化运行)