废品成的“减肥圣品”

2014-09-25 Created By
BaoXinjian

云无心 发表于 2012-08-10 15:51 

统计 1一、摘要

http://songshuhui.net/archives/71471


就生活品位的加强,虾、蟹也不再是少见食品了。勤快的食指会好经验剥虾的趣,而追求好的人大可以买都揭好的虾仁。不管是谁自己剥的或机器剥的,说那些虾壳蟹壳是污物,大概非会见有人反对。

1. Oracle优化器介绍

正好而那句老话,垃圾是放开错了地方的资源。科学技术的进步,一浅而同样浅地自垃圾堆中吃来来宝贝。而这些扔到条件中还无轻分解的虾壳蟹壳,就是一个成功的事例。

正文讲述了Oracle优化器的定义、工作规律和采取方式,兼顾了Oracle8i、9i以及新型的10g老三个本子。理解本文将推你还好之双重有效的拓展SQL优化办事。

虾蟹等动物之盖是由于同种叫做“几丁质”的成份构成的。除了虾和蟹,昆虫的壳与众多浮游生物的细胞壁也要由于她构成。它实际上是一致接近分子量巨大的大多糖,类似于小。与其余多糖不同之是,它的为主成单元上带来在一个称呼“乙酰基”的基团。

2. RBO优化器

只要拿几着质磨成粉,经过一定之处理,可以去丢几饱受质分子上之乙酰基,并且把伟大的成员切成小段。这样得到的东西,叫做“壳聚糖”。

RBO是千篇一律栽基于规则之优化器,随着CBO优化器的渐渐发展及全面,在风行的10g版本中Oracle已经彻底废弃了RBO。

盖聚糖吃发现已发生一百大抵年,直到现在也还有许多丁在针对她进行研讨。各行各业的科学家们,都盼望找到其好在融洽的园地外之用处。而其为终于很为脸,农业、食品、医疗、工业上还出且能找到其活跃的人影。

着采取Oracle8i或9i的人们要多还是丢失的都见面遇到RBO,因此当详细介绍CBO之前,我们发必不可少简单回顾一下古老的RBO优化器。

农作物的种从播种到发芽到成人,都发出或遭逢病虫害的袭击。“种子包衣”是均等栽颇常用的技巧。在种子外面“包上”一重合含有抗虫抗菌成分的物质,可以帮种子顺利萌发茁壮成长。这些抗虫抗菌的素一般是“化学农药”,只待特别少的量就从及明确的作用。不过对于“有机种植”,再丢的化学农药也无可知就此,可以就此的抗虫抗菌成分就是丢掉多矣。而甲聚糖也是同一种无毒无害的“天然物质”,在大自然中可以自降解。它自身不溶化于水,也就是好用来举行“包衣”。更神奇的凡,它不但会对抗侵袭,还能够推动植物体内的防御机制,从而成为“生物农药”。加拿大的相同件研究显得,用壳聚糖浸泡过的麦子,禾谷镰孢菌的感染率大大降低,而米发芽率明显增高了。而任何一样项研究发现,即使把她相肥料一样给用于地里,也得打及近似之意。

于RBO中Oracle根据可用之造访路径和访问路径的路来选执行计划,等级越强之顾路径通常运行SQL越慢,如果一个告知句子有多独途径而走,Oracle总是挑三拣四等级比逊色的走访路径。

甲聚糖本身不溶解于水,在水中可以抽重金属、油脂与另外垃圾颗粒。这些垃圾被吸烟聚集到壳聚糖达以后,就好挺自由地除了。美国交通部有过一个类别是整洁来自于建筑工地的污水。经过壳聚糖的处理,水的浊度从150独单位下降至了1单单位

3. CBO优化器结构

这种过滤作用自然不仅仅用于净化污水。优质的壳聚糖好做到食品级的纯度,也就是可用于食品生产过程被。比如葡萄酒和啤酒,都见面生出“澄清”的工序。而甲聚糖这种安全无害而且快捷的澄清剂,就足以大派用场。

CBO是因成本的优化器,它根据可用之造访路径、对象的统计信息、嵌入的Hints来抉择一个财力低于的行计划。

盖聚糖会抽油脂,自然吧尽管会引发减肥爱好者。壳聚糖减肥之争辩是:在饭前吃有盖聚糖,因为它不能够叫消化吸收,所以会完好在于胃肠中;饭菜吃之油脂及了胃肠会被壳聚糖吸附,也便非可知被消化吸收而直接铲除有体外。用壳聚糖减肥的钻研十分无丢掉,有的研究结论居然好受丁心魄动。所以,许多保健品厂家把盖子聚糖当作是“纯天然的减肥圣品”,还能够找到多正确研究
来“证明”。

 

