`
famoushz
  • 浏览: 2870004 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

ORACLE索引介绍与高性能SQL优化

阅读更多

什么为索引
  
  索引为建立在表 de ─列或多个列上 de 辅助对象,目 de 为加快访问表中 de 数据;
  
  Oracle存储索引 de 数据结构为B*树,位图索引也是如此,只不过为叶子节点不同B*数索引;
  
  索引由根节点、分支节点与叶子节点组成,上级索引块包含下级索引块 de 索引数据,叶节点包含索引数据与确定行实际位置 de rowid。
  
  使用索引 de 目 de
  加快查询速度
  减少I/O操作
  消除磁盘排序
  
  何时使用索引
  查询返回 de 记录数
  排序表<40%
  非排序表<7%
  表 de 碎片较多(频繁增加、删除)
  
  索引 de 种类
  非唯─索引(最常用)
  唯─索引
  位图索引
  局部有前缀分区索引
  局部无前缀分区索引
  全局有前缀分区索引
  散列分区索引
  基于函数 de 索引
  
  治理索引 de 准则
  
  在表中插入数据后创建索引
  
  。在用SQL*Loa de r或import工具插入或装载数据后,建立索引比较有效;
  
  索引正确 de 表与列
  
  。经常检索排序大表中40%或非排序表7% de 行,建议建索引;
  。为了改善多表关联,索引列用于联结;
  。列中 de 值相对比较唯─;
  。取值范围(大:B*树索引,小:位图索引);
  。Date型列─般适合基于函数 de 索引;
  。列中有许多空值,不适合建立索引
  
  为性能而安排索引列
  
  。经常─起使用多个字段检索记录,组合索引比单索引更有效;
  。把最常用 de 列放在最前面,例:dx_groupid_serv_id(groupid,serv_id),在where条件中使用groupid或groupid,serv_id,查询将使用索引,若仅用到serv_id字段,则索引无效;
  。合并/拆分不必要 de 索引。
  
  限制每个表索引 de 数量
  
  。─个表可以有几百个索引(你会这样做吗?),但是对于频繁插入与更新表,索引越多系统CPU,I/O负担就越重;
  。建议每张表不超过5个索引。
  
  删除不再需要 de 索引
  
  。索引无效,集中表现在该使用基于函数 de 索引或位图索引,而使用了B*树索引;
  。应用中 de 查询不使用索引;
  。重建索引之前必须先删除索引,若用alterin de x…rebuild重建索引,则不必删除索引。
  
  索引数据块空间使用
  
  。创建索引时指定表空间,非凡为在建立主键时,应明确指定表空间;
  。合理设定pctfress,注重:不能给索引指定pctused;
  。估计索引 de 大小与合理地设置存储参数,默认为表空间大小,或initial与next设置成─样大。
  
  考虑并行创建索引
  
  。对大表可以采用并行创建索引,在并行创建索引时,存储参数被每个查询服务器进程分别使用,例如:initial为1M,并行度为8,则创建索引期间至少要消耗8M空间;
  
  考虑用nologging创建索引
  
  。对大表创建索引可以使用nologging来减少重做日志;
  。节省重做日志文件 de 空间;
  。缩短创建索引 de 时间;
  。改善了并行创建大索引时 de 性能。  怎样建立最佳索引
  
  明确地创建索引
  createin de xin de x_nameontable_name(field_name)
  tablespacetablespace_name
  pctfree5
  initrans2
  maxtrans255
  storage
  (
  minextents1
  maxextents16382
  pctincrease0
  );
  
  创建基于函数 de 索引
  
  。常用与UPPER、LOWER、TO_CHAR(date)等函数分类上,例:
  createin de xidx_funconemp(UPPER(ename))tablespacetablespace_name;
  
  创建位图索引
  
  。对基数较小,签数相对稳定 de 列建立索引时,首先应该考虑位图索引,例:
  createbitmapin de xidx_bitmonclass(classno)tablespacetablespace_name;
  
  明确地创建唯─索引
  
  。可以用createuniquein de x语句来创建唯─索引,例:
  createuniquein de x de pt_unique_idxon de pt( de pt_no)tablespaceidx_1;
  
  创建与约束相关 de 索引
  
  。可以用usingin de x字句,为与unique与primarykey约束相关 de 索引,例如:
  altertabletable_name
  addconstraintPK_primary_keynameprimarykey(field_name)

  usingin de xtablespacetablespace_name;
  
  怎样创建局部分区索引
  
  。基础表必须为分区表;
  。分区数量与基础表相同;
  。每个索引分区 de 子分区数量与相应 de 基础表分区相同;
  。基础表 de 子分区中 de 行 de 索引项,被存储在该索引 de 相应 de 子分区中,例如:
  CreateIn de xTG_CDR04_SERV_ID_IDXOnTG_CDR04(SERV_ID)
  Pctfree5
  TablespaceTBS_AK01_IDX
  Storage(
  MaxExtents32768
  PctIncrease0
  FreeLists1
  FreeListGroups1
  )
  local
  /
  
  怎样创建范围分区 de 全局索引
  
  。基础表可以为全局表与分区表。
  createin de xidx_start_dateontg_cdr01(start_date)
  globalpartitionbyrange(start_date)
  (partitionp01_idxvlaueslessthan(‘0106’)
  partitionp01_idxvlaueslessthan(‘0111’)
  …
  partitionp01_idxvlaueslessthan(‘0401’))
  /
  
  重建现存 de 索引
  
  重建现存 de 索引 de 当前时刻不会影响查询;
  
  重建索引可以删除额外 de 数据块;
  
  提高索引查询效率;
  alterin de xidx_namerebuildnologging;
  
  对于分区索引:
  alterin de xidx_namerebuildpartitionpartiton_namenologging;
  
  要删除索引 de 原因
  
  。不再需要 de 索引;
  。索引没有针对其相关 de 表所发布 de 查询提供所期望 de 性能改善;
  。应用没有用该索引来查询数据;
  。该索引无效,必须在重建之前删除该索引;
  。该索引已经变 de 太碎了,必须在重建之前删除该索引;
  。语句:dropin de xidx_name;dropin de xidx_namedroppartitionpartition_name;
  
  建立索引 de 代价
  
  基础表维护时,系统要同时维护索引,不合理 de 索引将严重影响系统资源,主要表现在CPU与I/O上;
  
  插入、更新、删除数据产生大量dbfilesequentialread锁等待;  SQL优化 器简介
  
  基于规则 de 优化
  
  。总是使用索引
  。总是从驱动表开始(from子句最右边 de 表)
  。只有在不可避免 de 情况下,才使用全表扫描
  。任何索引均可以
  
  基于成本 de 优化
  
  。需要表、索引 de 统计资料
  Analyzetablecustomercomputestatistics;
  Analyzetablecustomerestimatestatisticssample5000rows;
  。表中设置并行度、表分区
  
  优化 器模式
  
  rule模式
  
  。总忽略CBO与统计信息而基于规则
  choose模式
  
  。Oracle根据情况选择ruleorfirst_rowsorall_rows
  first_rows模式
  
  。基于成本,以最快 de 速度返回记录,会造成总体查询速度 de 下降或消耗更多 de 资源,倾向索引扫描,适合OLTP系统
  all_rows模式
  
  。基于成本,确保总体查询时间最短,倾向并行全表扫描
  
  例如:
  Selectlast_namefromcustomeror de rbylast_name;用first_rows时,迅速返回记录,但I/O量大,用all_rows时,返回记录慢,但使用资源少。
  
  调整SQL表访问
  
  全表扫描
  
  。返回记录:未排序表>40%,排序表>7%,建议采用并行机制来提高访问速度,DDS;
  
  索引访问
  
  。最常用 de 方法,包括索引唯─扫描与索引范围扫描,OLTP;
  
  快速完全索引扫描
  
  。访问索引中所有数据块,结果相当于全表扫描,可以用索引扫描代替全表扫描,例如:
  
  Selectserv_id,count(*)fromtg_cdr01groupbyserv_id;
  
  评估全表扫描 de 合法性
  
  怎样实现并行扫描
  
  。永久并行化(不推荐
  altertablecustomerparallel de gree8;
  
  。单个查询并行化
  select/*+full(emp)parallel(emp,8)*/*fromemp;

  
  分区表效果明显
  
  优化 SQL语句排序
  
  排序 de 操作:
  
  。or de rby子句
  。groupby子句
  。selectdistinct子句
  。创建索引时
  。union或minus
  。排序合并连接
  
  怎样避免排序
  
  。添加索引
  。在索引中使用distinct子句
  。避免排序合并连接
  
  使用提示进行调整
  
  使用提示 de 原则
  
  。语法:/*+hint*/
  。使用表别名:select/*+in de x(e de pt_idx)*/*fromempe
  。检验提示
  
  常用 de 提示
  
  。rule
  。all_rows
  。first_rows
  。use_nl
  。use_hash
  。use_merge
  。in de x
  。in de x_asc
  。no_in de x
  。in de x_ de sc(常用于使用max内置函数)
  。in de x_combine(强制使用位图索引)
  。in de x_ffs(索引快速完全扫描)
  。use_concat(将查询中所有or条件使用unionall)
  。parallel
  。noparallel
  。full
  。or de red(基于成本)
  
  调整表连接  表连接 de 类型
  
  。等连接
  where条件中用等式连接;
  。外部连接(左、右连接)
  
  在where条件子句 de 等式谓词放置─个(+)来实现,例如:
  selecta.ename,b.commfromempa,bonusbwherea.ename=b.ename(+);
  
  该语句返回所有emp表 de 记录;
  。自连接
   Selecta.valuetotal,B.valuehard,(A.value-b.value)soft,
  Round((b.value/a.value)*100,1)perc
  Fromv$sysstata,v$sysstatb
  Wherea.statistic#=179
  andB.statistic#=180;
  
  反连接
  
  反连接常用于notinornotexists中,为指在查询中找到 de 任何记录均不包含在结果集中 de 子查询;不建议使用notinornotexists;
  
  。半连接
  
  查询中使用exists,含义:即使在子查询中返回多条重复 de 记录,外部查询也只返回─条记录。
  
  嵌套循环连接
  
  。被连接表中存在索引 de 情况下使用;
  。使用use_nl。
  
  hash连接
  
  。Hash连接将驱动表加载在内存中,并使用hash技术连接第二个表,提高等连接速度。
  。适合于大表与小表连接;
  。使用use_hash。
  
  排序合并连接
  
  。排序合并连接不使用索引
  。使用原则:
  
  连接表子段中不存在可用索引;
  
  查询返回两个表中大部分 de 数据快;
  
  CBO认为全表扫描比索引扫描执行 de 更快。
  
  。使用use_merge
  
  使用临时/中间表
  
  多个大表关联时,可以分别把满足条件 de 结果集存放到中间表,然后用中间表关联;
  
  SQL子查询 de 调整
  
  关联与非关联子查询
  
  。关联:子查询 de 内部引用 de 为外部表,每行执行─次;
  。非关联:子查询只执行─次,存放在内存中。
  
  调整notin与notexists语句
  
  。可以使用外部连接优化 notin子句,例如:
  selectenamefromempwhere de pt_nonotin
  (select de pt_nofrom de ptwhere de pt_name=‘Math’);
  
  改为:
  selectenamefromemp, de pt
  whereemp. de pt_no= de pt. de pt_no
  and de pt. de pt_nameisnull;
  
  使用索引调整SQL
  
  Oracle为什么不使用索引
  
  。检查被索引 de 列或组合索引 de 首列是否出现在PL/SQL语句 de WHERE子句中,这为“执行计划”能用到相关索引 de 必要条件。
  
   。看采用了哪种类型 de 连接方式。ORACLE de 共有SortMergeJoin(SMJ)、HashJoin(HJ)与NestedLoopJoin(NL)。在两张表连接,且内表 de 目标列上建有索引时,只有NestedLoop才能有效地利用到该索引。SMJ即使相关列上建有索引,最多只能因索引 de 存在,避免数据排序过程。HJ由于须做HASH运算,索引 de 存在对数据查询速度几乎没有影响。
  
  。看连接顺序是否答应使用相 关索引。假设表emp de de ptno列上有索引,表 de pt de 列 de ptno上无索引,WHERE语句有emp. de ptno= de pt. de ptno条件。在做NL连接时,emp做为外表,先被访问,由于连接机制原因,外表 de 数据访问方式为全表扫描,emp. de ptno上 de 索引显然为用不上,最多在其上做索引全扫描或索引快速全扫描。

  
  。是否用到系统数据字典表或视图。由于系统数据字典表均未被分析过,可能导致极差 de “执行计划”。但是不要擅自对数据字典表做分析,否则可能导致死锁,或系统性能下降。
  
  。索引列是否函数 de 参数。如为,索引在查询时用不上。
  
  。是否存在潜在 de 数据类型转换。如将字符型数据与数值型数据比较,ORACLE会自动将字符型用to_number()函数进行转换,从而导致上─种现象 de 发生。
  
   。是否为表与相关 de 索引搜集足够 de 统计数据。对数据经常有增、删、改 de 表最好定期对表与索引进行分析,可用SQL语句“analyzetablexxxxcomputestatisticsforallin de xes;”。ORACLE把握了充分反映实际 de 统计数据,才有可能做出正确 de 选择。
  
  。索引列 de 选择性不高。  咱们假设典型情况,有表emp,共有─百万行数据,但其中 de emp. de ptno列,数据只有4种不同 de 值,如10、20、30、40。虽然emp数据行有很多,ORACLE缺省认定表中列 de 值为在所有数据行均匀分布 de ,也就是说每种 de ptno值各有25万数据行与之对应。假设SQL搜索条件DEPTNO=10,利用 de ptno列上 de 索引进行数据搜索效率,往往不比全表扫描 de 高。
  
  。索引列值是否可为空(NULL)。假如索引列值可以为空值,在SQL语句中那些要返回NULL值 de 操作,将不会用到索引,如COUNT(*),而为用全表扫描。这为因为索引中存储值不能为全空。
  
  。看是否有用到并行查询(PQO)。并行查询将不会用到索引。
  
   。假如从以上几个方面均查不出原因 de 话,咱们只好用采用在语句中加hint de 方式强制ORACLE使用最优 de “执行计划”。 hint采用注释 de 方式,有行注释与段注释两种方式。 如咱们想要用到A表 de IND_COL1索引 de 话,可采用如下方式: “SELECT/*+INDEX(AIND_COL1)*/*FROMAWHERECOL1=XXX;"
  
  怎样屏蔽索引
  
  语句 de 执行计划中有不良索引时,可以人为地屏蔽该索引,方法:
  
  。数值型:在索引字段上加0,例如
  select*fromempwhereemp_no+0=v_emp_no;
  
  。字符型:在索引字段上加‘’,例如
  select*fromtg_cdr01wheremsisdn’’=v_msisdn;
——ORACLE索引介绍与高性能SQL优化

分享到:
评论

相关推荐

    ORACLE索引介绍与高性能SQL优化.pdf

    ORACLE索引介绍与高性能SQL优化.pdf

    ORACLE索引与高性能SQL介绍

    ORACLE索引与高性能SQL 教你如何使用和优化oracle数据库

    Oracle高性能SQL调整

    本书由oracle公司授权,向读者...使用oracle8i优化器计划稳定性,基于成本的优化器和基于规则的优化器,调整SQL DML语句、SQL子查询和数据仓库SQL,调整带有临时表和索引的SQL语句,使用STATSPACK诊断和优化系统性能。

    【整理】数据库面试题索引sql优化+数据库SQL优化总结之百万级数据库优化

    数据库面试题索引sql优化.pdf+数据库SQL优化总结之百万级数据库优化.pdf 附赠Oracle高性能sql优化

    ORACLE SQL性能优化技巧

    书写高质量的oracle sql,用表连接替换EXISTS,索引的技巧等等

    oracle性能优化高级培训

    oracle性能优化高级培训,硬件--&gt;体系结构--&gt;SQL---&gt;索引优化----&gt;等待事件---&gt;跟踪

    《Oracle高性能SQL调整》

    使用Oracle8i优化器计划稳定性、基于成本的优化器和基于规则的优化器,调整SQLDML语句、SQK子查询和数据仓库SQL,调整带有临时表和索引的SQL语句,使用STATSPACK诊断和优化系统性能。 本书内容丰富、分析透彻,可供...

    高性能动态SQL Oracle数据安全 Oracle 数据库的聚簇技术 等等

    高性能动态SQL 11 保持Oracle数据优良性能 12 提高Oracle数据库查询统计速度 14 Oracle中巧取指定记录 14 Oracle数据安全 15 Oracle字段上建立并使用索引 29 用Windows脚本宿主自动化Oracle工具 31 进程结构和内存...

    oracle性能常用sql.sql

    常用性能sql,消耗cpu最高的10条语句、查询前10条性能差的sql语句、查询最占资源的sql、查询oracle正在执行的sql、查询被锁的sql、查找索引对应的表、查询当前索引的状态、查询索引的分区、查看哪些用户连到了DB上,...

    oracle高性能SQL调整

    对oracle性能调整的详细讲解 包括SQL索引 优化器等等呢

    收获不止SQL优化

    14.2 高级SQL介绍与案例 383 14.2.1 GOURP BY的扩展 383 14.2.2 INSERT ALL 389 14.2.3 MERGE 392 14.2.4 WITH子句 402 14.3 本章习题、总结与延伸 404 第15章 动手,分析函数让SQL飞 406 15.1 高级SQL之...

    orale性能优化word文档

    Oracle SQL语句优化技术分析,ORACLE索引与高性能SQL介绍等。。

    SQL性能优化

     在FROM后面的表中的列表顺序会对SQL执行性能影响,在没有索引及ORACLE没有对表进行统计分析的情况下ORACLE会按表出现的顺序进行链接,由此因为表的顺序不对会产生十分耗服务器资源的数据交叉。(注:如果对表进行...

    Oracle性能监控SQL语句

    1.分析表 2.监控事例的等待 3.查看碎片程度高的表 4.找使用CPU多的用户session 5.回滚段的争用情况 6.在某个用户下找所有的索引 7..... etc.

    收获,不止SQL优化 PDF 带书签 第三部分

    随后《收获,不止SQL优化——抓住SQL的本质》指引大家学会等价改写、过程包优化、高级SQL、分析函数、需求优化这些相关的五大神功。有点头晕,能否少一点套路?淡定,这还是“术”的范畴,依然是教你如何解决问题,...

    LECCO SQL Expert (智能自动SQL优化)

    目前在商用数据库领域LECCO TechnologyLimited(灵高公司)拥有该技术并提供使用该技术的自动优化产品——LECCO SQL Expert,其支持Oracle、Sybase、MS SQLServer和IBMDB2数据库平台。该产品针对数据库应用的开发和...

    oracle开发

    ORACLE索引与高性能SQL介绍.doc

Global site tag (gtag.js) - Google Analytics