表空间
表空间是数据库系统中数据库逻辑结构与操作系统物理结构之间建立映射的重要存储结构,它作为数据库与实际存放数据的容器之间的中间层,用于指明数据库中数据的物理位置。任何数据库的创建都必须显式或隐式的为其指定表空间,且数据库中的所有数据都位于表空间中。
用户可以根据硬件环境以及成本等需求,通过指定建立在不同容器上的表空间来自由选择数据的物理存储位置。同时由于备份和恢复可以在表空间级别执行,用户能够进行更多粒度的备份恢复控制。
创建一个表之前要给表准备一个容器(Container)来存储表,这个容器就是表空间。
理解表空间前先理解容器。
容器(Container) 容器是物理存储设备,可以通过目录名、设备名或文件名进行标识。事实上,这也正是三种容器类型。设备容器(如磁带等)和文件容器被同等看待,通常直接将其理解为数据文件(磁盘存储内部结构中有介绍,数据文件中包含若干Extent)。系统管理表空间只能使用目录容器,数据库管理表空间只能使用设备容器和文件容器。
容器被分配给某个表空间,单个表空间可以使用多个容器,但容器只能属于一个表空间。也即表空间与容器的映射关系为1:n。但通常都是1:1的映射关系,便于查找和管理。
DB2的表空间按管理方式分为两种:
系统管理表空间(System Managed Space,SMS)
数据库管理表空间(Database Managed Space,DMS)
系统管理表空间(SMS)
SMS表空间由操作系统的文件系统管理器分配并管理。在这种表空间中,数据存储空间完全由操作系统管理,SMS表空间能够使用的唯一容器是目录容器,SMS表空间可以定义多个容器,目录容器可以根据需要增加大小,因此SMS表空间的大小是可以动态增加的。但是一旦SMS表空间创建,就不能再为表空间增加或删除容器了。SMS表空间中通常包含多个文件,这些文件代表了存储在文件系统空间中的表对象,比如表数据,表索引,表大对象都是单独占用一个或若干个文件的。一旦为表指定了SMS表空间,那么表中的数据就不允许分开存储,即表的常规数据,索引,大对象数据不能位于不同的表空间中。在DB2 V9之前的数据库版本中,创建数据库(创建数据库时如果不指定表空间则会默认创建3个表空间)或表空间的默认类型就是SMS表空间。
PS:只有DB2数据库允许有系统管理表空间,Oracle数据库的表空间都是数据库管理的,不存在系统管理表空间。
SMS每个容器是操作系统的文件空间中的一个目录,该目录中, SQL*.DAT
数据文件存放表中的常规数据; SQL*.DTR
数据文件存放由于重组,表连接等产生的临时数据; SQL*.INX
数据文件存放表中的索引; 还有LF后缀的存放LONG VARCHAR或LONG VARGRAPHIC数据,LB后缀的存放BLOB,CLOB和DBLOB数据,LBA后缀的存放LB后缀文件的分配和可用空间信息等。
使用SMS表空间的每一个表都会在表空间的容器(也就是目录)下对应产生一系列的SQL*.DAT
,SQL*.INX
等文件。表和其对应的文件的信息存放在SYSIBM.SYSTABLES这个系统编目表中,每个表对应一个FID(表所在的文件组编号)和TID(表所在的表空间编号),可以使用查询语句进行查询:
SELECT FID,TID, NAME FROM SYSIBM.SYSTABLES
数据库管理表空间(DMS)
DMS表空间由数据库管理系统(DBMS)自己管理控制,本质上讲,这种类型的表空间是为了最大程度满足数据库管理器的需要而设计并实现的一种特定目的的文件系统。DMS表空间是由有限数量的容器所组成的,DMS表空间可以使用的容器有设备容器和文件容器,这些容器的空间都是在创建时预先分配的。DMS表空间创建时需要手动指定一个或多个容器。以文件为容器的表空间创建完以后就是一个单独的文件。使用DMS表空间的表的数据可以分开存储,即为常规数据,索引和大对象数据指定不同的DMS表空间。
SMS的管理比较简单,由操作系统自动管理,空间大小最数据量的变化由系统自动调整。
DMS是由数据库管理的,空间大小在创建时确定。空间不够时,通过使用 ALTER TABLESPACE 命令来扩展容器。空间多余时,可以释放未使用的那部分 DMS 容器空间(从 V8 开始)。
DMS自动存储表空间(Automatic Storage DMS)
自动存储表空间不是真正意义上的独立类型的表空间。它是DMS存储的另外一种处理方法。DMS需要很多的维护操作,而自动存储器则是作为一种简化的空间管理手段,能够自动进行表空间的管理维护,它是DB2 V8.8.2中引入的概念,目前取代SMS成为默认的表空间类型。
三种表空间对比
特性 | SMS | DMS | 自动存储 |
---|---|---|---|
是否条带化/分段(Strping) | 是 | 是 | 是 |
默认类型 | Version 8 | 无 | Version 9 |
对象管理 | 操作系统 | DB2 | DB2 |
空间分配 | 按需增长/收缩 | 预先分配;大小可以收缩和增长,但是需要DBA干预 | 预先分配;可以自动增长 |
管理的简便性 | 最好;很少需要调优,甚至不需要调优 | 好,但是需要一些调优 | 最好;很少需要调优,甚至不需要调优 |
性能 | 不太好 | 最好,可通过原始容器多获得5%到10%的收益 | 最好,但是不可以使用原始容器 |
容器 | 目录 | 文件/物理设备 | 文件/物理设备 |
表空间最大大小 | 64GB(4K页面) | 2TB(4K页面) | 2TB(4K页面) |
DMS与自动存储DMS
那么DMS和自动存储哪种方式更佳呢?自动存储允许 DBA 为数据库设置在创建所有表空间容器时可以使用的存储路径。DBA 不必显式地定义表空间的位置和大小,系统将自动地分配表空间。在 DB2 9 中,数据库在创建时将启用自动存储,除非 DBA 显式地覆盖这个设置。 启用自动存储的数据库有一个或多个相关联的存储路径。表空间可以定义为 “由自动存储进行管理”,它的容器由 DB2 根据这些存储路径进行分配。数据库只能在创建时启用自动存储。对于在最初没有启用自动存储的数据库,不能在以后启用这个特性。同样,对于在最初启用了自动存储的数据库,也不能在以后禁用这个特性。
非自动存储和自动存储之间的一些差异:
特性 | 非自动存储 | 自动存储 |
---|---|---|
容器的创建 | 必须在创建表空间时显示地提供容器。 | 允许 DBA 为数据库设置在创建所有表空间容器时可以使用的存储路径。不能在创建表空间时提供容器,他们将由DB2自动分配。 |
容器大小的调整 | 在默认情况下,表空间大小的自动调整是关闭的(AUTORESIZE NO)。 | 在默认情况下,表空间大小的自动调整是关闭的(AUTORESIZE YES)。 |
初始大小 | 不能使用INITIALSIZE子句指定表空间初始大小 | 使用INITIALSIZE子句指定表空间初始大小 |
容器的修改 | 可以使用 ALTER TABLESPACE语句(ADD、DROP等等)执行容器操作 | 不能执行容器操作,因为由DB2控制空间管理 |
管理的便捷性 | 可以使用重定向的恢复操作重新定义与表空间相关联的容器 | 不能使用重定向的恢复操作重新定义与表空间相关联的容器,因为由DB2控制空间管理 |
实操
- 表空间创建
- 创建SMS表空间
CREATE TABLESPACE <NAME>
MANEGED BY SYSTEM USING('<PATH>')
- 创建DMS表空间
CREATE TABLESPACE <NAME>
MANEGED BY DATABASE USING(FILE '<PATH>' <SIZE>)
- 创建常规表空间(自动存储DMS)
CREATE REGULAR TABLESPACE <NAME> -常规表空间名称
PAGESIZE 4K -页大小
MANEGED BY AUTOMATIC STORAGE -使用自动存储DMS
- 自定义页大小、容器大小、缓冲池
CREATE LARGE TABLESPACE <NAME> -表空间名称
PAGESIZE 16K -页大小
MANAGED BY DATABASE USING (FILE '<PATH>' <CONTAINER_SIZE>) -容器路径及大小
BUFFERPOOL <BFP_NAME> -指定缓冲池(已创建)
- 表空间查看
- linux查看表空间使用情况:
db2 list tablespaces show detail
- 查看具体表空间:
db2 list tablespace containers for TablespaceID(具体的id) show detail
- SQL查看
SELECT * FROM SYSCAT.TABLESPACES;
SELECT TBSPACE, BUFFERPOOLID FROM SYSCAT.TABLESPACES;
- 表空间修改
ALTER TABLESPACE <NAME> EXTEND (ALL CONTAINERS <SIZE>);-增加表空间
ALTER TABLESPACE <NAME> REDUCE (ALL CONTAINERS <SIZE>);-减小表空间
ALTER TABLESPACE <name> bufferpool <bfp_name>; --修改表空间缓冲池
ALTER TABLESPACE <name> no file system caching; --修改缓存级别
- 表空间删除
drop tablespace 表空间名;
表分区
表分区是一种数据组织模式,在这种模式中,数据将以一个或多个表列的值为依据,分割到多个称为数据分区(或范围)的存储对象中。每一个数据分区被分别存储。这些存储对象可以位于不同的表空间中,可以位于相同的表空间中,也可能是这两种情况的组合。
DB2 数据库分区是 DB2 企业版 DPF(Data Partitioning Feature)选件提供的,它主要用来个分区(逻辑的或物理的)上分布大型数据库提供了必要的可伸缩性,并利用了一个无共享(shared-nothing)结构。数据库在一个非共享的环境中被分解为独立的分区,每个分区都具有自己的资源,例如内存,CPU 和磁盘以及自己的数据、索引、配置文件和事务日志。数据库分区有时称为节点或数据库节点。通过 DPF“分治”的处理,可伸缩性可在单一服务器(纵向扩展)或跨服务器集群(横向扩展)中获得增强。
使用 DPF最显而易见的理由之一就是提高查询工作负载和 INSERT/UPDATE/DELETE 操作的性能。DPF 还可以克服部分 DB2 的架构限制。例如,在 DB2 中,对 4 KB 的页面大小而言,表的最大大小是 64 GB;对于 8 KB 的页面大小而言,表的最大大小是 128 GB;对于 16 KB 的页面大小而言,表的最大大小是 256 GB;对于 32 KB 的页面大小而言,表的最大大小是 512 GB。在 DB2 中,表和表空间的大小限制是根据每个分区进行规定的。跨多个分区划分数据库将允许您根据环境中分区数目的因数来增加表的最大大小。
DB2数据库分区实例图:
表分区说明
在db2数据库中,可对数据表按某个字段进行分区,分区好处是:可扩展表的存储能力、对于大量数据表使用分区字段可提高查询效率。表分区不同于数据库分区,需要在创建表的时候设置分区逻辑。 在定义表分区的字段时,有几个原则:
1.不支持创建只包含长数据类型的多分区表,
2.不能改变分区键定义,
3.分区键应该包含最频繁连接的列,
4.分区键应该由经常参与group by字句的组成,
5.任何主键或唯一键必须包含分区列。
实操
- 表分区创建
CREATE TABLE TABLE_TEST_HAOTD(
DATADATE VARCHAR(8) NOT NULL,
DATA1 VARCHAR(10),
DATA2 VARCHAR(10)
)
PARTITION BY RANGE(DATADATE)
(PART "P20180101" STARTING('20180101') ENDING('2018010'))
- 表分区增加
ALTER TABLE TABLE_TEST_HAOTD ADD PARTITION "P20180102" STARTING '20180102' ENDING '20180102';
-
表分区删除
db2的分区是无法直接删除,要先卸载分区,再进行drop操作。
ALTER TABLE TABLE_TEST_HAOTD DETACH PARTITION P20180101 INTO TABLE TMP_TESTHAOTD_P20180101
DROP TABLE TMP_HAOTDTEST_P20180101
- 表分区查看
SELECT * FROM SYSCAT.DATAPARTITIONS WHERE TABNAME='表名称'
db2 describe data partitions for table <tablename> show detail
部分素材来源:
https://blog.csdn.net/mydriverc2/article/details/81287476