数据块(Block)

数据块Block是Oracle存储数据信息的最小单位。注意,这里说的是Oracle环境下的最小单位。Oracle也就是通过数据块来屏蔽不同操作系统存储结构的差异。无论是Windows环境,还是Unix/Linux环境,他们的操作系统存储结构和方式、甚至字符排列的方式都是不同的。Oracle利用数据块将这些差异加以屏蔽,全部数据操作采用对Oracle块的操作,相当于是一个层次的抽象。

Oracle所有对数据的操作和空间分配,实际上都是针对数据块Block的操作。我们从数据表中搜索出一行,实际中Oracle就会从内存缓冲区(或者硬盘)中读取到该行所在的数据块,再返回这数据块上的指定数据行。Oracle无论是在缓冲区,还是在硬盘,进行数据操作的虽小单位也就是数据块。

数据块是有大小的,在一个数据库建立的时候,通过参数进行设置。注意,在Oracle数据库参数中,只有数据块大小的参数是建库之后不能进行修改的。数据块的大小,在一个数据库中可以支持多个,但是一般没有太大的意义,会给管理和调试带来一定的负担。

数据块的大小是通过kb字节个数来指定的,默认为8KB。相关参数为db_block_size,下面是查看block大小的语句。

设置数据块的大小是依据不同类型的系统的。如果数据块设置比较大,那么一次读取的数据行较多,相应对SGA内存消耗比较大,特定查询引发的换入换出可能较多。如果设置的过小,频繁的IO逻辑物理读也会引起性能问题。

与数据块有关系的另一个参数就是db_file_multiblock_read_count,表示一次从物理存储中读取的数据块数量。对一些数据挖掘系统,可以考虑调节此参数略大一些。

接下来,我们看比block更高的一个单位,区extent。

区extent

区extent是比数据块大一级的存储结构,表示的是一连串连续的数据块集合。我们知道,物理存储通常是随机的读写过程。即使在同一个文件里,我们也不能保证相同的一个信息是存储在绝对连续的物理存储空间的。Oracle数据存储同样如此。

在进行存储数据信息的时候,Oracle将分配数据块进行存储,但是不能保证所有分配的数据块都是连续的结构。所以,出现分区extent的概念,表示一系列连续的数据块集合。

视图dba_extents(或者all_extents、user_extents)是我们研究分区结构和存储构成的重要手段。

从视图中,我们可以清晰看出分区的几个特点。

首先分区是带有段特定性的。数据段segment是分区的上层组织单位,一个数据库对象对应一个segement,数据库对象是归属在不同的schema(owner)上的。所以,通过不同的数据段名称、不同的owner,乃至不同的tablespace表空间信息,就可以定位到数据区extent的信息描述。

另一部分信息是关于该区extent的分配信息,如所在文件编号,起始数据块block编号和数据块数量等内容。

数据段segment

数据段是与数据库对象相对应,一般一个数据库对象对应一个数据段。多个extent是对应一个数据段,每个数据段实际上就是数据库一个对象的代表。从dba_segments视图中,可以比较清楚看清数据段的结构。

从segment_type列的comment信息中,可以看出数据段的类型是多样的。任何种类的数据库对象,本质上都是一种数据段。数据表、索引、回滚、聚集这些都是数据段的一种表现形式。同时,数据段是在数据对象创建的时候就已经创建出来,随着对象体积的增大,而不断分配多个extents进行管理。

另一部分信息可以从dba_segments中读出的,就是该数据对象分配的空间大小和数据块、分区个数。使用这个视图,可以方便的获取到指定schema的所有对象大小。

SQL> select owner,sum(bytes)/1024/1024 as vol, sum(blocks) as totalblocks,sum(extents) as totalextents from dba_segments group by owner having wner='SYS';

OWNER             VOL TOTALBLOCKS TOTALEXTENTS

------------------------------ ---------- ----------- ------------

SYS                 585.5       74944         3248

上面查询,说明SYS的schema,所占用空间585.5MB,包括74944个数据块和3248个分区。

dba_extents 表相当于是dba_segments表更细一级别的表,一个Segment对象有多少个区块extent,在这表中就有多少条数据。

dba_segments表的相当于是对dba_extents信息的汇总,一般来说,一个Segment对象在此表中只有一条数据(分区表除外)。查询一个表即可明白。

