您的位置:首页 > 数据库

SQL语句优化(一)

2015-09-24 22:22 344 查看
1.select语句中避免使用“*”:这是因为oracle系统需要通过数据字典将语句中的“*”转换成表中所有的列名。

2.使用where子句替代having子句:在select语句中,使用where子句过滤行,使用having子句过滤分组也就是在行分组之后才执行过滤。因为行被分组需要一定的时间,所以应该尽量使用where子句过滤行,减少分组的行数,也就减少了分组时间,从而提高了语句的执行效率。having字句一般用于对一些集合函数执行结果的过滤,如count()、avg()等。除此之外,一般的检索条件应该写在where子句中。

3.使用TRUNCATE替代DELETE:删除表中的数据可以使用DELETE语句,也可以使用TRUNCATE语句。其中,使用DELETE语句删除表中所有的数据时,Oracle会对数据逐行删除,并且使用回滚段来记录删除操作,如果用户在没有使用COMMIT提交之前使用ROLLBACK命令进行回滚操作,则Oracle会将表中的数据恢复到删除之前的状态。使用TRUNCATE语句删除表中的所有数据行时,Oracle不会在撤消表空间中记录删除操作,这就提高了语句的执行速度。而且这种删除是一次性的,也就是执行一次TRUNCATE语句,所有的数据行是在同一时间被删除。如果确定要删除表中的所有行,建议使用TRUNCATE语句。

4.在确保完整性的情况下多用COMMIT语句:当用户执行DML操作后,如果不使用COMMIT命令进行提交,则Oracle会在回滚段中记录DML操作,以便用户使用ROLLBACK命令对数据进行恢复。Oracle实现这种数据回滚功能,需要花费相应的时间与空间资源。在确保数据完整性的情况下,尽量及时地使用COMMIT命令对DML操作进行提交。

5.使用表连接而不是多个查询:在执行每条查询语句时,Oracle内部执行了许多工作——解析SQL语句、估算索引的利用率、绑定变量,以及读取数据块等。因此,要尽量减少访问SQL语句的执行次数。尽量减少表的查询次数,主要是指可以使用一次查询获得的数据,尽量不要通过两次或更多次的查询获得。

6.使用EXISTS替代IN:IN操作符用于检查一个值是否包含在列表中。EXISTS与IN不同,EXISTS只检查行的存在性,而IN检查实际的值。在子查询中,EXISTS提供的性能通常比IN提供的性能要好。因此建议使用EXISTS操作符来替代IN操作符的使用,使用NOT EXISTS替代NOT IN,来提高查询的执行效率。

7.使用EXISTS替代DISTINCT:在连接查询的SELECT语句中,DISTINCT关键字用于禁止重复行的显示;EXISTS用于检查子查询返回的行的存在性。尽量使用EXISTS替代DISTINCT,因为DISTINCT在禁止重复行显示之前要排序检索到的行。

8.使用“<=”替代“<”:在检索条件的子句中,经常使用运算符“<=”和“<”,其中,前者用来表示小于等于某个值,后者用来表示小于某个值。很多时候,这两个比较运算符可以替换使用,例如empno <= 7900和empno<7901的检索结果是一样的,但是检索效率是不一样的,建议使用“<=”替代“<”的使用。这两个运算符的区别在于,如果使用“empno<7901”,则Oracle会定位到7901,然后再去寻找比7901小的数据;如果使用“empno<=7900”,则Oracle会直接定位到等于7900的数。 

9.使用完全限定的列引用:在查询中包含多个表时,为每个表指定表别名,并且为所引用的每列都显式地指定合适的别名,这称为完全限定的列引用。 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: