`
lizhiyu211
  • 浏览: 230463 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

ORACLE优化(一)

阅读更多

θ重建索引

    如果表中记录频繁地被删除或插入,尽管表中的记录总量保持不变,索引空间的使用量会不断增加。虽然记录从索引中被删除,但是该记录索引项的使用空间不能被重新使用。因此,如果表变化不定,索引空间量会不断增加,不论表中记录数量是否增加,只是因为索引中无效空间会增加。
    要回收那些曾被删除记录使用的空间,需要使用Alter index rebuild 命令。可以做一个定期运行的批处理程序,来重建最活动表的索引。这个批处理程序可以在空闲时运行,以避免该程序与其他应用程序冲突。若能坚持索引的这一程序规划,便可以及时回收那些未使用空间,提高空间利用率。

θ段的碎片整理

    当生成一个数据库对象时(一个表或一个索引),通过用户缺省值或指定值来为它指定表空间。一个在表空间中生成的段,用于存储对象的相关数据。在段被关闭、收缩、截断之前,段所分配的空间将不被释放。

    一个段是由范围组成,而范围是由相邻的Oracle块组成。一旦存在的范围不能再存储新的数据,这个段就会去获得新的范围,但并不要求这些范围是彼此相邻的。这样的扩展会一直继续下去,直到表空间中的数据文件不能提供更多的自由空间,或者范围数量已达到极限。 
    因此,一个碎片太多的数据段,不仅会影响运行,也会引发表空间中的空间管理问题。所以,每个数据段只含有一个范围是十分有益的。借助监控系统,可以通过检查DBA_SEGMENTS数据字典视图来了解哪些数据库对象含有10个或更多范围的段,确定其数据段碎片。
若一个段的碎片过多,可用两种方法解决:
(1) 用正确的存储参数建立一个新表,将旧表中的数据插入到新表中,再删除旧表;
(2) 利用Export/Import工具。

θ自由范围的碎片整理
表空间中的一个自由范围是表空间中相连的自由(空间)块的集合。当一个段关闭时,它的范围将被释放,并被标记为自由范围。然而,这些自由范围再也不能与相邻的自由范围合并,它们之间的界线始终存在。但是当表空间的缺省值pctincrease设置不是0时,SMON后台进程会定期将这些相邻的自由范围合并。若pctincrease设置为0,那么相邻自由范围不会被数据库自动合并。但可以使用Alter table命令“coalesce”选项,来强迫进行相邻自由范围的合并。
不进行自由范围合并,在日后的空间请求中,会影响到表空间中的空间分配。当需要一个足够大的范围时,数据库并不会合并相邻的自由范围,除非没有其他选择。这样,当表空间中前面较小的自由范围已被使用时,将使用表空间中后面部分最大的一个自由范围。结果,会因为没有足够多的使用空间,从而导致表空间需求的矛盾。由于这样的情况出现,使数据库的空间分配距理想越来越远。自由空间碎片常会出现在那些经常关闭又重新生成的数据库表和索引中。
在理想的Oracle表空间中,每一个数据库对象存储在一个单独的范围中,并且所有有效自由空间集中在一个巨大而连续的范围中。这样,在一个对象需要附加存储空间时,可以在增加获取足够大自由空间的可能性的同时,最小化空间中的循环调用,提高自由空间使用率。

1注:pctincrease它的作用就是在不停的分配新的块的时候
越分越大,避免表内容分布太离散
缺点是形成了滚血球效应
因为是指数增长
很可能达到比如需要再分配空间给表的时候,必须一次性分配5G

2注:SMON是oracle数据库至关重要的一个后台进程,SMON 是System Monitor 的缩写,意即:系统监控。

  在数据库启动过程中,SMON排在CKPT进程之后,在Oracle9i中排在第六号的位置:

  PMON started with pid=2

  DBW0 started with pid=3

  LGWR started with pid=4

  CKPT started with pid=5

  SMON started with pid=6

  RECO started with pid=7

  SMON负责系统监视已经一些系统清理及恢复工作,这些工作主要包括:

  1.清理临时空间以及临时段

  SMON负责在数据库启动时清理临时表空间中的临时段,或者一些异常操作过程遗留下来的临时段,例如,当创建索引过程中,创建期间分配给索引的Segment被标志为TEMPORARY,如果Create Index (或rebuild Index等)会话因某些原因异常中断,SMON负责清理这些临时段。

  2.接合空闲空间

  在DMT(字典管理表空间)中,SMON负责把那些在表空间中空闲的并且互相是邻近的Extent接合成一个较大的空闲扩展区,这需要表空间的pctincrease设置为非零值。

  3.执行实例恢复(Instance recovery)

  在实例恢复过程中,SMON的工作包括三个环节:应用Redo执行前滚、打开数据库提供访问、回滚未提交数据

          

                                  理解 区、段、块(转) 
        (一)Data blocks ,Extents,Segment
    这就是他们之间的逻辑结构。
    先看Data blocks(也叫逻辑块,oracle块,页)吧,oracle存储数据都是在这些数据块中,一个数据块是磁盘上数据库物理空间一系列物理字节的组成。
    比Data blocks更高一层的逻辑数据块空间是extent,一个extent是由一系列临近的存储信息的数据块组成。
    最高一层的逻辑结构是segment,一个segment是同一表空间extents的一个集合。每一个segment有不同的数据结构。如每一个表的数据就存储在自己的data segment,每一个索引存储在自己的索引段,如果表或者索引是
是分区存储的,那么每一个分区都存储在他们各自的segment中。一个segment和他所有的extent都是在一个表空间中,并且一个segment可以跨越几个数据文件。。

    对于数据库来说,data block是oracle数据库中分配和私用的最小存储单元。但这仅仅对数据库来说,在物理层次,操作系统层次,所有的数据仍旧是按字节存储的。每一个操作系统都有自己的块尺寸(block size),在oracle数据库中,数据块的大小都有参数db_block_size在创建数据库的时候来确定,他的数值应该是操作系统块尺寸的整数倍。
    数据块都有这么几部分组成,块头部分,表目录,行目录,空闲空间,数据这几部分组成。块头主要包含两部分信息:块头地址和segment的类型,是数据表还是索引;表目录主要包含块中有多少行数据。行目录主要包含每一行的物理地址。数据就很明显了,就是这个块包含的数据。这里边最奇妙的就是这个空闲空间,它主要目的就是为varchar这个数据类型准备的,有两个阈值参数pctfree,pctused来控制此数据快移向那一个链表,这两个参数的设定主要目的是为了避免行连接与行迁移,具体的又够一篇文章了,以后再写,^_^。
    在来说extent这个由一系列连续的data blocks组成。每当在数据库中创建一个表,那么分配给表的data segment分配一个包含若干数据库的初始的extent,虽然还没有插进去数据,但初始的extent已经做好了插入数据的准备。如果初始的extent中的数据块已经满了,或者没有空间插入数据,那么他将会增量扩展。当然这只是对于串行执行的情况,对于并发就不合适了。一些存储参数控制着oracle如何为每个段分配可用空间。当你使用create table创建一个表的时候,存储参数会将决定分配多少的可用空间或者限制此表最多可包含多少个extents,如果在创建表的时候没有定义这些参数,那么将采用表空间定义的默认的存储参数。对于插入和删除都很频繁的表,DBA可以通过这个语句来收回无用的extent ,aler table table_name deallocate unused;
    下面来说segment,每一个segment都是一个表空间下有一系列extent组成的逻辑存储结构。如:当数据库用户创建一个表,那么oracle将分配一个或多个extent来组成表的数据段,创建一个索引,oracle也会纷纷extent给索引数据。一般可以分为data segment,index segment,temporary segment。
    当你创建一个非分区并且非聚焦表的时候,或者一个分区表的一个分区,多个表合用的一个聚簇,都将是一个oracle将处理数据的单个data segment。
    而一个index segment ,对于非分区索引,就是create index创建的索引就会分配一个segment来处理数据;分区索引则对每一个分区分配一个segment来处理数据。
    当一个进程查询的时候,oracle常常需要一个临时的工作区存放sql的解析和执行的中间状态,oracle自动分配的磁盘空间temporary segment。特别当内存的排序区不足时,oracle将会分配一个temporary segment。有时候,下面一些语句有时候需要用到temporary segment:
    create index  ....
    select    .... order by ;
    select distinct ....
    select ...... group by
    select ...... union
    select ...... intersect
    select ...... minus
    还有就是对一个子查询来说也会用到temporary segment。如果一个查询包含distinct 子句,一个order by ,一个group by,那么就需要两个temporary segment。当创建一个临时表或索引,oracle也会分配一些temporary segment。
    对于temporary segment,oracle只是在一个用户的会话(session)中分配,但sql语句执行结束或者会话断开,将释放所有的temporary segment。分配这些temporary segment的磁盘空间都是在临时表空间,如果没有定义临时表空间,那么默认的临时表空间将是system表空间。对于DBA来说,由于分配和释放这些temporary segment将非常频繁,所以至少要定义一个temporary segment,这样可以避免system表空间的碎片。对于临时表来说,如果多个会话公用一个临时表,那么知道所有的会话全部结束,那才会释放这个临时表分配的temporary segment。

1
0
分享到:
评论

相关推荐

    Oracle优化器介绍

    Oracle 优化器是 Oracle 数据库中的一种核心组件,负责生成执行计划,以提高 SQL 语句的执行效率。 Oracle 优化器可以分为两大类:基于规则的优化器(RBO)和基于成本的优化器(CBO)。 基于规则的优化器(RBO) ...

    基于成本的oracle优化法则中文版.rar

    "基于成本的Oracle优化法则"是一个重要的概念,它涉及到Oracle数据库查询优化器的工作原理。在这个主题中,我们将深入探讨这一法则,理解其背后的机制,并学习如何利用这些知识来提升数据库性能。 1. **基于成本的...

    基于成本的ORACLE优化法则 英文原版

    《基于成本的Oracle优化法则》是数据库专家Jonathan Lewis的一部经典著作,该书深入探讨了Oracle数据库的性能优化策略,特别是在成本基础优化方面。Oracle数据库是全球广泛使用的大型企业级数据库系统,其性能优化...

    Oracle优化常用概念.pptx

    Oracle 优化器是 Oracle 数据库管理系统中一个核心组件,负责根据用户提交的 SQL 语句生成最优的执行计划,以提高查询效率。以下是 Oracle 优化器中的一些常用概念: CBO/RBO Oracle 优化器有两种模式:CBO...

    ORACLE优化设计方案

    Oracle优化设计方案旨在提升数据库性能,确保数据安全,便于管理和开发。设计Oracle数据库时,需要遵循一系列基本原则和步骤。 首先,逻辑建模是根据系统需求分析数据间的内在和外在关系,构建整个系统的数据结构。...

    Oracle优化日记-一个金牌dba的故事

    《Oracle优化日记——一个金牌DBA的故事》这本书深入浅出地揭示了Oracle数据库优化的精髓。作为一名金牌DBA,作者以其丰富的实战经验,通过一系列的实际案例,讲述了在Oracle数据库管理与优化过程中的种种挑战和解决...

    oracle 优化重量级

    #### 一、Oracle优化的重要性 在数据库管理领域,Oracle数据库因其卓越的性能、稳定性和安全性而被广泛采用。然而,随着业务量的增长和技术的发展,即使是像Oracle这样的顶级数据库系统也可能会遇到性能瓶颈。因此...

    Oracle优化日记:一个金牌DBA的故事(第一、二部)

    在"第一部"中,作者可能从基础的Oracle优化概念入手,如SQL查询优化、索引策略、表的设计与分区、内存管理以及数据库的体系结构。SQL优化是DBA日常工作中不可或缺的部分,通过分析执行计划、使用绑定变量、调整SQL...

    oracle优化教程

    #### 一、选用适合的Oracle优化器 在Oracle数据库中,优化器的选择对于SQL语句的执行效率至关重要。Oracle提供了三种优化器类型:基于规则(RULE)、基于成本(COST)和选择性(CHOOSE)。其中,基于成本的优化器...

    OracleSQL的优化.pdf

    Oracle SQL 优化 Oracle SQL 优化是数据库性能优化的关键部分。为了提高数据库的性能,我们需要从五个方面进行调整:去掉不必要的大型表的全表扫描、缓存小型表的全表扫描、检验优化索引的使用、检验优化的连接技术...

    Oracle优化打包下载

    优化笔记 sql性能的调整-总结 SQL代码性能优化 Oracle语句优化53个规则详解 ORACLE9i优化设计与系统调整 oracle9i优化器介绍 oracle9i的查询优化 ……

    Oracle优化Oracle优化

    ### Oracle优化方法与实践 #### 一、优化器模式选择 在进行Oracle数据库优化时,首先需要关注的是优化器模式的选择。Oracle提供了多种优化器模式,包括基于规则的优化器(RULE)、基于成本的优化器(COST)以及...

    ORACLE SQL性能优化系列

    ORACLE SQL性能优化是数据库管理员和开发者非常关心的一个话题。为了提高数据库的性能,ORACLE 提供了多种优化技术。下面我们将详细介绍 ORACLE SQL 性能优化系列中的一些重要知识点。 一、访问表的方式 ORACLE ...

    oracle 优化 ppt教程

    Oracle优化PPT教程通常会涵盖一系列关键概念和技术,旨在提高数据库的运行效率,减少资源消耗,提升用户体验。以下是对这个教程可能涉及的知识点的详细解释: 1. **SQL优化**:这是Oracle数据库优化的核心,涉及到...

    Oracle优化日记:一个金牌DBA的故事 第一部

    本书是一本介绍oracle数据库优化方法的书,以一个实际的大型优化项目为原型,用日记的形式记录了一个优化小组的dba 如何从纷繁的头绪中找到突破口,进而完成了一个看似不可能完成的任务的历程。在日记之间,作者还...

    oracle数据库性能优化.pdf

    总的来说,Oracle数据库性能优化是一个全面的过程,涵盖硬件配置、软件设置、SQL优化、存储策略等多个方面。需要根据系统负载、业务需求以及资源状况进行综合分析,持续监控和调整,以实现最优的数据库运行状态。...

    Oracle优化文档

    综上所述,Oracle优化是一个综合性的任务,不仅涉及数据库参数的精细化调整,还包括对特定应用(如ArcSDE)的深度优化。通过对这些文档的深入学习和实践,我们可以构建一个高效、稳定的Oracle数据库环境,满足GIS...

    Oracle 优化 金牌 DBA 日记

    本篇将围绕"Oracle 优化 金牌 DBA 日记"这一主题,深入探讨Oracle数据库优化的相关知识点。 1. **索引优化**:索引是提升查询性能的关键工具。金牌DBA会根据查询模式和数据分布情况创建和维护索引,如B树索引、位图...

Global site tag (gtag.js) - Google Analytics