比如dba_segments中的bytes字段,是对dba_extents表bytes字段的汇总,表示某个segment的总字节量大小。

dba_segments中的blocks字段,是对dba_extents表blocks字段的汇总,表示某个segment的总数据块的多少。

dba_segments中的extents字段,是对dba_extents表总条数的汇总,表示某个segment有多少个区块(毕竟dba_extents一条数据代表一个区块)。

由上可知,如果查询一个表的所占空间的大小(Segments_size),有两种方法:

方法一,直接从DBA_SEGMENTS计算:

SELECT OWNER, SEGMENT_NAME, BYTES / (1024 * 1024) AS VOL

FROM DBA_SEGMENTS

WHERE SEGMENT_NAME = 'EMP'

AND OWNER = 'NCAOWII';.    --(未考虑分区表,否则还是要进行owner,segment_name汇总)

方法二,对DBA_EXTENTS进行汇总再计算:

SELECT OWNER, SEGMENT_NAME, SUM(BYTES) / (1024 * 1024) AS VOL

FROM DBA_EXTENTS

WHERE SEGMENT_NAME = 'EMP'

AND OWNER = 'NCAOWII'

GROUP BY OWNER, SEGMENT_NAME

一个对象创建出来之后,在segment层次上是分配一个分区extent和八个数据块block。

有一个问题需要注意,通常我们的数据段是与数据对象相关。一个数据对象对应一个segment。但是,分区表的时候,一个分区要对应一个segment对象。还有就是,segment对象是可以指定存储在那个表空间里,实现存储划分的基础也就在于此。不同类型的segment划分建立在不同的表空间里,才有可能存放在不同的文件中,最后分布在不同的物理存储。

分区实际上就是存在分开存储的可能。一般一个对象是不会跨物理存储进行存放的,分区表是对应的多个segment。所以,分区表分开存储空间是可能的。

表空间tablespace

TableSpace是存储结构中的最高层结构。建立一个表空间的时候,是需要指定存储的文件。一个表空间可以指定多个数据文件,多个文件可以在不同的物理存储上。也就是说,表空间是可以跨物理存储的。但是有一点就是,表空间下一级对象数据段的存储,是不能指定存储在那个文件里的。所以,要想让数据对象访问IO负载均衡,需要指定不同的数据对象在不同的表空间里。这也就是为什么将数据表和索引建立在不同的表空间的原因。

表空间通过v$tablespace进行访问。

相对于前面的结构视图,表空间视图的结构要简单的多,只是一些描述信息。其中两个参数需要注意一下。

一个是bigfile,是一个标志位,标志表空间是不是所谓的大文件表空间。大文件表空间是在10g中推出的一个新特性,处于性能考虑,可以设置表空间为大文件表空间,存储超过百T的数据,但是要求数据文件只能有一个。另一个是flashback_on,表示表空间的闪回特性是否开启。

要注意,数据表段区块的概念集合,很容易与schema的结构相混淆。schema是一个组织概念,是来自于经典数据库理论范畴。在oracle中,Schema就是一个组织概念,一个user对应的就是一个schema。schema是逻辑对象的集合组织,同表空间等概念不是一个层面的。

在一个schema里,是可以将对象建立在任何数据表空间内的,只有一个默认表空间的概念default tablespace。指定默认表空间是在创建用户的时候指定的。

分清几个核心概念和各自的区别关系,就能更好的理解Oracle运行的各种机制。

