当前位置:Gxlcms > 数据库问题 > SQL语句优化系列二(编写最优的SQL语句)

SQL语句优化系列二(编写最优的SQL语句)

时间:2021-07-01 10:21:17 帮助过:20人阅读

一,编写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语句)

标签:强制   调用   回滚   不成功   自动收集统计信息   组合   sts   语法   not   

人气教程排行