db2表空间详解.docx
《db2表空间详解.docx》由会员分享,可在线阅读,更多相关《db2表空间详解.docx(14页珍藏版)》请在冰豆网上搜索。
![db2表空间详解.docx](https://file1.bdocx.com/fileroot1/2023-1/14/8ac8408e-1d0b-4e90-bc66-d9e3bd1f9183/8ac8408e-1d0b-4e90-bc66-d9e3bd1f91831.gif)
db2表空间详解
3.2表空间设计
3.2.1创建表空间
表空间建立数据库系统使用的物理存储设备与用来存储数据的逻辑对象或表之间的关系。
对于非自动存储器表空间,在创建表空间时,必须知道将引用的容器的设备名或文件名。
另外,必须知道与要分配给表空间的每个设备名或文件名及分配空间大小。
对于自动存储器表空间,数据库管理器将根据与数据库关联的存储路径将容器指定给表空间。
在一个数据库内创建表空间,会将容器分配到表空间,并在数据库系统目录表中记录它的定义和属性,然后就可以在此表空间内创建表。
当创建数据库时,会创建3个初始表空间。
这3个初始表空间的页大小基于使用CREATEDATABASE命令时建立或接受的默认值。
此默认值还表示所有将来CREATE BUFFERPOOL和CREATE TABLESPACE语句的默认页大小。
如果在创建数据库时不指定页大小,那么默认大小是4KB。
如果在创建表空间时不指定页大小,那么默认页大小是创建数据库时设置的页大小。
创建表空间可以通过控制中心或命令行创建。
一、使用控制中心创建表空间
使用控制中心创建表空间
二、使用命令行创建表空间
1.创建用户表空间
创建SMS表空间:
CREATETABLESPACEMANAGEDBYSYSTEMUSING(‘’)
创建DMS表空间:
CREATETABLESPACEMANAGEDBYDATABASEUSING(DEVICE|FILE’’)
创建自动存储器表空间
CREATETABLESPACE
或CREATETABLESPACEMANAGEDBYAUTOMATICSTORAGE
例:
1.在Windows上,使用3个不同的驱动器上的目录,创建SMS表空间
CREATETABLESPACETS1MANAGEDBYSYSTEM
USING(‘d:
\nxz_tbsp’,’e:
\nxz_tbsp’,’f:
\nxz_tbsp)
2.使用各自有5000页的两个文件容器创建了一个DMS表空间:
CREATETABLESPACETS2MANAGEDBYDATABASE
USING(FILE’d:
\db2data\acc_tbsp’5000,FILE’e:
\db2data\acc_tbsp’5000)
在创建DMS表空间时,表空间文件容器不需要重建,DB2自动来创建,但裸设备容器无法自动创建,需要root用户参与。
在示例中,为表空间容器提供了显式的名称。
但是,如果指定相对容器名,那么将在为该数据库创建的子目录中创建容器。
在创建表空间容器时,数据库管理器会创建任何不存在的目录和文件。
例如,如果将容器指定为/prod/user_data/container1,而目录/prod不存在,那么数据库管理器会创建目录/prod和/prod/user_data。
在Linux/UNIX上,数据库管理器创建的任何目录都是使用权限位700创建的。
这意味着只有实例所有者才拥有读写访问权和执行访问权。
因为只有实例所有者具有这种访问权,所以当正在创建多个实例时,可能会出现下列情况:
·使用与上面描述的相同的目录结构,假定目录级别/prod/user_data不存在。
·user1创建一个实例(默认情况下命名为user1),接着创建一个数据库,然后创建一个表空间,且/prod/user_data/container1作为该表空间的一个容器。
·user2创建一个实例(默认情况下命名为user2),接着创建一个数据库,然后创建一个表空间,且/prod/user_data/container2作为该表空间的一个容器。
因为数据库管理器根据第一个请求使权限位700创建了目录级别/prod/user_data,所以user2没有对这些目录级别的访问权,因此不能在这些目录中创建container2.在这种情况下,CREATETABLESPACE操作将失败。
解决此冲突有两种方法:
·在创建表空间之前创建目录/prod/user_data,并将许可权设置为user1和user2创建表空间所需的任何访问权。
如果所有级别的表空间目录都存在,那么数据库管理器不会修改访问权。
·在user1创建/prod/user_data/container1之后,将/prod/user_data的许可权设置为user2创建表空间所需的任何访问权。
如果数据库管理器创建了一个子目录,那么在删除该表空间时数据库管理器也可能将该子目录删除。
例:
1.在AIX上创建了一个使用具有10000页的3个裸设备作为表空间容器的DMS表空间,并指定它们的I/O特征。
CREATETABLESPACETS1MANAGEDBYDATABASE
USING(DEVICE‘/dev/rdblv6’10000,DEVICE‘/dev/rdblv7’10000,DEVICE‘/dev/rdblv8’10000)OVERHEAD7.5TRANSFERRATE0.06
示例中的裸设备必须已经存在,且实例所有者和SYSADM组必须能够写入这些设备。
2.在Linux和UNIX系统上创建一个具有8KB页大小的SMS表空间。
CREATETABLSESPACESMS8KPAGESIZE8192MANAGEDBYSYSTEM
USING(‘FSMS_8K_1’BUFFERPOOLBUFFERPOOL8K
示例中相关联的缓冲池必须具有相同的8KB页大小。
而且只有在激活了创建的表空间所引用的缓冲池之后才能使用该表空间。
2.创建系统临时表空间
系统临时表空间用来存储分组、排序、连接、重组、创建索引操作。
数据库必须始终至少有一个这样的表空间。
创建数据库时,定义的3个默认表空间之一便是名为“TEMPSPACE1”的系统临时表空间。
创建名为tmp_tbsp的表空间
CREATESYSTEMTEMPORARYTABLESPACEtmp_tbspMANAGEDBYSYSTEMUSING(‘d:
\tmp_tbsp’,’e:
\tmp_tbsp’)
对于每个页大小至少应该具有一个和该页大小匹配的系统临时表空间。
3.创建用户临时表空间
用户临时表空间不是在创建数据库时默认创建的。
如果应用程序需要使用临时表,则需要创建用来驻留临时表的用户临时表空间。
用户临时表空间通常用来批量插入、批量更新和批量删除以加快速度。
使用DECLAREGLOBALTEMPORARYTABLE语句声明临时表时必须要求用户临时表空间存在。
创建名为usr_tmp的用户临时表空间
CREATE USER TEMPORARY TABLESPACE usr_tbspMANAGEDBYDATABASE
USING(FILE‘d:
\db2data\user_tbsp’5000,FILE’e:
\db2data\user_tbsp’5000)
3.2.2表空间维护
1.查看表空间
可以使用DB2LISTTABLESPACES[SHOWDETAIL]来查看表空间的详细信息。
LISTTABLESPACES命令的输出信息如下:
当前数据库的表空间
表空间标识=0
名称=SYSCATSPACE
类型=数据库管理空间
内容=所有持久数据。
常规表空间。
状态=0x0000
详细解释:
正常
表空间标识=1
名称=TEMPSPACE1
类型=系统管理空间
内容=系统临时数据
状态=0x0000
详细解释:
正常
表空间标识=2
名称=USERSPACE1
类型=数据库管理空间
内容=所有持久数据。
大型表空间。
状态=0x0000
详细解释:
正常
图示中的3个表空间都是通过CREATEDATABASE命令自动创建的。
用户可以通过在该命令中定制表空间选项来覆盖默认的表空间创建选项。
但是在创建数据库时必须创建一个系统编目表空间和至少一个常规表空间,以及至少一个系统临时表空间。
通过使用CREATEDATABASE命令或以后使用CREATETABLESPACE命令,可以创建更多的所有类型的表空间(系统表空间除外)。
上述3个表空间中,系统编目表空间和系统临时表空间都是只读的,用户不可以在上面创建用户表,如下所示:
C:
\DocumentsandSettings\Administrator>db2createtablet(iint)insyscatspace
DB21034E该命令被当作SQL语句来处理,因为它是无效的“命令行处理器”命令。
在SQL处理期间,它返回:
SQL0287NSYSCATSPACE不可用于用户对象。
SQLSTATE=42838
查看表空间及容器的属性
指定LISTTABLESPACES命令的SHOWDETAIL选项将显示其他信息:
LISTTABLESPACESSHOWDETAIL
默认情况下,将列出创建数据库时所创建的3个表空间。
LISTTABLESPACESSHOWDETAIL命令的输出信息如下:
要列出容器,我们需要使用以上输出中的TablespaceID:
LISTTABLESPACECONTAINERSFOR2
查看表空间容器的情况,使用LISTTABLESPACECONTAINERS命令:
该命令将列出指定表空间中的所有容器。
如上所示的路径指向容器物理上所在的位置。
表空间状态
查看一个数据库中的表空间的状态,可以使用命令:
LISTTABLESPACESSHOWDETAIL
一个表空间可以有多种不同的状态,如下所示:
2.修改表空间
可使用控制中心或命令行来改变表空间。
要使用命令行来改变表空间,可使用ALTERTABLESPACE语句。
可以改变SMS、DMS和自动存储器容器,还可以重命名表空间,并将它从脱机方式改为联机方式。
对于SMS表空间,我们只能增加容器,对于DMS表空间,可以添加、扩展、重新平衡、删除或减少容器,或者调整容器大小。
添加或扩展DMS容器
通过将一个或多个容器添加至DMS表空间,可以增大该表空间的大小。
当将新容器添加到表空间或扩展现有容器时,可能会发生表空间重新平衡(rebanlance)。
重新平衡过程涉及将表空间扩展数据块从一个位置移至另一位置。
在此过程中,将尝试在表空间内分割数据。
重新平衡不必在所有容器上进行,但这取决于许多因素,例如现有容器配置、新容器的大小和表空间满的程度。
在重新平衡期间,不限制对该表空间的访问。
如果需要添加多个容器,那么应该同时添加这些容器,以减少重新平衡的次数。
虽然重新平衡期间表空间仍然可以访问,但是我们还是尽量避免在业务高峰期间增减容器,因为数据重新平衡期间系统上有很大的I/O活动。
要使用命令行将容器添加到DMS表空间,可以使用以下命令:
ALTERTABLESPACEADD(DEVICE‘’,FILE‘’)
例:
在Linux/UNIX系统上,将两个各含10000页的新设备容器添加到表空间
ALTERTABLESPACETS1ADD(DEVICE‘/dev/rhd9’10000,DEVICE‘/dev/rhd10’10000)
添加容器会涉及到表空间容器的重新平衡,如果不想重新平衡表空间,可以使用表空间扩展来修改容器大小,因为extend不会重新平衡表空间数据。
2.在Linux/UNIX系统上,将所有容器扩展10000页添加到表空间
ALTERTABLESPACETS1EXTEND(ALL,10000)
调整DMS容器的大小
不能手动调用自动存储器表空间中容器的大小,否则将报错,如下所示:
只能将每个操作系统裸设备用作一个容器。
创建了裸设备之后,其大小是固定的。
如果使用调整大小或扩展选项来增大裸设备容器时,应先用操作系统命令检查裸设备大小以确保您使用ALTERTABLESPACE命令并未将裸设备大小增大到大于裸设备大小。
要缩小现有容器的大小,可使用RESIZE选项或REDUCE选项。
使用RESIZE选项时,作为语句的一部分列示的所有容器都必须增大大小或减小大小。
不能在同一语句中增大某些容器而缩小其他容器。
如果知道容器大小的新下限,应考虑调整大小的方法。
如果不知道容器的当前大小,那么应该考虑缩小方法。
缩小DMS表空间中一个或多个容器的大小的命令,如下所示:
ALTERTABLESPACEREDUCE(FILE‘’)
例:
在Windows系统上的表空间中缩小文件容器(原来为1000页):
ALTERTABLESPACEPAYROLLREDUCE(FILE‘d:
\hldr\finance’200)
执行该操作后,文件大小就从1000页减少到800页。
增大DMS表空间中一个或多个容器的大小的命令,如下所示:
ALTERTABLESPACERESIZE(DEVICE‘’)
例:
在Linux/UNIX系统上的表空间中增大两个设备容器(原来为1000页):
ALTERTABLESPACEHISTORYRESIZE(DEVICE‘/dev/rhd7’2000,DEVICE‘/dev/rhd8’2000)
执行该操作后,两个设备的大小都从1000页增加至2000页。
扩展DMS表空间中一个或多个容器的命令,如下所示:
ALTERTABLESPACEEXTEND(FILE‘’)
例:
在Windows系统上的表空间中增大文件容器(原来大小为1000):
ALTERTABLESPACEPERSONALEXTEND(FILE‘e:
\wrkhist1’200,FILE‘f:
\wrkhist2’200)
执行该操作后,两个文件的大小都从1000页增大至1200页。
删除或减少DMS容器
对于DMS表空间,可以使用ALTERTABLESPACE语句从表空间中删除容器或缩小容器的大小。
要缩小容器,在ALTERTABLESPACE语句上使用REDUCE或RESIZE选项。
要删除容器,在ALTERTABLESPACE语句上使用DROP选项。
仅当正在删除或缩小其大小的扩展数据块数目小于或等于表空间中“高水位标记”之上的可用数据块数目时,才允许删除现有表空间容器以及缩小现有容器的大小。
高水位标记是表空间中分配的最高页的页数。
次标记与表空间中已使用的页的数目不同,高水位标记下的某些扩展数据块可能可供复用。
表空间中高水位标记之上的可用扩展数据块数非常重要,原因是直至高水位标记(包括高水位标记)的所有扩展数据块必须位于表空间内的同一逻辑位置。
结果表空间必须有足够的空间才能容纳所有数据。
如果没有足够的可用空间,那么会产生一条错误信息(SQL20170N或SQLSTATE57059)。
要删除容器,可在ALTERTABLESPACE语句上使用DROP选项。
例如:
ALTERTABLESPACETS1DROP(FILE‘file1’,DEVICE‘/dev/rdisk1’)
改变自动存储器表空间
对于自动存储器表空间,不能手动调整自动存储器表空间的大小,数据库管理器将在需要时自动调整容器大小。
3.重命名表空间
可以使用RENAMETABLESPACE语句来重命名表空间。
不能重命名SYSCATSPACE表空间。
不能重命名处于“前滚暂挂”或“正在前滚”状态的表空间。
可以给予现有表空间新名称,而无需关心该表空间中的个别对象。
重命名表空间时,将更改所有引用该表空间的目录记录。
例如:
RENAMETABLESPACETS1TOTS2
当复原在备份后已被重命名的表空间时,必须在RESTOREDATABASE命令中使用新的表空间名。
如果使用先前的表空间名,那么将找不到该名称。
同样,如果使用ROLLFORWARDDATABASE命令前滚该表空间,也需要确保使用新名称。
如果使用先前表空间名,那么将找不到该名称。
4.将表空间从脱机状态切换至联机状态
如果与表空间相关的容器不可访问,这时表空间处于OFFLINE状态,要使用命令行从表空间中除去OFFLINE状态,请输入:
ALTERTABLESPACESWITCHONLINE
在一个双机热备HA环境中,客户在主机上重新创建了使用裸设备的表空间后,未同步HA环境,结果导致主机故障切换到备机时,由于裸设备权限不正确而导致表空间处于OFFLINE状态,此时就需要修改到ONLINE状态。
5.删除表空间
当删除表空间时,也会删除该表空间中的所有数据,释放容器,除去目录条目,并导致该表空间中定义的所有对象都被删除或标记为无效。
可以通过删除表空间来重用空表空间中的容器,但是,在试图重用这些容器之前,必须落实DROPTABLESPACE语句。
删除用户表空间
可删除一个包含所有表数据的用户表空间,包括在该单个用户表空间中的索引和LOB数据。
也可删除所包含的表跨几个表空间的用户表空间。
即,可能表数据在一个表空间,索引在另一个表空间且任何LOB数据在第3个表空间。
必须在一条语句中同时删除所有3个表空间。
包含跨越的表的所有表空间必须全部纳入此单条语句中,否则该删除请求将失败。
例如创建表的定义如下:
createtabletable1(picnoint,picclob(lg))indata_spaceindexindex_spacelonginlob_space
只能同时删除3个表空间:
DROPTABLESPACEDATA_SPACE,INDEX_SPACE,LOB_SPACE
删除用户临时表空间
仅当用户临时表空间中当前未定义已声明临时表时,才能删除该表空间。
当删除表空间时,不会尝试删除该表空间中所有已声明临时表。
已声明临时表是在说明它的应用程序与数据库断开连接时隐式删除的。
删除系统临时表空间
如果不首先创建另一系统临时表空间,那么不能删除页大小为4KB的默认系统临时表空间。
新的系统临时表空间必须具有4KB页大小,原因是数据库必须始终存在至少一个具有4KB页大小的系统临时表空间。
例如,如果具有页大小为4KB的单个系统临时表空间,并且您想要将一个容器添加到该表空间(它是SMS表空间),那么必须首先添加一个具有适当数目的容器的新4KB页大小的系统临时表空间,然后删除旧的系统临时表空间(如果正在使用DMS,那么可以添加容器而不必删除并重新创建表空间)。
默认系统临时表空间页大小是创建数据库时使用的页大小(默认情况下为4KB),但也可以为8KB,16KB或32KB。
下面是用来创建系统临时表空间的语句:
CREATESYSTEMTEMPORARYTABLESPACEMANAGEDBYSYSTEMUSING(‘’)
创建之后,要使用命令行删除系统表空间,请输入:
DROPTABLESPACE
例:
创建一个名为TEMPSPACE2的系统临时表空间。
createsystemtemporarytablespaceTEMPSPACE2managedbysystemusing(‘d:
\system2’)
一旦创建了TEMPSPACE2,就可以删除原来的系统临时表空间。
droptablespaceTEMPSPACE
3.2.3表空间设计注意事项
1.表空间类型选择
SMS表空间优点:
·根据需要,系统按需分配空间
·由于不必须定义容器,所以创建表空间需要的初始工作较少
DMS表空间优点:
·通过使用ALTERTABLESPACE语句,可添加或扩展容器来增加表空间的大小。
现有数据可自动在新的容器集合中重新平衡,以保持最佳I/O效率
·根据存储的数据的类型,可以把一个表长字段(LF)和大对象(LOB)数据、索引和常规表数据分割存放在多个表空间中以提高性能和空间存储容量。
通过分割表数据,可以提高性能和增加每个表存储的数据量。
例如,如果您要使用4KB页大小的大型表空间,那么可以有一个包含2TB正规表数据的表、有一个包含2TB索引数据的单独表空间和另一个包含2TB长型数据数据的单独表空间。
如果这3中类型的数据存储在一个表空间中,那么总空间将限制为2TB。
使用较大的页大小将存储更多数据。
·对范围分区数据创建的索引可以与表数据存储在不同的表空间中
·在操作系统允许的情况下,可控制数据在磁盘上的位置
·DMS表空间的性能通常优于SMS表空间
对于性能要求很高的应用程序,特别是设计大量DML操作的应用程序,建议使用DMS表空间。
其实DMS的优势,就是数据在物理磁盘上的连续性。
SMS使用操作系统来管理空间,虽然从逻辑上看,看似所有的文件都是连续的,但是在物理磁盘上,每次文件的增大都必须要分配新的空间。
所以从操作系统看来,所谓的“分配”不过是在inode节点中增加个指向页的偏移,这个页是操作系统寻找出来没有被使用的,因此从磁盘上看来,一个文件可以被分切成很多块存储在不同的地方——尽管逻辑上它们是连续的。
这也就是能够动态增加size的SMS文件的致命伤。
不像DMS,分配完成之后一般不会随意增加或者减少size,SMS的size增加有时可能非常频繁,因此每个文件在物理磁盘上的存储会被划分成一个个小块,这样的话尽管在逻辑上它们的条带化还是连续的,但是从物理磁盘上看它们每个extent之间可能并非连续,无法使用rangeprefetch直接从磁盘上读取几个连续的extent。
而且在这两种类型的表空间上,数据的放置也会有所不同。
例如,进行高效表扫描要求扩展数据块中的页在物理上是连续的。
对于SMS,操作系统的文件系统决定了每个逻辑文件页的物理存放位置。
根据文件系统上其他活动的级别以及用来确定放置位置的算法的不同,可能会连续分配这些页,也可能不会。
但是,对于DMS,因为数据库管理器直接与磁盘打交道,所以它可以确保这些页在物理上是连续的。
通常,小型个人数据库用SMS表空间管理最容易。
另一方面,对于不断增长的大型数据库,建议使用SMS表空间用作临时表空间和系统临时表空间,而使用具有多个容器的单独的DMS表空间用于每个表。
另外,建议将长子段(LF)数据和索引存储在他们自己的表空间中。
选择表空间主要考虑以下几方面的因素。
表中的数据量
如果计划在一个表空间存储许多小表,那么考虑使用SMS充当该表空间。
对于小表,DMS表现在I/O和空间管理效率方面的优点就没有那么重要。
SMS的优点(仅在需要时使用)却对小表更具吸引力。
如果一个表较大或者您需要更快地访问表空的数据,应考虑具有较小扩展数据块大小的DMS表空间。
设计数据库时,可以考虑对每个非常大的表都使用单独的DMS表空间,而将所有的小表组合在单个SMS表空间中。
这种分隔还允许您根据表空间的使用选择适当的扩展数据块大小。
表数据的类型
例如,有的表可能包含不经常使用的历史记录数据;最终用户可能愿意接受较长的响应时间,来等待对此数据执行的查询。
在这种情况下,可以为历史记录表使用单独的一个表空间,并将次表空间分配给访问速率较低的较便宜的物理设备。
此外,对于某些表,数据快速以及快速