ǰλã >> SQL >> 高级SQL优化(
  ϸ

高级SQL优化(

ȶȣ5618   ʱ䣺2016-05-05 12:51:03.0
高级SQL优化(?

??/p>

Oracle数据完整性和锁机?/a> 
索引及优化之表分?/a> 
表分析?约束及表间关系 
Oracle体系结构1
Oracle体系结构2 
海量数据库及分区1 
海量数据库及分区2 
海量数据库及分区3 
海量数据库及分区4 
高级SQL优化(?)  
高级SQL优化(?  
高级SQL优化(? 常用优化工具 
PPT和源码下载:    http://sishuok.com/forum/posts/list/6365.html
配?视?课程
    Oracle性能优化 http://sishuok.com/product/601 
    海量数据库和高级SQL优化 http://sishuok.com/product/602
 
 
充分利用索引
索引的限?/strong>
1. 索引对不等号和NOT的限?/strong>
  如果WHERE条件??=或??lt;>,即使?列建立了索引,则该索引也不会??如果不恰当的使用了NOT,则索引也不会?使用?/div>
Oracle 10g起,在基于CBO的优化器模式下Oralce会进行自动优化,但在基于RBO(基于?则)的优化器模式下,依然保持此?则??/div>
  
 
1. 索引对不等号和NOT的限?/strong>
   RBO模式下,执?计划如下?/div>
   
1. 索引对不等号和NOT的限?/strong>
   RBO模式下,执?情况如下?/div>
   
 
  此时使用变?写法的耗费为:0.407/2.187=1.60%!
1. 索引对不等号和NOT的限?/strong>
   CBO模式下,执?情况如下?/div>
  
 
此时使用变?写法的耗费节约不到0.03秒,但依然更优,故?推荐此?变?写法,再看此时使用NOT?/div>
1. 索引对不等号和NOT的限?/strong>
   CBO模式下,在JYJE列的索引上使用NOT?/div>
  
为使?lt;>的:0.156/0.329=47.42%!为变通写法的使用0.156/0.297=52.53%?span class="Apple-converted-space"> ?/strong> 此这种写法最优!
 
1. 索引对不等号和NOT的限?/strong>
   ??WHERE条件?如果索引列是字?列,使用NOT??也不会使用索引:
  
结?:?果索引列?字,则?于不等号的?理可以变更为NOT的方式或?大于 OR 小于)的方式① ;?于确实无法不使用不等号的方式,可以使用默认?② ;?果可以建立位图索引则使用位图索引?;否则可以?虑使用分区等方法进行优化④ ,具体是情况而定?/div>
2. 索引对IS NULL的限?/strong>
   ??说,如果WHERE子句基于的列?空的列,且其建立了索引,如果使用了IS NULL,由于NULL的列?不包?索引?因?无法利用索引?/div>
?以一??要建立索引的列不要???,?果确实含有空值,建?使用默?值代替空值,具体参?前面章节“SQL优化?巧?部分的“使用默认????/div>
 
3. 索引对函数的限制
基于索引IDX_BIGTAB_OBJECTNAME,执行情况?下:
  
 
执?计划情况如下?/div>
  
这是因为该索引是常?b-tree索引,?该列在WHERE子句?用了函数,则不能使用索引。因此,对在WHERE子句?常?使用函数时,应?建立基于函数的索引,?span class="Apple-converted-space"> ?当查询?句包??函数或?表达式时,基于函数的索引才会??/strong> ?/strong>。?情?参?索引部分的理论?解!
 
创建并使用函数索引:
 
  
创建并使用函数索引:
此时使用基于函数的索引效率是原来?.782/0.188?4.78!呗?/div>
4. 索引对不匹配数据类型的限?/strong>
先看执?情况?/div>  
不匹配的类型执?的时间是匹配的类型的 2.187/0.266=8.2 倍!
 
再看执?计划?/div>
  
原因分析?/strong>
  因为ACCOUNT_TRADE表的字?YKKH是CHAR,因此在对其指定的?是数字时,Oracle虽然能隐式的执?数字和字符的?,但不会调用其索引??当对其指定?符时,则不存在???,索引可以调用??/div>
注意:因为数?型的不匹配和Oracle对数?型的隐式?,?种类型的低效代码在任何项?均可能因为大意?存?因?建??发人员和管理人员要定期抽查相应的代码,以杜绝此类低效代码?/div>
索引类型总结
类型
,描?/strong>
b-tree索引
?常最多使用的索引,其树结构与二叉树比较类似,根据ROWID??定位所访问的?
bitmap索引
使用位图来?理与数据行的对应关系,?用于基数比较少的列
降序索引
降序索引在叶子节点中的存储从左到右是按照从大到小排序的;??针?逆向排序较?的查询时才使用?类型索引
函数索引
针?要?繁?列使用函数的索引,只有当查??包含该函数或者表达式时,基于函数的索引才会?调用
反转索引
反转了b*tree索引码中的字节,使索引条?配更均匀,?用于并?服务器环境下,用于减少索引的竞争
分区索引
分区表的索引,又包括?分区索引(?前缀分区索引和本地非前缀分区索引)和全?索引,一??用本地分区索引,因其与基表具有良好的数据均衡性和?护??/div>
 
 
访问?
1. 全表?
 全表?(FULL TABLE SCANS)时?有?、所有数?均会??到,?span class="Apple-converted-space"> 效率??/strong>的一种,??在表 缺少索引?span class="Apple-converted-space"> 读取大量数据?span class="Apple-converted-space"> 访问小表?span class="Apple-converted-space"> 高并发时发生?/div>
 
 
2. ROWID?
  ROWID?(ROWID SCANS)是通过ROWID??件和块位?????。一?为??引后的?二?,?果??列全部包?索引?则不会执行ROWID??/div>
 
  作为索引访问后的?步:
  访问的列全部在索引中不再执?ROWID? 
 
3. 索引?
  索引?(INDEX SCANS)包含全索引扫描(full index scan、FIS)?快速全索引?(fast full index scan、FFIS)、索引范围扫?index range scan)、索引唯?? (index unique scan)、索引跳跃式? (index skip scan)、位图索引扫?bitmap index scan)?span class="Apple-converted-space"> 其中?种在?列?程的索引?/strong> 节部分已经?解了其理论和示例。位图索引示例?下:
 
3. 索引?
类型
方式
发生条件
 1.FULL INDEX SCANS
逐一读取索引??有块,由于索引中数据已按索引?序,因?会忽略掉排序
1.ORDER BY?列全部在该索引中?span class="Apple-converted-space"> 
2.ORDER BY?的顺序满足索引中前?列的顺序?br>3.使用GROUP BY且?子句?列在索引?
2.FAST FULL INDEX SCANS
?描索引中的数?不会?表中的数?由于索引??按索引键排序,因此不能忽略掉排序
当同时满足下列条件是,Oracle用FFIS替代FIS: 
1.查?的所有列均包?索引?span class="Apple-converted-space"> 
2.索引?列至少一?有not null约束
3.INDEX RANGE SCANS
访问选择性数?常用的扫描方式;按顺序的对某?引进行扫描,返回数据?序排列的,可以使用唯?索引和非?索引;如果对索引列使用ORDER BY/GROUP BY则可省略排序
1.在唯?索引上使用范围操作?(>?lt;?gt;=?lt;=?lt;>、BETWEEN) 
2.在组合索引上使用部分列进行查?导致查出多?
4.INDEX UNIQUE SCANS
??索引或主?要么返回?行数??么返?行数?/div>
1.当使用唯?索引?span class="Apple-converted-space"> 
2.当使用主?
5.INDEX SKIP SCANS
其实质是将索引分解成多个小的子索引来提高效率,系?i?始引?/div>
复合索引?导列的取值是枚举的从而可以分拆为多个子索?并且查?条件??导列?/div>
 
为了 加深巩固前面的知?/strong>,本处?前五种索引扫描?习?结如下?/div>
(1).全索引扫?/div>
逐一读取索引??有块,由于索引中数据已按索引?序,因?会忽略掉排序,可能发生的情况如下?/div>
A. ORDER BY?列全部在某个索引?/div>
   全部在某?引中?/div>
 
(1).全索引扫?/div>
B. ORDER BY?的顺序满足索引中前?列的顺序?/div>
  下面分别?足和不满足前导列顺序时:
C. 使用GROUP BY且?子句?列在索引?
(2).??全索引?
?描索引中的数?不会?表中的数?由于索引??按索引键排序,因此不能忽略掉排序。当同时满足下列条件时,Oracle用FFIS替代FIS或FTS:
1.查?的所有列均包?索引?/div>
2.索引?列至少一?有not null约束?0g?始的,原低版?系统?查?的列?包含任何null值) 
 
全部列均在索引中?/div>  
 
  有列不在索引? 
 
删除该索引,创建新索引,两个列均为可空:
此时即使全部列在该索引中?/strong>  也不会发生FFIS
索引范围?????择性数?常用的扫描方式;按顺序的对某?引进行扫描,返回数据?序排列的,可以使用唯?索引和非?索引;如果对索引列使用ORDER BY/GROUP BY则可省略排序?/div>
下列情形?发生索引范围??/div>
A.在唯?索引上使用范围操作?(>?lt;?gt;=?lt;=?lt;>、BETWEEN)
B.在组合索引上使用部分列进行查?导致查出多?
示例请参考本系列课程的索引章节部?/strong>
 
(4).索引??
  当使用主??索引时发生??span class="Apple-converted-space"> 示例请参考本系列课程的索引章节部分??/strong>
(5).索引跳跃?
    复合索引?导列的取值是枚举的从而可以分拆为多个子索?并且查?条件??导列时?示例?下:
create table customers as select * from sh.customers;
CREATE INDEX customers_gender_email
  ON customers (cust_gender, cust_email);
 
(5).索引跳跃?
 没进行表分析前:
  
 进?表分后:
   analyze table customers compute statistics;
  
 
何时?要索?/strong>
??,?于从表的总??大部分查询只查?不到10%数据(有的称?%-4%)的??考虑创建索引。一??虑的索引的原则包括?/div>
 
l对于经常以查询关?为基?的表,并且?表中的数????分布?/div>
l以查询关?为基?,表?数据行随机排?/div>
l表中包含的列数相对比较少(仅仅是相?,需要根?际情况确?
l表中的大多数查?都包?对简单的WHERE子句
l表的记录数比较少的,不建?用索引,如数?超过1万?的表不?建立?/div>
  
 
为索引?择列和表达?/strong>
???原则包括?/div>
l经常在WHERE子句?用的?/div>
lSQL??常用于表之间连接的列
l重?性少(可选择性高)的关键字,如主?/div>
l不宜将经常UPDATE的列作为索引?/div>
l不宜将经常在WHERE子句??但与函数或操作?相结合的列作为索引列
l对于取?较少的列,应?虑建立位图索引,?不应?采用B树索?/div>
l如果经常访问的列上?使用函数,应使用基于函数的索?/div>
 
??举例说明取?较少的列使用bitmap索引和b-tree的?比分析,B-tree时:
 
 
bitmap时:
 
 
使用复合索引
  多个列联合起来组成的索引称为复合索引、或联合索引或?组合索引,??联合索引比单?引具有更好的性能。创建联合索引一??原则包括?/div>
l经常在WHERE子句?用的列且这些列之间使用AND连接
l查?条件?包括n?的AND关系,?大多数情况下使用m??n>m),应该?虑复合索引,且n?为前导列
l某几?联合起来能?组成?索引,应坚决建立联合?索引
l复合索引?建?至少??能为null,且如果?尽量将只?在null的列对其null值采用其它默认?代?/div>
 
??举例说明Where?含AND时使用??引?能低于联合索引的示例,使用多个索引时:
  
 
 
??举例说明Where?含AND?用??引?能低于联合索引的示例,使用复合索引时:
 
 
结??/div>
项目
多个索引
复合索引
复合索引???引的
?、执行时?/div>
0.281
0.11
39.15%
二?执行??/div>
   
1.总?费
1658
464
27.99%
2.I/O耗费
1562
462
29.58%
3.时间
19
6
31.58%
??,?时?合索引是多个索引的效率的 四?以上!
监?索引的使用情?/strong>
u正确合?的索引??化?能的??/div>
u索引?的索引列排序后的小型化拷贝,会?加存储开?,因此会带来Insert、Update、Delete的?外开?
u???有一?引,也可以有多个索引,往?过?的索引或不恰当的索引带来的负面?能更?
u表索引的设?初衷,往??0%甚至更高的情况下与最终的实际使用情况不?合,此举视?计人员?业务和Oracle的理解不同?不?/div>
u监?索引的实际使用情况,尤其在表具有多个索引的情况下,就显得尤为重?,?经常不使用的索引采用合并为?合索引或删除?化的工作之一
示例如下?/div>
1.创建索引
  
2.??以监?/div>
  
3.执?SQL
  
 
 
4.查看索引使用情况
 
我们?根据???间的对索引的监控结果决定如何合并及删除不恰当的索引??/div>
5.停?监?索引
 
 ?请注明?塾在线??span class="Apple-converted-space"> http://sishuok.com/forum/blogPost/list/6414.html?/div>
1 ? x734545751k 20 小时?nbsp; 
学习学习学习
2 ? 942bc 19 小时?nbsp; 
视?收费?/div>
3 ? string2020 18 小时?nbsp; 
好贴,?楼主早当大官,早日娶漂亮媳??/div>
4 ? nishwd123 17 小时?nbsp; 
概括很细,楼主辛苦了,谢谢分???/div>
5 ? xiaokang1582830 17 小时?nbsp; 
打广告xxxxx
6 ? jyjava 14 小时?nbsp; 
kengdie,你就不能直接下载上传到iteye?/div>
  ؽ