转至繁体中文版     | 网站首页 | 图文教程 | 资源下载 | 站长博客 | 图片素材 | 武汉seo | 武汉网站优化 | 
最新公告:     敏韬网|教学资源学习资料永久免费分享站!  [mintao  2008年9月2日]        
您现在的位置: 学习笔记 >> 图文教程 >> 数据库 >> ORACLE >> 正文
Oracle 高效SQL         ★★★★

Oracle 高效SQL

作者:闵涛 文章来源:闵涛的学习笔记 点击数:1427 更新时间:2009/4/22 22:03:46
索引键值. 这个索引的选择性就是80/100 = 0.8 . 选择性越高, 通过索引键值检索出的记录就越少. 如果索引的选择性很低, 检索数据就需要大量的索引范围查询操作和ROWID 访问表的操作. 也许会比全表扫描的效率更低.下列经验请参阅:a.       如果检索数据量超过30%的表中记录数.使用索引将没有显著的效率提高. b.       在特定情况下, 使用索引也许会比全表扫描慢, 但这是同一个数量级上的区别. 而通常情况下,使用索引比全表扫描要块几倍乃至几千倍! 

7.用UNION (ALL)替换OR (适用于索引列)

通常情况下, 用UNION替换WHERE子句中的OR将会起到较好的效果. 对索引列使用OR将造成全表扫描. 注意, 以上规则只针对多个索引列有效. 如果有column没有被索引, 查询效率可能会因为你没有选择OR而降低.    在下面的例子中, LOC_ID 和REGION上都建有索引.高效:   SELECT LOC_ID , LOC_DESC , REGION   FROM LOCATION   WHERE LOC_ID = 10   UNION   SELECT LOC_ID , LOC_DESC , REGION   FROM LOCATION   WHERE REGION = “MELBOURNE” 低效:   SELECT LOC_ID , LOC_DESC , REGION   FROM LOCATION   WHERE LOC_ID = 10 OR REGION = “MELBOURNE” 如果你坚持要用OR, 那就需要返回记录最少的索引列写在最前面. 注意: WHERE KEY1 = 10   (返回最少记录)OR KEY2 = 20        (返回最多记录) ORACLE 内部将以上转换为WHERE KEY1 = 10 AND((NOT KEY1 = 10) AND KEY2 = 20)

8.用>=替代>

DEPT>3和DEPT>=4两者的区别在于, 前者DBMS将直接跳到第一个DEPT等于4的记录而后者将首先定位到DEPTNO=3的记录并且向前扫描到第一个DEPT大于3的记录.  

No14:用UNION ALL 替换UNION ( 如果有可能的话)

 当SQL语句需要UNION两个查询结果集合时,这两个结果集合会以UNION-ALL的方式被合并, 然后在输出最终结果前进行排序.如果用UNION ALL替代UNION, 这样排序就不是必要了. 效率就会因此得到提高.

No15:使用提示(Hints)

对于表的访问,可以使用两种Hints.FULL 和 ROWIDFULL hint 告诉ORACLE使用全表扫描的方式访问指定表.例如:   SELECT /*+ FULL(EMP) */ *   FROM EMP   WHERE EMPNO = 7893;   ROWID hint 告诉ORACLE使用TABLE ACCESS BY ROWID的操作访问表.   通常, 你需要采用TABLE ACCESS BY ROWID的方式特别是当访问大表的时候, 使用这种方式, 你需要知道ROIWD的值或者使用索引.   如果一个大表没有被设定为缓存(CACHED)表而你希望它的数据在查询结束是仍然停留在SGA中,你就可以使用CACHE hint 来告诉优化器把数据保留在SGA中. 通常CACHE hint 和 FULL hint 一起使用.例如:SELECT /*+ FULL(WORKER) CACHE(WORKER)*/ *FROM WORK;    索引hint 告诉ORACLE使用基于索引的扫描方式. 你不必说明具体的索引名称例如:   SELECT /*+ INDEX(LODGING) */ LODGING   FROM LODGING   WHERE MANAGER = ‘BILL GATES’;   在不使用hint的情况下, 以上的查询应该也会使用索引,然而,如果该索引的重复值过多而你的优化器是CBO, 优化器就可能忽略索引. 在这种情况下, 你可以用INDEX hint强制ORACLE使用该索引.   ORACLE hints 还包括ALL_ROWS, FIRST_ROWS, RULE,USE_NL, USE_MERGE, USE_HASH 等等.   使用hint , 表示我们对ORACLE优化器缺省的执行路径不满意,需要手工修改.这是一个很有技巧性的工作. 我建议只针对特定的,少数的SQL进行hint的优化.对ORACLE的优化器还是要有信心(特别是CBO)

No16:避免使用耗费资源的操作