Oracle 表空间、段、区和块简述的更多相关文章

  1. oracle表空间相关

    数据库被划分为若干个表空间,每个表空间内保存一组相关的逻辑对象.每个表空间由一个或者多个数据文件组成.oracle中的数据逻辑上存储在表空间里,物理上存储在属于该表空间的数据文件里.表空间是用户和物理 ...

  2. Oracle表空间管理

    oracle表空间相关常用命令小结: 1.ALTER DATABASE SET DEFAULT BIGFILE TABLESPACE;              //修改表空间数据文件类型 2.ALT ...

  3. 【转】Oracle 表空间与数据文件

    --============================== --Oracle 表空间与数据文件 --============================== /* 一.概念 表空间:是一个或 ...

  4. 【基础】Oracle 表空间和数据文件

    多个表空间的优势:1.能够将数据字典与用户数据分离出来,避免由于字典对象和用户对象保存在同一个数据文件中而产生的I/O冲突2.能够将回退数据与用户数据分离出来,避免由于硬盘损坏而导致永久性的数据丢失3 ...

  5. Oracle 表空间与数据文件

    -============================== --Oracle 表空间与数据文件 --============================== /* 一.概念 表空间:是一个或多 ...

  6. Oracle 表空间查询与操作方法

    一.查询篇 1.查询oracle表空间的使用情况 select b.file_id 文件ID,  b.tablespace_name 表空间,  b.file_name 物理文件名,  b.bytes ...

  7. oracle 表空间tablespace

    一.Oracle 表空间的组成 Everoone knows Oracle数据库真正存放数据的是数据文件,Oracle表空间是逻辑上的概念,他在物理上是并不存在的,把多个DataFile合并到一起就是 ...

  8. oracle 表空间管理

    1.创建表空间 03:01:55 sys@ORADB11G> create tablespace TSPITR datafile '/u01/app/oracle/oradata/TSPITR0 ...

  9. Oracle表空间维护总结

    1. 概念:表空间:最大的逻辑存储文件,与物理上的一个或多个数据文件对应,每个数据库至少拥有一个表空间,表空间的大小等于构成表空间的所有数据文件的大小总和,用于存储用户在数据库中存储的所有内容. 2. ...

  10. Oracle表空间概述及其基本管理

    最近在工作中遇到有同事对Oracle表空间的理解有问题,所以写了这篇文章.我会从概念,管理及特别需要关注的点等几个维度对表空间进行一些介绍.本文以介绍表空间为主,涉及到的其他概念不展开描述.有问题的地 ...

随机推荐

  1. Angular入门教程四

    4.8依赖注入DI 通过依赖注入,ng想要推崇一种声明式的开发方式,即当我们需要使用某一模块或服务时,不需要关心此模块内部如何实现,只需声明一下就可以使用了.在多处使用只需进行多次声明,大大提高可复用 ...

  2. ArcGIS10.x Engine直连提示连接超时ORA-12170 来自:http://www.iarcgis.com/?p=1004

    导语 随着Esri大力宣传直连,用户也越来越由服务连接,改为直连,当然ArcGIS Engine开发用户也不例外. 环境 Oracle数据库,ArcGIS版本不限,不过由于9版本多以服务连接,以10版 ...

  3. MyEclips 2017/2018 (mac 版)安装与破解

    MyEclips 2017/2018 (mac 版)安装与破解 现在在学J2EE,然后使用的工具就是 MyEclipse,现在就抛弃 Eclipse 了,我就不多说它俩的区别了,但是 MyEclips ...

  4. 记作为前端开发人员跑去面试C#.NET

    先谈结果,"秦总",与我面试讨论一个半小时,十分感动,然后拒绝了我. 本月17日16时许,收到邀请,于18日9时到司面试,虽如今仅深入前端领域,皆因曾有1年ASP.NET(C#)的 ...

  5. C#.NET初识

    1..NET平台特点 1)支持多种编程语言(C#.VB.F#.JavaScript.C++/CLI)-托管语言,此外还有Smaltalk.Ruby.Python.COBOL和Pascal的.NET编译 ...

  6. what's up ? docker, all right.

    Docker install 下载对应安装包,离线安装 Docker 需要 docker-engine.docker-engine-selinux.libtool-ltdl这三个软件包. 下面以安装 ...

  7. Scratch www 系统搭建

    原文地址:https://blog.csdn.net/litianquan/article/details/82735809 Scratch www要基于Nodejs的环境才可以运行,我尝试了在Win ...

  8. Oracle 数据库实现数据更新:update、merge

    工作中遇到的数据更新,学习记录. 1.使用update进行数据更新 1)最简单的更新 update tablea a set a.price=1.00 2)带条件的数据更新 update tablea ...

  9. [翻译] GSProgressView

    GSProgressView 本人极不推荐使用drawRect的方式来绘制下载进度条,无论机器的性能怎么高,使用drawRect用于绘制图形都是低效的. A cute little circular ...

  10. mysql资源地址

    http://ftp.ntu.edu.tw/MySQL/Downloads/MySQL-5.7/