唯独,真正的对经常泼人们的冷水。2008年加拿大大家发表了一样首文献综述对壳聚糖减肥的钻进行总结。他们以列学术期刊数据库被觅所有有关的钻研,并对研究的质量开展评,发现众多“有效”的研究不是那靠谱,只发生15起合计涉及一千基本上口的研究还算是不错。综合这些研究,他们发觉:与安慰剂相比,壳聚糖的确“能够”帮助减肥,此外还“能够”降低胆固醇。不过,这个“能够”只是统计学上之差别,体重和胆固醇的降低都比较单薄。它们的下结论是:壳聚糖减肥,没有治推荐的值。而美国FDA也无信服可壳聚糖减肥之反驳及证据。2004年,一小合作社虽盖宣称壳聚糖能够“结合脂肪”“帮助减肥”而备受了FDA的警告。

统计 2二、RBO优化器

然而,壳聚糖毕竟是同一种植饮食食纤维,跟任何的膳食纤维一样,即使没大用,但好以没安全性方面的猜疑。为了“减肥”“降胆固醇”或者其它的“功效”而失去置办“壳聚糖保健品”自然没有呀必要,不过若是碰到了它在食品、药品或农作物生产面临作为职能助剂,完全不用大惊小怪。


RBO是一律种植基于规则的优化器,随着CBO优化器的日趋前行和周到,在新式的10g本子中Oracle已经到头废弃了RBO。

1级:用Rowid定位单行

当WHERE子句被直接坐Rowid时,RBO走之路。Oracle不推荐直接引用Rowid,Rowid可能会见由版本的变更如果生成,行迁移、行链接、EXP/IMP也会见如Rowid发生变化。

2级:用Cluster Join定位单行

简单单表做等值连接,一正值的连接字段是Cluster
Key,且WHERE中在好保证该语句仅返回一行记录的极时,RBO走是路。

3级:用带用唯一约束或举行主键的Hash Cluster
Key定位单行

4级:用唯一约束之字段或举行主键的字段来稳定单行

5级:Cluster Join

6级:使用Hash Cluster Key

7级:使用索引Cluster Key

8级:使用复合索引

9级:使用单字段索引

10级:用索引进行有度限制之索

如,column >[=] expr AND column
<[=] expr或column BETWEEN expr AND expr

或column LIKE ‘c%’

11级:用索引字段展开管界限的查找

如,WHERE column >[=] expr 或 WHERE
column <[=] expr

12级:排序合并连接

13层:对索引字段使用MAX或MIN函数

14层:ORDER BY索引字段

15级:全表扫描

 

如果得以用索引RBO会尽可能的去用索引而不是全表扫描,但是于下列一些气象RBO只能使全表扫描:

假定column1和column2是同一个说明的字段,含有条件column1
< column2或column1 > column2或column1 <= column2或column1 >=
column2,RBO会用全表扫描。

万一下column IS NULL或column IS NOT
NULL或column NOT IN或column != expr或column LIKE
‘%ABC’时,不论column有无索引,RBO都使用全表扫描。

如果expr =
expr2,expr表达式作用了一个字段上,无论该字段有无索引,RBO都见面全表扫描。

若果NOT
EXISTS子查询及在视图中采用ROWNUM,也会见造成RBO进行全表扫描。

 

以上就是是RBO的浑可用访问路径。

RBO优化器死板的根据规则来选择执行计划一目了然不够灵活,在RBO中也无从利用物化视图等Oracle提供的新特色,在Oracle8i时CBO已经主导成熟,因此Oracle强烈建议改用CBO优化器。

 

统计 3三、CBO优化器


CBO是冲成本的优化器,它根据可用的访路径、对象的统计信息、嵌入的Hints来摘取一个本金低于的施行计划。

CBO主要涵盖以下组件:

  • 查询转换器(Query
    Transformer)
  • 评估器(Estimator)
  • 计划生成器(Plan Generator)

 

统计 4

  1. 查询转换器

查询语句的样式会潜移默化所发的履行计划,查询转换器的意向就是转查询语词的款型为生于好之实施计划。

从Oracle
8i开始就有四种转移技术:视图合并(View Merging)、谓词推进(Predicate
Pushing)、非嵌套子查询(Subquery Unnesting)和物化视图的询问重写(Query
Rewrite with Materialized Views)。

1.1 视图合并

