SQL和PL/SQL的性能优化之三--表访问调优

Posted optimize

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL和PL/SQL的性能优化之三--表访问调优相关的知识,希望对你有一定的参考价值。

1、一般来说,在where子句的条件选择性不是很高时,全表扫描是最合适的检索路径,而在条件选择很高时,索引或聚簇方法将更合适。

     就IO而言,无论记录多大,每个索引访问的开销几乎都是相同的,然而,记录越长,全表扫描必须读取的数据块就越多。

   1.1 优化器目标(optimizer goal) 设置为ALL_ROWS和FIRST)ROWS对是否使用索引差异很大。

   1.2 基于索引的执行计划更能够从缓冲区高速缓存中的缓存块上获得益处。参数OPTIMIZER_INDEX_CACHING可用来改变优化器估算缓冲相关的行为,其值设置的高可以导致优化器降低评估中的索此读的IO开销。

   1.3 基于索引的检索同样更能够从数据分布上受益。如果值在一个范围内的所有记录都在同一个块中,索引范围扫描将更加高效。

   1.4 全表扫描倾向于在单个操作中一次性从磁盘读取多个块,而索引查询一次只读取一个块。

 

2、如果查询条件是不等,那么ORACLE通常不使用索引。如果你认为这个查询将从使用索引的方法中受益,那么请使用IN,OR或>重写查询。你仍需要使用提示或列的直方图来促成索引。

     避免对索引列做空值检索。替代的方法是将列定义成非空,并设置默认值,然后用默认值进行检索,性能将大大提升。

    可以使用索引查找非空值。如果大多数的值都是空的,那么索引将会程媛媛小,而且十分高效,因为空值是不会被索此的。

    仅当查询字符串不以通配符(%,_)开头时,ORACLE才能够使用B*树索引高效地处理包含LIKE运算符的查询。

 

3、优化必要的全表扫描

   A、让表变小以减少逻辑快读取数量

   B、提高数据库IO的效率

   C、通过缓存或抽样降低扫描的开销

   D、使用并行查询为扫描分配更多资源

   E、执行快速全索此扫描来代替全表扫描

   F、分区,只读所选择的分区

----减少数据块数量的方式

   A、重建表来降低高水位线

   B、修改PCTFREE或PCTUSED参数以向每个数据块塞入更多的记录

   C、减少记录长度,可能是将大的且不常访问的列迁移到独立的表中

   D、压缩表中的数据

    重建表:ALTER TABLE ... MOVE;

    压缩表:alter table hwm_test enable row movement;--激活行迁移

                   alter table hwm_test shrink space;

 

     只有当一张表包含的记录远远少于它曾经拥有的记录时,才需要重建或压缩表双重置高水位线。

    减少记录长度,对LOB字段进行离线存储

    create table outofline_lob_table

     (id number not null primary key,

      control_data char(200) not null,

      lob_data blob) lob(lob_data) store as (disable storage in row);

--------压缩表:[11G] create table ...compress for all operations;--行压缩,减少行重复率

           [11.2G] 可使用列压缩以减少列的重复率 

           compress for archive level = (1或2或3);--值越高压缩效果越好,但成本也越高。

 

     SAMPLE子句可以用来得到近似的答案,以满足那些通常需要全表扫描的查询

    select sum(amount) / sum(sum(amount))  over() pct_amount

      from sh.sales sample block(5) jion sh.products using(prod_id)

     group by prod_name;

    并行查询---满足以下任一或全部条件,全表扫描开并行性能就可能显著提升。

    A、主机上有多个处理器

    B、存在空闭CPU能力,否则会对其它会话产生影响

    C、表中数据分布在多个磁盘驱动器上

 

    快速全索引扫描(提示:INDEX_FFS)  INDEX FAST FULL SCAN

  优势:A、在索引范围扫描或全索引扫描中,索引块是按照键的顺序一次被读取一块。在快速全索引扫描中,块将按它们出现在磁盘中的顺序被读取,并且ORACLE能够在每次IO操作中读取多个块。

            B、快速全索引扫描可以并行执行,而其它索引只能串行处理(提示:PARALLEL_INDEX)

            C、索引几乎总是比相应的表小,可以减少全表扫描相应的IO数量

   劣势:索此块分裂或记录删除都可能导致十分严重的空间浪费,此时FFS更慢。

 

以上是关于SQL和PL/SQL的性能优化之三--表访问调优的主要内容,如果未能解决你的问题,请参考以下文章

PL/SQL 性能优化 - 根据记录更改计算总和和微分

MYSQL数据库性能调优之三:explain分析慢查询

百倍性能的PL/SQL优化案例(r11笔记第13天)

性能调优之三十六计 —— 「优中取优」字符串拼接 篇

性能调优之三十六计 —— 「优中取优」字符串拼接 篇

MySQL 性能调优——SQL 查询优化