网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > 数据库 > Oracle教程
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
数据库:数据库教程,数据库技巧,Oracle教程,MySQL教程,Sybase教程,Access教程,DB2教程,数据库安全,数据库文摘
本月文章推荐
.如何查出前台正在发出的sql语句.
.Oracles XMLDB Study NOTE (2).
.LINUX+ORACLE安装和优化注意事项.
.Linux汇编指南.
.在linux8.0下,oracle9i的配置说.
.甲骨文公司举办太空游抽奖.
.微软向SAP甲骨文正式宣战.
.关于查询连续3次生子小于21的问题.
.Oracle 10g中用FIRALL处理非连续.
.内部错误,hostdef扩展名不存在.
.对刚接触oracle的人比较有用的一.
.Oracle数据库有哪几种启动方式.
.Oracle数据库技术(36).
.通过ORACLE APPLICATION SERVER实.
.查找约束条件(constraint)对应的.
.创建一个Oracle 数据库.
.grub中的分区命名方法.
.oracle中解决汉字无法显示、输入.
.数据库应用程序常见T-SQL和PL/SQL.
.PowerBuilder运行库以及ODBC接口.

Oracle SQL的优化(1)

发表日期:2008-2-9


1、在Oracle中有两种操作可以直接访问Table
   (1)Table Access Full
      --为了优化全表扫描的性能,Oracle在每次数据库读取中都会读取多个数据块;
      --只要查询中没有where子句,Oracle就会采用全表扫描。
   (2)Table Access by RowID(基于RowID的访问)
      --RowID记录了数据行的物理存储位置;
      --Oracle使用索引将数据值与RowID相关联,从而与数据物理位置相关联。
2、提示:在select要害字之后使用/*+... */ 3、使用Index:
   (1)Index unique scan
 select * from bookshelf where title='WTL'
 假设在title列上有唯一索引,则这个语句的执行方式为:
            a)首先通过insex unique scan操作访问title列索引;
     b)从索引返回与title值'WTL'相匹配的RowID值,然后利用此RowID值
       通过Table Access by RowID操作来查询BookShelf表。
   (2)Index range scan
        假如基于一个值的范围查询或者利用一个非唯一索引进行查询,则可以使用index range
      scan操作对索引进行查询。由于index range scan操作需要从索引中读取多个值,所以它的
      效率要比index unique scan低。
          假设emp表的ename上有一个非唯一索引idx_emp_ename,假如在查询的where子句中给出
      ename的限定条件,则可能会执行idx_emp_ename索引的index range scan操作,应为ename上
      的这和索引是一个非唯一性索引,所以数据库不能在该索引上执行index unique scan操作,
      即便是ename等于查询中的单个值也不行,即...where ename='GLEDESON' 和
      ...where ename like 'G%'都是执行index range scan 操作的。
          注重:假如在like条件中的开头使用了通配符则查询将不会使用索引(如:like '%M%')
                来解决这个查询。
4、使用索引的注重事项:
   (1)假如设置了一个索引列等(=)一某个值,则将使用index range scan操作
             --唯一索引(unique index)
      *索引--
             --非唯一索引(non-unique index)    (2)要使用一个索引不一定要给出明确的值,index range scan操作可为值的范围扫描一个索引,具
      体的操作符有"<"、">"、"like",注重:不要在like算式的开头使用通配符!!
                 --索引的全表扫描
      *全表扫描--
                 --表的全表扫描
   (3)假如在where条件中使用了函数,则不会使用索引,除非索引是基于函数的!
   (4)在查询条件中使用了is null、is not null则不会使用索引。
(null值是不存在索引中的)
      *在大多数情况下,执行全表扫描将会比执行用索引返回的所有值执行索引扫描更为有效!
   (5)假如在查询条件中使用了"!="操作将不会使用索引,"<>"也不会。
   (6)使用not in、in操作符也不会使用索引,在Oracle中,几乎所有的not in、in操作都可以
      用not exists、exists来代替。...where exists(select 'x' from ...where ...)
      *使用exists子句,不管从子查询中抽取什么数据,它只会查看where子句。这样优化器就
       不会遍历整个表而仅根据索引就可以完成工作(这里假设where子句中的列上使用了index).
       通过使用exists,Oracle系统会首先检查主查询,然后运行子查询直到它找到第一个匹
       配项,这样就节省了时间。Oracle在执行in查询时,首先执行子查询,并将获得的结果列
       表存放到一个加了索引的临时表中,在执行子查询之前,先将主查询挂起,待子查询执行
       完毕存放到临时表中以后再执行主查询,这就是使用exists比使用in通常查询速度快的原
       因。
   (7)假如设置了复合索引的首列等于某个值,则使用该索引。
      *在复合索引中,Oracle9i之前,只有在限定条件中使用了复合索引的首列,才会使用该索
       引,但Oracle9i之后,索引的跳跃扫描特性答应优化器潜在地使用连接索引,即使复合索
       引的首列没有出现在where子句中也是如此!
   (8)假如选择了一个索引列的max或min函数,则优化器会使用此索引来快速地找到列的最大最小
      值。
   (9)索引的选择性:假设一个表中有100行,其中的一列(这列上有索引)中不重复的纪录有80个,
      也就是说有20行纪录有重复,则这个索引的选择性为80/100=0.80,即这列上的索引的选择
      性是80%,选择性越高,列中每个不同的值返回的行的数目就越少。
          假如使用的优化模式是CBO,并且索引是经过分析的,则优化程序就会考虑索引的选择
      性来判定使用索引是否会降低执行查询的成本。
上一篇:转一个很好的Oracle贴子 人气:652
下一篇:Oracle 9i在AIX 5L上的安装、建库和升级 人气:833
浏览全部Oracle教程的内容 Dreamweaver插件下载 网页广告代码 祝你圣诞节快乐 2009年新年快乐