倘SQL语句被含视图,经分析后会见把视图放在独立的“视图查询块”中,每个视图会发生一个视图子计划,当为一切讲话产生执行计划时,视图子计划会让直将来运要休见面看到讲话的整体性,这样就大爱导致差执行计划之成形。视图合并就是为了错开丢“视图查询块”,将视图合并到一个总体的询问块被,这样尽管不见面生出相图子计划来,执行计划的优良性得到提升。

1.2 谓词推进

不是有的视图都能被合并,对于那些无能够让统一的视图Oracle会将相应的名为词推进到视图查询块被,这些号称词一般是可索引的要么是过滤性较强的。

1.3 非嵌套子查询

旁查询和视图一样啊是给放于独立查询块被的,查询转换器会将绝大多数子查询转换为连续从而合并为同样查询块,少量免可知于换为连日来的子查询,会以它的子计划安照一个速之办法排列。

1.4 物化视图的询问重写

当query_rewrite_enabled=true时,查询转换器寻找和该查询语词相关联的物化视图,并就此物化视图改写该查询语句。

 

2.
关于“窥视”(Peeking)

当Oracle9i中也查询转换器增加了一个功能,就是当用户以绑定变量时,查询转换器可以“偷窥”绑定变量的实际值。

咱俩领略用绑定变量虽然可以使得的减“硬分析”,但她带的负面影响是优化器无法根据实际的数据分布来优化SQL,很有或仍得以走索引的SQL却开了全表扫描。

“窥视”正是为了缓解者问题,但是它并从未到头底化解,Oracle只允许第一破调动用时进行“窥视”,接下去的调用即使绑定变量的价值发生了变更,也照样是利用第一不行变的履计划,这便招了一个误的实行计划会吃频繁应用,10g中的“窥视”也是这般。

 

  1. 评估器

评估器通过测算三独价值来评估计划之完全资产:选择性(Selectivity)、基数(Cardinality)、成本(Cost)。

3.1 选择性:

凡是一个大于0多少受1底一再,0象征尚无记录为选定,1代表拥有记录还深受选定。

统计信息和直方图涉及及选性值的准头。

如:name=’Davis’,

只要未存在统计信息评估器将依据所用之名词来指定一个缺失省之选料性值,此时评估器会始终认为等式谓词之选择性比无等式谓词略;

假使存在统计信息一旦休设有直方图,此时择性值为1/count(distinct
name);

比方存在统计信息呢是直方图,选择性值则为count(name)where
name=’Davis’ / count(name)where name is not null。

3.2 基数:

普通表中的行数称为“基础基数”(Base
cardinality);

当用WHERE中的规范过滤后余下的行数称为“有效基数”(Effective
cardinality);

总是操作下发的结果集行数称为“连接基数”(Join
cardinality);

一个字段DISTINCT之后的行数称为“DISTINCT基数”;

“GROUP基数”(Group
cardinality)比较奇特,它和功底基数以及DISTINCT基数有关,例如:group by
colx则GROUP基数就等于基础基数,但是group by
colx,coly的GROUP基数则超越max ( distinct cardinality of colx , distinct
cardinality of coly )且低于min ( (distinct cardinality of colx *
distinct cardinality of coly) , base cardinality)。

3.3 成本:

不怕是量资源消耗的单位。可以知道啊履行表扫描、索引围观、连接、排序等操作所消耗I/O、CPU、内存的多寡。

 

  1. 计划生成器

计划生成器的来意就是是变化大量的行计划,然后选取中完全资产最低的一个。

出于不同的看路径、连接方式及连续各个可以随心所欲组合,虽然为不同的点子访同处理多少,但是可以有相同的结果,因此一个SQL可能有大量不等的执行计划。

而实际计划生成器很少会考试所有的也许在的实行计划,如果它们发现脚下行计划的本都十分没有了,它以适可而止试验,相反当前计划之工本只要那个高,它以连续试验其他执行计划,因此要会而计划生成器一开始便找到本非常没有的实行计划,则会大方减所耗费的时,这为亏我们怎么用HINTS来优化SQL的来由之一。

 

统计 5季、访问路径


拜路径就是是于数据库里摸索数据的主意。

优化器首先检查WHERE子句和FROM子句的尺码,确定来哪访问路径是可用的。

然后优化器使用这些访问路径或各访问路径的协同,产生相同组或者存在的推行计划,再经过索引、字段、表的统计信息评估每个计划的基金,最后优化器选择资金最低的实施计划所对应的造访路径。

假如SQL语句之FROM子句无SAMPLE或SAMPLE
BLOCK,优化器在挑选访问路径的时刻会先行考虑语句被之HINTS。

