`
秋天的童话穷
  • 浏览: 79444 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

oracle的段

 
阅读更多

Oracle段( segment

Oracle中最重要的一个逻辑结构,因为用户直接操作的就是对象,对它进行增删改查等。

 

 

概念:一个堆表所占用所有物理空间, 这里的 " 所有物理空间 " 就指的是一个段 .( 分区表除外 , 分区表有多个段 ) ,段是占有一定存储空间的对象 可以理解为是对占用空间的对象的另一种命名方法,表是段 , 索引也是段,上图可以看到段可以跨越多个数据文件,一个表空间由一个或多个段组成 一个段由一个或多个区组成。

在这里我主要介绍比较主要的段:

1、

2、 索引

3、 回滚段

 

一、 表(table

表是存储数据的基本单元,由行和列组成,以行为基础存储,它是段的一种,由extent 组成。表的具体存储我会在数据块那里详细讲一下,这里就不在细讲了。

表中又分为普通表和临时表,普通表比较简单就是大家经常操作的表,也是真实存储数据的,这里详细介绍一下临时表。

临时表的特点:

1、多用户操作的独立性:对于使用同一张临时表的不同用户, ORACLE 都会分配一个独立的  Temp Segment ,这样就避免了多个用户在对同一张临时表操作时发生交叉,从而保证了多个用户操作的并发性和独立性;

2、数据的临时性:既然是临时表,顾名思义,存放在该表中的数据是临时性的。比如 , 购物网站的购物车系统 , 用户选购的过程就是一个 session, 被选物品存在临时表里当结算完物品 购物车内的数据即没有意义了

 

临时表又可以分为事物级和会话级:

1、 事物级:

 On Commit Delete Rows

数据在 Transaction  期间有效,一旦 COMMIT 后, rollback, 断开连接 , 数据就被自动  TRUNCATE  掉。

 

 

2、 session级:

        On Commit Preserve Rows

数据在 Session  期间有效,一旦关闭了 Session  或  Log Off  后,数据就被  ORACLE  自动  Truncate  掉。

 

创建临时表:

create global temporary table t_tmp_tab (id number,name varchar2(20)) on commit delete rows /on commit preserve rows;

 

临时表创建默认创建在临时表空间中。

 

二、 索引(index

通过行的指针(ROWID) 来加速获取数据,能用很少的磁盘 IO 快速定位数据,索引跟表是独立的对象 , 逻辑上关联,被 ORACLE 自动维护  ( 不完全这样 , 有的时候索引会失效 , 我们要 rebuilt) ,是数据库自己来决定是否使用的,所有的索引都是树状结构的,是有序的。

索引可以分为:B-TREE BITMAP

这里主要讲一下B-TREE 索引, BITMAP 索引暂时不在此讲解

1、 B-TREE

 

查看索引的情况:

analyze index T1_EMPNO_IDX validate structure;

Select  height blocks br_blks lr_blks lf_rows del_lf_rows from  index_stats

 

快速定位的意思就是无论找图中红的哪个数据都只需要三步

三步是由索引的高度来决定的

 

一、分支节点: 实际上根节点也是分支节点块

    对于分支节点块(包括根节点块)来说,其所包含的索引条目都是按照顺序排列的,每个索引条目都具有两个基本字段

第一个字段表示当前该分支节点块下面所链接的索引块中所包含的最小键值

第二个字段为四个字节,表示所链接的索引块的地址,该地址指向下面一个索引块

其中的0 500 1000 分别表示这三个分支节点块所链接的键值的最小值

B1 B2 B3 则表示所指向的三个分支节点块的地址  Branch B

L1 L2 L3 则表示所指向的三个叶子节点块的地址  Leaf L

 

二、叶子节点:

对于叶子节点块来说,其所包含的索引条目与分支节点一样, 都是按照顺序排列的

每个索引条目也具有两个字段

第一个字段表示索引的键值,对于单列索引来说是一个值;而对于多列索引来说则是多个值组合在一起的

第二个字段表示键值所对应的记录行的ROWID ,该 ROWID 是记录行在表里的物理地址

其中的0 29 190 分别表示这三个分支节点块所链接的键值的最小值

R1 R2 R3 则表示所指向的三个键的 ROWID 的值  ROWID R

如果索引是创建在非分区表上或者索引是分区表上的本地索引的话,则该ROWID 占用 6 个字节

如果索引是创建在分区表上的全局索引的话,则该ROWID 占用 10 个字节。

 

三、索引是oracle 自动维护的

DML 发生时 我们改的是表  oracle 却在后台要维护索引的组织结构

所以说索引会增加DML 的负担

但也要有量级控制 比如从1 千万记录中 delete10 行 比例千万分之十 找到要改的记录不走索引就太艰难了 . 反之亦然 

一般来说以操作表内数据量的60% 为界限  60% 经常改 其余 40% 是被查询不修改  DML 语句的频度甚至大于 DQL 语句

60% 则加索引 高则不加索引 而且还要参考 SQL

对于OLTP 来说 基本都是查多改少 .

 

四、何时建索引

索引多并不意味着性能好, 索引对查询有利 对 DML 是有负担的 .

1.一个字段包含一个较大范围的值 , 也就是说重复率比较小,就是所谓的高基数列,比如员工编号 入职日期,在一个大范围内去找小范围或精确的单个或几个值时 索引非常有效

2.一个列包含大量的 NULL

  索引是不存NULL 值的 , 那也就意味着这个索引很小 , 查起来很快

  但只限于查明确值,因为你写 where a=1  走索引时就意味着你写的是  where a is not null and a=1 。 但查的是 NULL 值 效率会很低

3.频繁在 where 子句中出现的列 我们要关注是否建立索引

4.大表的外键列 需要建立索引 因为主键值的 DML 操作会间接的去外键中验证是否在外键列引用

  外键列此时没索引 就要全表扫描 所以一个主键只有几条记录 外键无索引一个DML 可能会几个小时 ...

 

五、何时不创建索引

1.这个列虽然索引效果很好 , 但是你业务中很少去使用这个列去查询的 , 考虑不要建索引 , 以均衡索引的成本 .

2.如果该列上返回的结果集大于总结果集的 2-4%( 看总的数据量和 CBO 算法来定 这只是参考值 ), 谨慎考虑建立索引 .

3.表很小时。因为很小表的时候全表访问比索引访问成本还低 , 有没有索引影响不大

4.频繁更新的表 , 其频繁甚至超过查询 , 慎重考虑建立索引

5.这个索引列使用了函数表达式 需要创建函数索引

 

六、基本操作:查看索引

USER_INDEXES

user_ind_columns

index_stats

 

七、普通索引的创建

自动创建

建立主键和唯一约束时自动创建唯一索引

手动创建

CREATE INDEX index_name ON table(COL1[COL2,COL3...]);

多个column 代表复合索引

索引的命名最好有可读性

比如在emp deptno 表建立索引 取名为  emp_deptno_idx

创建的条件

要对表有访问权限

create index 权限

 

 

 

 

三、 回滚段(rollback)

回滚段创建的时候是空闲的,只有事务产生时候才会产生数据。一个事务的数据存在回滚段中如果提交则不会再有人引用该数据,一段时间后就会自动没清处。

作用:

1、 在交易的回退——保留更改前的老数据,为了后悔

2、 交易的恢复,提交已提交的,回退未提交的

3、 读一致性

A、 存储未提交的数据,其他会话隔离

B、 查询开始以后提交的不可见

C、 查询时结果已确定

4、 闪回已提交的事务

查看回滚段中关于某一表的操作版本,这些版本都可以恢复。

Select versions_starttime,versions_endtime,versions_xid,versions_operation,sal from

scott.Emp versions between timestamp minvalue and maxvalue  order by versions_endtime,versions_startime;

查看某一个操作回滚的sql 语句:

Select undo_sql from flashback_transaction_query where xid ='';

查看有那些回滚段

Select segment_name from dba_undo_extents;

查看那个回滚段是有事务的(活动的事务)

Select xidusn from v$transaction;

 

一般有10 个用户可以用回滚段,在使用时随机选择一个空闲的回滚段,当超过 10 个后

1、 空间富裕则建立新的回滚段

2、 不能建立新的情况则2 个事务使用一个回滚段

3、 没有空间则报错,缺失回退

 

  • 大小: 241.5 KB
分享到:
评论

相关推荐

    ORACLE 段的碎片整理

    在Oracle数据库管理系统中,段(Segment)是存储数据库对象(如表、索引等)的主要结构。当创建一个数据库对象时,它会被分配到特定的表空间中,表空间是数据库中逻辑存储的单位,由一个或多个数据文件组成。段则由...

    Oracle 块,区,段等结构的说明以及实验验证

    二、对逻辑结构类型优化的思考 Oracle数据块是由系统磁盘中的块映射而成, 共支持五种2KB,4KB,8KB,16KB,32KB块大小。...Oracle 段是由一个或多个区组成,且存在于一个表空间中。 Oracle 表空间是由一个或多个段组成。

    oracle回滚段使用率过高之解决方法

    Oracle 回滚段使用率过高之解决方法 Oracle 回滚段是一种重要的数据库机制,它用于存放数据修改之前的值,以便在事务回滚或恢复时使用。然而,回滚段使用率过高可能会导致数据库性能下降和空间不足的问题。本文将...

    深入解析oracle的回滚段

    Oracle数据库中的回滚段(Rollback Segments)是存储事务历史的重要组件,它们记录了数据修改前的状态,以确保数据的完整性和一致性。在深入理解回滚段之前,我们需要先明确其基本概念和作用。 回滚段的主要功能...

    oracle高水位线

    Oracle 高水位线(High Water Mark,HWM)是 Oracle 段中一个重要的概念,它标志着段中已经使用的数据块的上限。在 Oracle 中,每个段(包括表、索引等)都有一个高水位线,用于记录该段已经使用的数据块的数量。 ...

    sql查询oracle时间段操作

    在SQL查询中对Oracle数据库进行时间段操作是一项关键技能,特别是在数据恢复和历史数据分析时。Oracle数据库提供了多种方式来处理时间范围的数据,包括SQL查询、闪回功能和快照。下面我们将详细探讨这些知识点。 ...

    Oracle时间区间段合并.pdf

    在Oracle数据库中,时间区间段的合并是一项常见的需求,特别是在数据分析、日志处理或资源调度等领域。本问题涉及的PDF文档“Oracle时间区间段合并.pdf”似乎提供了关于如何使用SQL来实现这一功能的方法。以下是对这...

    oracle 回滚段探究

    ### Oracle回滚段探究 #### 一、引言 在Oracle数据库中,回滚段扮演着至关重要的角色,尤其是在确保事务处理的完整性和提供一致性视图方面。本文旨在深入探讨Oracle回滚段的相关知识,包括其作用、原理、分配与...

    oracle数据库回滚段专题解析

    ### Oracle数据库回滚段专题解析 #### 回滚段概述 在Oracle数据库中,回滚段(Rollback Segment)是一种非常重要的数据结构,主要用于存储数据修改前的状态信息,即所谓的“前影像”。这一机制对于确保数据库的...

    ORACLE数据库中插入大字段数据的解决方法

    在ORACLE数据库中插入大字段数据时,可能会遇到性能问题或者由于字段长度限制导致的错误。这类问题通常涉及LOB(Large Object)类型的字段,如CLOB(Character Large Object)和BLOB(Binary Large Object)。本篇...

    获取oracle 表字段,表名,以及主键之类等等的信息

    获取oracle 表字段,表名,以及主键之类等等的信息,获取oracle 表字段,表名,以及主键之类等等的信息获取oracle 表字段,表名,以及主键之类等等的信息获取oracle

    oracle 回滚段

    Oracle 回滚段 Oracle 回滚段是 Oracle 数据库中的一种重要组件,它用于保存数据库修改前的数据,以便在需要时可以通过 ROLLBACK 命令恢复到修改前的数据。回滚段的设置对数据库的性能产生直接影响,特别是在更新...

    oracle抓取指定时间段AWR报告实例说明 .docx

    ### Oracle抓取指定时间段AWR报告实例说明 #### 背景介绍 在日常的数据库运维工作中,我们经常需要对Oracle数据库的性能进行监控与优化。自动工作负载资料库(Automatic Workload Repository,简称AWR)是Oracle 10...

    一段无需安装Oracle客户端即可访问Oracle数据库的delphi控件

    标题中的“一段无需安装Oracle客户端即可访问Oracle数据库的Delphi控件”指的是在Delphi编程环境中,使用特定的第三方控件或组件库,可以实现与Oracle数据库的连接和交互,而不需要在用户机器上安装完整的Oracle...

    相克军 ORACLE 讲座 深度剖析UNDO段 笔记.doc

    里面也有段区块,ORACLE自动建立生成、自动使用UNDO段。 作为高级别的DBA是需要知道ORACLE如何使用UNDO段的。 1 Undo表空间及管理方式 ORACLE开始一个事务的时候,会用到表空间。将修改前的数据保存在UNDO段里。 ...

    oracle表字段或是视图字段添加备注方法

    Oracle 表字段或是视图字段添加备注方法 Oracle 是一个强大的关系数据库管理系统,提供了多种方式来添加备注信息到表字段或视图字段中。在本节中,我们将详细介绍如何使用 Oracle 的 Comment 机制来添加备注信息到...

    超经典 解决windows下oracle11G安装卡壳.doc

    8. 从WIN.INI文件中移除Oracle段。 9. 删除ODBC数据源:如果有的话,清除与Oracle相关的ODBC数据源设置。 10. 清理事件查看器:删除Oracle的日志条目。 在执行上述步骤后,确保重启系统以释放可能被占用的文件,...

    Oracle Freelist和HWM原理探讨及相关性能优化

    High Water Mark(HWM)是Oracle段内的一条虚拟线,表示段中已分配的最高数据边界。一旦数据写入超过了HWM,Oracle会在段的下一个区分配新的空间。HWM与SQL性能紧密相关,因为它影响了数据扫描的效率。如果数据集中...

    Oracle数据库回滚段的故障分析与性能优化.pdf

    Oracle数据库回滚段的故障分析与性能优化 回滚段是 Oracle 数据库的重要组成部分,数据库的性能与回滚段息息相关。本文将针对数据库回滚段常见的故障进行系统的分析,结合实例提出相应的解决方案,并对数据库回滚段...

    Oracle 导出某时间段AWR与ASH性能报告操作日志

    ### Oracle 导出某时间段AWR与ASH性能报告操作日志 #### 一、Oracle AWR与ASH简介 ##### 1.1 AWR (Automatic Workload Repository) 在Oracle数据库环境中,AWR是一种自动化的工具,它收集并存储有关数据库工作...

Global site tag (gtag.js) - Google Analytics