Oracle数据库SQL语句性能调整

上传人:飞*** 文档编号:40217016 上传时间:2018-05-24 格式:DOC 页数:7 大小:46.50KB
返回 下载 相关 举报
Oracle数据库SQL语句性能调整_第1页
第1页 / 共7页
Oracle数据库SQL语句性能调整_第2页
第2页 / 共7页
Oracle数据库SQL语句性能调整_第3页
第3页 / 共7页
Oracle数据库SQL语句性能调整_第4页
第4页 / 共7页
Oracle数据库SQL语句性能调整_第5页
第5页 / 共7页
点击查看更多>>
资源描述

《Oracle数据库SQL语句性能调整》由会员分享,可在线阅读,更多相关《Oracle数据库SQL语句性能调整(7页珍藏版)》请在金锄头文库上搜索。

1、一、问题的提出一、问题的提出 在应用系统开发初期,由于开发数据库数据比较少,对于查询 SQL 语句, 复杂视图的的编写等体会不出 SQL 语句各种写法的性能优劣,但是如果将应用 系统提交实际应用后,随着数据库中数据的增加,系统的响应速度就成为目前 系统需要解决的最主要的问题之一。系统优化中一个很重要的方面就是 SQL 语 句的优化。对于海量数据,劣质 SQL 语句和优质 SQL 语句之间的速度差别可以 达到上百倍,可见对于一个系统不是简单地能实现其功能就可,而是要写出高 质量的 SQL 语句,提高系统的可用性。 在多数情况下,Oracle 使用索引来更快地遍历表,优化器主要根据定义的 索引来提

2、高性能。但是,如果在 SQL 语句的 where 子句中写的 SQL 代码不合理, 就会造成优化器删去索引而使用全表扫描,一般就这种 SQL 语句就是所谓的劣 质 SQL 语句。在编写 SQL 语句时我们应清楚优化器根据何种原则来删除索引, 这有助于写出高性能的 SQL 语句。 二、二、SQLSQL 语句编写注意问题语句编写注意问题 下面就某些 SQL 语句的 where 子句编写中需要注意的问题作详细介绍。在 这些 where 子句中,即使某些列存在索引,但是由于编写了劣质的 SQL,系统 在运行该 SQL 语句时也不能使用该索引,而同样使用全表扫描,这就造成了响 应速度的极大降低。 1.1

3、. ISIS NULLNULL 与与 ISIS NOTNOT NULLNULL 不能用 null 作索引,任何包含 null 值的列都将不会被包含在索引中。即 使索引有多列这样的情况下,只要这些列中有一列含有 null,该列就会从索引 中排除。也就是说如果某列存在空值,即使对该列建索引也不会提高性能。任 何在 where 子句中使用 is null 或 is not null 的语句优化器是不允许使用索 引的。 2.2. 联接列联接列 对于有联接的列,即使最后的联接值为一个静态值,优化器是不会使用索 引的。我们一起来看一个例子,假定有一个职工表(employee),对于一个职 工的姓和名分成两

4、列存放(FIRST_NAME 和 LAST_NAME),现在要查询一个叫比 尔.克林顿(Bill Cliton)的职工。 下面是一个采用联接查询的下面是一个采用联接查询的 SQLSQL 语句语句: : select * from employss where first_name|last_name =Beill Cliton; 上面这条语句完全可以查询出是否有 Bill Cliton 这个员工,但是这里需 要注意,系统优化器对基于 last_name 创建的索引没有使用。 当采用下面这种 SQL 语句的编写,Oracle 系统就可以采用基于 last_name 创建的索引。 Select *

5、 from employee where first_name =Beill and last_name =Cliton; 遇到下面这种情况又如何处理呢?如果一个变量(name)中存放着 Bill Cliton 这个员工的姓名,对于这种情况我们又如何避免全程遍历,使用索引呢? 可以使用一个函数,将变量 name 中的姓和名分开就可以了,但是有一点需要注 意,这个函数是不能作用在索引列上。下面是 SQL 查询脚本: select * from employee where first_name = SUBSTR( 这里由于通配符(%)在搜寻词首出现,所以 Oracle 系统不使用 last_na

6、me 的索引。在很多情况下可能无法避免这种情况,但是一定要心中有 底,通配符如此使用会降低查询速度。然而当通配符出现在字符串其他位置时, 优化器就能利用索引。在下面的查询中索引得到了使用: select * from employee where last_name like c%; 4.4. OrderOrder byby 语句语句 ORDER BY 语句决定了 Oracle 如何将返回的查询结果排序。Order by 语句 对要排序的列没有什么特别的限制,也可以将函数加入列中(象联接或者附加 等)。任何在 Order by 语句的非索引项或者有计算表达式都将降低查询速度。 仔细检查 ord

7、er by 语句以找出非索引项或者表达式,它们会降低性能。解 决这个问题的办法就是重写 order by 语句以使用索引,也可以为所使用的列建 立另外一个索引,同时应绝对避免在 order by 子句中使用表达式。 5.5. NOTNOT 我们在查询时经常在 where 子句使用一些逻辑表达式,如大于、小于、等 于以及不等于等等,也可以使用 and(与)、or(或)以及 not(非)。NOT 可 用来对任何逻辑运算符号取反。下面是一个 NOT 子句的例子: . where not (status =VALID) 如果要使用 NOT,则应在取反的短语前面加上括号,并在短语前面加上 NOT 运算符

8、。NOT 运算符包含在另外一个逻辑运算符中,这就是不等于(INVALID; 再看下面这个例子: select * from employee where salary (SELECT MIN(X.ROWID) from EMP X WHERE X.EMP_NO = E.EMP_NO); (9)用 TRUNCATE 替代 DELETE: 当删除表中的记录时,在通常情况下, 回滚段(rollback segments ) 用来存放可以被恢复 的信息. 如果你没有 COMMIT 事务,ORACLE 会将数据恢复到删除之前的状态(准确地说是恢复到执行 删除命令之前的状况) 而当运用 TRUNCATE 时, 回滚段不再存放任何可被恢复的信息。当命令运行后,数据不能被恢复.因此很少的资源被 调用,执行时间也会很短。(TRUNCATE 只在删除全表适 用,TRUNCATE 是 DDL 不是 DML)。 Chinaz_com (10)尽量多使用 COMMIT: 只要有可能,在程序中尽量多使用 COMMIT, 这样程序的性能得到提高,需求也会因为 COMMIT 所释放的资源而减少,COMMIT 所释放的资源: a. 回滚段上用于恢复数据的信息。 b. 被程序语句获得的 .

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号