优化器可用的造访路径如下:

  • 全表扫描(Full Table Scans)
  • Rowid扫描(Rowid Scans)
  • 摸索引围观(Index Scans)
  • 簇扫描(Cluster Scans)
  • 散列扫描(Hash Scans)
  • 表取样扫描(Sample Table
    Scans)

  • 全表扫描

全表扫描将读取HWM之下的富有数据块,所有执行都要经WHERE子句子过滤看是不是满足条件。当Oracle执行全表扫描时见面随顺序读取每个片都只有念一糟糕,如果能够同蹩脚读博多个片,可以中之提高效率,初始化参数DB_FILE_MULTIBLOCK_READ_COUNT用来设置于同样次I/O中好读取多少个数据块。
通常我们认为应该避免全表扫描,但是当检索大量数码经常全表扫描优于索引围观,这多亏因为全表扫描可以于同不良I/O中读也差不多个片,从而减少了I/O的次数。在动用全表扫描的同时为足以利用并行来加强扫描的快。

CBO优化器何时会择全表扫描:

  • 1) 无合适的目录。
  • 2) 检索表中大部底数额。
  • 3)
    表非常小。比如,表中的块小于DB_FILE_MULTIBLOCK_READ_COUNT,只需要一糟I/O。如果这么的表被频繁使用相应alter
    table table_name storage(buffer_pool keep)。
  • 4)
    高并行度。如果当表级设置了比较高的连行度,如alter table table_name
    parallel(degree
    10),通常会如CBO选择全表扫描。通常建议于语句级用HINTS来兑现相互之间,如/*+full(table_name)
    parallel(table_name degree)*/。
  • 5)
    太旧的统计数据。如果表没有展开了分析或很漫长没有还分析,CBO可能会见错的认为表含有跟少之数据块。
  • 6)
    在言语中坐了全表扫描的HINTS。

  • Rowid扫描

Rowid代表行以数码块被之具体位置,Rowid是找具体行的无限抢方式。可以于WHERE子句被写入Rowid,但是非引进这么做。通常还是透过索引来赢得Rowid,但一旦吃搜的行都包含在目中时常,直接访问索引就能获取所欲的多寡虽然免会见采取Rowid。

  1. 摸引围观

目不仅富含被索引的字段值,还带有行的位置标识Rowid,如果告诉句只检索索引字段,Oracle将直接从索引中读取而休需经过Rowid去访问表,如果告诉句通过索引检索其他字段值,则Oracle通过索引获得Rowid从而迅速找到实际的施行。

摸引围观类型:

  • 1) 唯一索引围观(Index Unique
    Scans)
  • 2) 索引范围扫描(Index Range
    Scans)
  • 3) 索引降序范围扫描(Index Range
    Scans Descending)
  • 4) 跳跃式索引围观(Index Skip
    Scans)
  • 5) 全索引围观(Full Index
    Scans)
  • 6) 快速全索引围观(Fast Full Index
    Scans)
  • 7) 索引连接(Index Joins)

3.1 唯一索引围观

在以一个主键字段或含有唯一约束的字段选择一行记录时,通常有唯一索引围观。

3.2 索引范围扫描

目范围扫描返回的数据返照索引字段值升序排列,值相同的按Rowid升序排列。如果在言辞中利用了ORDER
BY ASC子句,而且排序字段是找引字段时Oracle不见面对ORDER
BY再次排序。

3.3 索引降序范围扫描

万一当order
by中指定了目录是降序排列的,或者采用了INDEX_DESC提示,优化器会利用索引降序范围扫描。

3.4 跳跃式索引围观

跳跃式索引围观是为此来增长复合索引效率的,通常当复合索引的第一个索引字段不在言辞中指定时是心有余而力不足采取复合索引的,此时一旦复合索引的率先个索引字段DISTINCT值非常小,而复合索引的旁索引字段DISTINCT值非常坏时,可以利用跳跃式索引围观来越了该复合索引的率先个索引字段。跳跃式扫描会使复合索引在逻辑上分裂成N个比较小的目录,N值等于复合索引的首先个索引字段的DISTINCT值。

3.5 全索引围观

当查问涉及的字段都带有在目中,如果WHERE子句中谓词非第一个索引字段,或无WHERE子句子但是被索引字段受到至少发生一个非空属性时,通常会举行全索引围观。全索引围观结果集按索引字段排序。

3.6 快速全索引围观