带有DISTINCT,UNION,MINUS,INTERSECT,ORDER BY的SQL语句会启动SQL引擎执行耗费资源的排序(SORT)功能. DISTINCT需要一次排序操作, 而其他的至少需要执行两次排序.例如,一个UNION查询,其中每个查询都带有GROUP BY子句, GROUP BY会触发嵌入排序(NESTED SORT) ; 这样, 每个查询需要执行一次排序, 然后在执行UNION时, 又一个唯一排序(SORT UNIQUE)操作被执行而且它只能在前面的嵌入排序结束后才能开始执行. 嵌入的排序的深度会大大影响查询的效率.通常, 带有UNION, MINUS , INTERSECT的SQL语句都可以用其他方式重写.    如果你的数据库的SORT_AREA_SIZE调配得好, 使用UNION , MINUS, INTERSECT也是可以考虑的, 毕竟它们的可读性很强

No17:分离表和索引

总是将你的表和索引建立在不同的表空间内(TABLESPACES). 决不要将不属于ORACLE内部系统的对象存放到SYSTEM表空间里. 同时,确保数据表空间和索引表空间置与不同的硬盘控制卡控制的硬盘上.

No18:排序发生的情况

 
  SQL中包含group by 子句
  SQL 中包含order by 子句
  SQL 中包含 distinct 子句
  SQL 中包含 minus 或 union操作
  创建索引时这些情况慢。

No19:execute immediate, DBMS_SQL

动态SQL中,尽量多用execute immediate,而少用DBMS_SQL,前者综合效率优于后者

No20:用like替换和substr


对于‘like’和‘substr’,其效率并没有多大分别。但是,当所搜索的值不存在时,使用‘like’的速度明显大于‘substr’。
所以:select  *  from  a  where  substr(a1,1,4) = ''''5378''''  可以用like替代
select  *  from  a  where  a1  like  ‘5378%’

No20:DML语句优化

       1.如果有可能的话truncate 替代delete       2.大表的删除转化为对剩余部分建表,truncate原表然后将新建的表改名为原表.       3.Update多列的时候,尽量不要用多个set;如:UPDATE EMP           SET (EMP_CAT, SAL_RANGE)             = (SELECT MAX(CATEGORY) , MAX(SAL_RANGE)             FROM EMP_CATEGORIES)           WHERE EMP_DEPT = 0020;       4.如果有索引,删除索引后执行操作,操作完成后重建索引。       5.环境允许的话使用并行

No21:使用并行

hint /*+ parallel(tablename,parallel-degree)*/调整并行执行的目的是:最大地发挥硬件的能力。如果你有一个高性能的系统,有高优先的SQL语句在运行,则并行语句就可以使用所有有效的资源。Oracle可以执行的下面的并行: l       并行查询;l       并行DML(包括 INSERT, UPDATE, DELETE; APPEND提示,并行索引扫描);l       并行 DDL;如果你的系统缺少以下这些特点,则并行可能不会有多大改善。l       对称多处理器(SMP), 集群或强大的并行系统;l       有效的I/O带宽;l       低利用的或闲置的CPU(如CPU使用小于30%);l       对附加的内存无效,如分类、哈西索引及I/O缓冲区等。如果指定的并行度大于实际可用的资源(硬件资源>parallel_max_server>你指定的并行度),将会使用最大的可用资源的并行度来处理。如果多人同时使用并行, sum(parallel_degree)>parallel_max_server ;可能产生等待使效率下降。 

上一页  [1] [2] 


[Access]sql随机抽取记录  [Access]ASP&SQL让select查询结果随机排序的实现方法
[系统软件]EXP-00008: ORACLE error 904 encountered的解决方…  [系统软件]SQL语句性能优化--LECCO SQL Expert
[常用软件]PB7 连接 Oracle 的配置方法  [C语言系列]SQL Server到DB2连接服务器的实现
[C语言系列]SQL Server到SYBASE连接服务器的实现  [C语言系列]SQL Server到SQLBASE连接服务器的实现
[C语言系列]SQL Server连接VFP数据库的实现  [C语言系列]ASP+SQL Server之图象数据处理
教程录入:mintao    责任编辑:mintao 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    同类栏目
    · Sql Server  · MySql
    · Access  · ORACLE
    · SyBase  · 其他
    更多内容
    热门推荐 更多内容
  • 没有教程
  • 赞助链接
    更多内容
    闵涛博文 更多关于武汉SEO的内容
    500 - 内部服务器错误。

    500 - 内部服务器错误。

    您查找的资源存在问题,因而无法显示。

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved.
    闵涛 投放广告、内容合作请Q我! E_mail:admin@mintao.net(欢迎提供学习资源)

    站长:MinTao ICP备案号:鄂ICP备11006601号-18

    闵涛站盟:医药大全-武穴网A打造BCD……
    咸宁网络警察报警平台