当查问涉及的字段都饱含在目中,且被寻找引字段被足足有一个非空属性时,可以用INDEX_FFS(table_name
index_name)来而报告句做快速全索引围观。快速全索引围观不同为全索引围观,它利用多块读取的艺术来读全部寻引块,而且得行使并行读取。快速全索引围观的结果集不见面排序。位图索引不能够使用速全索引围观。

3.7 索引连接

目录连接是几只目录的散列连接。如果查询的字段上还是索引,可以运用索引连接来避免访问表。

  1. 簇扫描

以被索引的簇中,有着一样簇键值的行存储在平等数据块被。执行簇扫描时,首先通过扫描簇索引获得被检索行的Rowid,然后利用Rowid来稳定具体的实行。

  1. 散列扫描

散列扫描就是当一个散列簇中一定数据行。在一个散列簇中,具有同等散列值的行存储在同之数块被。在履行散列扫描时,首先通过一个散列函数来取得散列值,然后据此散列值在数码块被恒具体行。

  1. 表取样扫描

当FROM子句后含有SAMPLE或SAMPLE
BLOCK时,会履行表取样扫描来随便检索表明中之多少。如:select* from t
sample block (1);

  1. 拍卖连接

潜移默化一个一连语句执行计划之季只重点因素是:访问路径、连接方式、连接各个与资产评估。

 

统计 6五、影响优化器的初始化参数


  1. OPTIMIZER_FEATURES_ENABLE:

每个版本的Oracle优化器特性还无一样,特别是做了本升级之后肯定要是修改者参数才好应用就吃拖欠版支持之优化器特性。可以给它的价如果:9.2.0、9.0.2、9.0.1、8.1.7、8.1.6等。

  1. CURSOR_SHARING:

此参数会以SQL语句被之直接量用变量来替换,存在巨大直接量的OLTP系统可考虑启用这个参数。但是若顾,绑定变量虽然好假设大量的SQL重用,减少分析时,但是实施计划或者会见无优。通常OLTP系统适用于绑定变量,OLTP系统特性是,SQL运行往往且时间相对比短,SQL的辨析时比重较充分。如果在DSS系统中,SQL运行时刻长,相比之下分析时微不足道,好之施行计划才是无与伦比要之,因此DSS系统不建议下这个参数。

  1. HASH_AREA_SIZE:

立是散列表的寄放区域,如果应用散列连接这个参数值不可知太小,否则对散列连接属性影响很充分。如果是9i提议启动工作区自动管理,然后设置PGA_AGGREGATE_TARGET。

  1. SORT_AREA_SIZE:

内存排序区的尺寸,如果排序时内存区不足够会刻画副磁盘。9i同样建议启动工作区自动管理,然后设置PGA_AGGREGATE_TARGET。

  1. HASH_JOIN_ENABLED:

偏偏发启用这个参数,CBO在设想连接方式的上才会考虑散列连接。

  1. OPTIMIZER_INDEX_CACHING:

此参数表示被缓存的索引块所占据的比例,可选值的限是0-100。这个值会影响嵌套循环连接,如果这值设得比较高,CBO将另行赞成利用嵌套循环。

  1. OPTIMIZER_INDEX_COST_ADJ:

优化器利用这个参数(是独比例)把索引围观的本转移为当价格的全表扫描的成本,然后跟全表扫描的工本进行比。缺省值100,表示找引围观成本及全表扫描成本等。可选值范围是0-10000。

  1. OPTIMIZER_MAX_PERMUTATIONS:

夫起参数用来设定优化器最多考虑多少种连接各个,优化器不断的发生可能的表的连年的排,直到排列数达到参数optimizer_max_permutations为止。一旦优化器停止产生新的排,它以会晤从中挑选有资产不过小之排列。

9.
DB_FILE_MULTIBLOCK_READ_COUNT:

这参数表示以全表扫描或索引快速全扫描时一样次于I/O读的连续数块数量(block#连,且同样次I/O不克超过extent)。

  1. OPTIMIZER_MODE:

优化器模式。值吗:RULE、CHOOSE、ALL_ROWS、FIRST_ROWS_n、FIRST_ROWS。

  1. PARTITION_VIEW_ENABLED:

若果设置为TRUE,
该优化器将越了分区视图中不为呼吁的分区,该参数还能转基于成本的优化程序由基础表统计信息计算分区视图统计信息的方式。

  1. QUERY_REWRITE_ENABLE:

假定设置为TRUE,优化器将使可用之物化视图来再写SQL。

 

Thanks and Regards

参考:
http://blog.itpub.net/18474/viewspace-1060730/

参考:
http://www.cnblogs.com/dongzhiquan/archive/2012/01/20/2328365.html

统计 7