DB2 9 数据库管理(731 考试)认证指南,第 2 部分: 数据放置
2009-01-22 16:38:38 来源:WEB开发网创建数据库
数据库目录
对于数据库管理器的每个实例,都有一个系统数据库目录(system database directory)文件,在该文件中,每个被编目到这个实例的数据库都对应着一个条目。当发出 create database 命令时,便自动对数据库进行编目,也可以通过 catalog database 命令来编目数据库。
在定义了数据库的每个驱动器或路径中,都有一个本地数据库目录(local database directory)文件。在这个文件中,对于可从这个位置访问的每个数据库,都有一个条目。
创建数据库
当创建一个数据库时,会执行以下任务:
设置数据库所需的所有系统编目表
为数据库恢复日志分配空间
创建数据库配置文件和默认的值集
将数据库实用程序绑定到数据库
create database 命令
为创建一个数据库,可使用命令:create database
您可以选择指定以下信息:
存储路径
用于编目分区的数据库分区号
用于创建数据库的驱动器或路径
代码集和国家
排序序列
默认的盘区大小
是否应该自动配置数据库
CATALOG、TEMPORARY 和 USERSPACE1 表空间的表空间定义
默认的数据库
create database 命令创建三 个默认的表空间:
SYSCATSPACE 用于系统编目表。SYSCATSPACE 不能被删除。 TEMPSPACE1 用于系统创建的临时表。当创建了另一个临时表空间时,可删除 TEMPSPACE1 表空间。 USERSPACE1 用于用户创建对象的默认表空间。当创建了另一个用户创建的表空间时,可删除 USERSPACE1 表空间。
系统编目表
对于每个数据库,都会创建和维护一组系统编目表。这些表包含关于数据库对象(例如表、视图、索引和包)的定义的信息和关于用户所拥有的对这些对象的访问权限类型的安全信息。这些表存储在 SYSCATSPACE 表空间中。
目录结构
取决于操作系统,create database 命令允许指定用于在其中创建数据库的驱动器或目录。
如果没有指定驱动器或目录,那么数据库就创建在 DFTDBPATH 实例(数据库管理器)配置参数所指定的路径中。
如果没有指定驱动器或目录,并且 DFTDBPATH 实例级配置参数也没有设定,那么数据库就创建在执行 create database 命令时所在的驱动器或目录上。
create database 命令创建一系列的子目录。第一个子目录按被创建数据库所在实例的实例所有者来命名。在这个子目录下,DB2 创建一个目录,以表明该数据库被创建在哪个数据库分区上。
对于非分区数据库,该目录为 NODE0000。对于分区数据库,该目录将被命名为 NODExxxx,其中 xxxx 是一个四位数的数据库实例的分区号,这个分区号在 db2nodes.cfg 文件中指定。例如,如果分区号为 43,那么该目录就是 NODE0043。
在 Windows 中,实例并没有真正的实例所有者,所以这里将使用实例的名称(例如 DB2)代替实例所有者的 ID。
由于在同一个驱动器或目录中可以创建不止一个数据库,因此每个数据库必须有其惟一的子目录。在 NODExxxx 目录下,对于在该驱动器或目录中创建的每个数据库,都有一个 SQLxxxxx 目录。例如,假设有两个数据库 DBASM 和 SAMPLE,它们都是在 Windows 上的 C: 盘中创建的。那么就会有以下两个目录:SQL00001 和 SQL00002。
要确定数据库被创建在哪个目录中,可以输入命令 list database directory on C:。该命令将产生如下所示的输出:
在上面的例子中,数据库 SAMPLE 被创建在 NODExxxx 目录下的 SQL00001 目录中,而数据库 DBASM 则被创建在 SQL00002 目录中。
默认情况下:
系统编目表空间(SYSCATSPACE)将使用目录 SQLT0000.0。
系统临时表空间(TEMPSPACE1)将使用目录 SQLT0001.0。
默认用户表空间(USERSPACE1)将使用目录 SQLT0002.0。
Linux/UNIX 示例 create database 命令
要在目录(文件系统)/database 中创建一个数据库,可使用以下命令:
create database sample on /database
如果该命令是在名为 dbinst 的实例中执行,并且该实例处在定义了数据库分区 0 的服务器上,那么将创建以下目录结构:
/database/dbinst/NODE0000/sqldbdir
/database/dbinst/NODE0000/SQL00001
示例 Windows create database 命令
要在 D: 盘上创建一个数据库,可使用以下命令:
create database sample on D:
如果该命令是在名为 dbinst 的实例中执行,并且该实例处在定义了数据库分区 0 的服务器上,那么将创建以下目录结构:
D:dbinstNODE0000sqldbdir
D:dbinstNODE0000SQL00001
创建 DMS 类型的 USERSPACE1 表空间
为了使用两个文件容器创建一个数据库,并将 USERSPACE1 表空间定义为数据库管理的表空间(DMS),可使用以下命令:
在 Linux 或 UNIX 上:
create database sample2 user table space managed by database
using(file '/dbfiles/cont0' 5000, file '/dbfiles/cont1' 5000)
在 Windows 上:
create database sample2 user table space managed by database
using(file 'c:dbfilescont0' 5000, file 'c:dbfilescont1' 5000)
用用户定义的容器创建 TEMPSPACE1 表空间
为了创建一个数据库,并使 TEMPSPACE1 表空间使用两个 SMS 容器(见 SMS 表空间), 可使用以下命令:
在 Linux 或 UNIX 上:
create database sample3 temporary tablespace managed by system
using('/dbfiles/cont0', '/dbfiles/cont1')
在 Windows 上:
create database sample3 temporary tablespace managed by system
using('c:dbfilescont0', 'c:dbfilescont1')
改变数据库的排序序列
命令(在 Linux 和 UNIX 中):
create database SAMPLE on /mydbs collate using identity
或者,在 Windows 上:
create database SAMPLE on D: collate using identity
创建一个数据库,并逐字节地比较字符串,因为排序序列已经被设为 identity。
自动存储
什么是自动存储?
自动存储(automatic storage)是 DB2 V9 中的新特性,它允许为一个数据库指定一个或多个存储路径。当您创建表空间时,DB2 自动将表空间放在指定的存储路径上。在创建数据库时,可以为之启用或配置自动存储,命令如下:
db2 create database db_name automatic storage yes
db2 create database db_name on db_path1, db_path2
还可以使用 add storage 参数为设置了自动存储的数据库添加附加的存储路径,方法如下:
db2 alter database db_name add storage on db_path3
使用自动存储
一旦为数据库设置了自动存储,就可以使用这种机制来创建表空间。为数据库设置了自动存储后,您可以有多种方法来利用自动存储。您可以在数据库中创建一个表空间(在连接到数据库之后),如下所示:
db2 create tablespace ts_name
或者,您可以创建一个表空间,并指定它的初始大小和增长特征,如下所示:
db2 create tablespace ts_name
initialsize 10M
increasesize 10M
maxsize 100M
在这个例子中,表空间初始大小为 10MB,当表空间接近大小限制时,DB2 每次自动将表空间扩大 10MB,直到表空间达到 100MB 的最大值。
如果数据库没有设置自动存储,那么,如果您创建一个表空间并指定它的存储,则仍然可以为之使用自动存储:
db2 create tablespace ts_name
managed by automatic storage
使用模式
什么是模式?
模式(schema)是用于在数据库中创建的数据库对象的一个高级限定符。它是数据库对象,例如表、视图、索引或触发器的一个集合。它提供了数据库对象的一个逻辑分类。
除了将数据组织到表中外,将表和其他相关对象组织在一起同样能带来好处。为此,可以使用 create schema 命令来定义一个模式。关于模式的信息存储在您所连接的数据库的系统编目表中。当创建其他对象时,可以将它们放在这个模式中。
系统模式
对于每个数据库,都会创建一组系统模式,并将它们放在 SYSCATSPACE 表空间中:
SYSIBM 基本系统编目。不建议直接访问它。 SYSCAT 这种模式上的 SELECT 权限被授给 PUBLIC。只读编目视图。建议通过它来获得编目信息。 SYSSTAT 可更新编目视图 —— 会影响优化器。 SYSFUN 用户定义函数。
DB2 中如何使用模式?
使用模式来完全限定一个表或其他对象名,如下所示:
schemaname.tablename
您可以有多个具有相同名称、不同模式名称的表。因而,表 user1.staff 与表 user2.staff 是不同的。因此,您可以使用模式在 DB2 数据库中创建逻辑数据库。
为创建一个模式,可使用 create schema 命令。
谁可以使用模式?
当您可以创建一个模式时,就可以使用 authorization 关键字指定模式的所有者;否则,执行 create schema 语句的授权 ID 将成为模式的所有者。同时,还可以将模式上的特权授给用户或组。(要了解关于特权的更多信息,请参阅本系列的 第 1 部分。)
当有了一个模式时,模式的所有者可以将模式上的 CREATE_IN 特权授给其他用户或组。
在创建对象时指定模式
可以像下面这样显式地为一个对象指定模式名:
create table DWAINE.table1 (c1 int, c2 int)
如果用户 DWAINE 连接到数据库 SAMPLE,并发出以下语句:
create table t2 (c1 int)
这样将创建模式 DWAINE(只要用户 DWAINE 不撤销 IMPLICT_SCHEMA),同时还在数据库中创建表 t2。
用于连接到数据库的 ID 被称作授权 ID。
使用 DML 命令时指定模式
当在数据库对象上使用 DML 命令(例如 select、insert、update、delete)时:
可以在对象名上显式地指定对象的模式,例如 schema1.table1。
可以使用 set current schema 或 set current sqlid 命令指定对象的模式。
如果没有显式地指定对象的模式,那么对象的模式将被设为当前的授权 ID。
例如,如果用户 DWAINE 连接到数据库 SAMPLE 并发出以下语句:
select * from t2
如果这个表存在的话,则该语句将选择 DWAINE.T2。如果这个表不存在,那么将返回一个错误。
表空间状态
确定一个表空间的状态
为发现一个数据库中的表空间的状态,可以使用命令:
list tablespaces show detail
表空间状态
一个表空间可以有多种不同的状态,如下所示:
创建和维护不同的 DB2 对象
简介
本节讨论以下对象的作用和用法:
缓冲池
表空间
表和索引
视图
标识列
临时表
约束
触发器
缓冲池
数据库缓冲池区域是一块内存,当从磁盘上读取一个表的索引和数据页,以便对它们进行扫描或修改时,可以用缓冲池缓存它们。缓冲池区域有助于提高数据库系统的性能,因为它允许从内存,而不是磁盘上访问数据。由于内存访问比磁盘访问要快得多,因此 DB2 对磁盘读写得越少,系统的性能就越好。
当创建一个数据库时,会自动为该数据库创建一个默认的缓冲池。这个缓冲池名为 IBMDEFAULTBP,它的页宽为 4 KB,它的大小取决于操作系统。对于 Windows,默认缓冲池大小为 250 页或 1 MB;对于 UNIX,默认缓冲池大小为 1,000 页或 4 MB。默认缓冲池不能被删除,但是可以通过 alter bufferpool 命令改变它的大小。
创建一个缓冲池
create bufferpool 命令有一些选项,可用于指定以下方面:
缓冲池名称 指定缓冲池的名称。该名称不能用于任何其他缓冲池,也不能以字符 SYS 或 IBM 开头。 immediate 规定如果系统上有足够的内存,则立即创建缓冲池。如下所述,如果数据库共享内存中没有预留足够的空间来分配新的缓冲池,那么将返回一个警告,并且缓冲池的创建将被推迟(DEFERRED)。(immediate 是默认设置。) deferred 规定在下一次数据库被停止和重新启动时再创建缓冲池。 all dbpartitionnumbs 规定将缓冲池创建在数据库中的所有分区上。如果没有指定数据库分区组,那么这是默认设置。 database partition group 指定将在其中创建缓冲池的数据库分区组。缓冲池将被创建在被指定的分区组所包含的所有数据库分区上。 size 指定缓冲池的大小,并且以页为单位。在分区数据库中,对于存在缓冲池的所有数据库分区,这将是默认大小。 numblockpages 指定在缓冲池的基于块的区域中创建的数据页的数量。numblockpages 的实际值可能与指定的值不符,因为其大小必须是 blocksize 的倍数。缓冲池中基于块的区域不能超过缓冲池大小的 98%。如果将基于块的区域的大小指定为 0,则会禁用缓冲池的块 I/O。 blocksize 指定在缓冲池基于块的区域中的一个给定块中的数据页的数量。块的大小必须介于 2 页与 256 页之间。默认值是 32 页。 pagesize 指定缓冲池的页宽。默认页宽为 4 KB 或 4,096 字节。页宽可以按字节或千字节指定。 extended storage/not extended storage 指定是否将缓冲池中受到危害的页复制到被称作扩展存储(extended storage)的辅助缓存中。从扩展存储检索数据比从磁盘检索数据更为高效,但是不如从缓冲池检索数据高效,因此它不适用于 64 位环境。
定义好缓冲池的页宽和名称后,便不能更改它们。
示例 create bufferpool 语句
下面的语句:
create bufferpool BP1 size 25000
创建一个名为 BP1 的缓冲池,其大小为 100 MB(25,000 个 4 KB 的页面)。由于没有指定页宽,缓冲池使用默认的 4 KB 页宽。由于 IMMEDIATE 选项是默认的,因此只要有足够的可用内存来满足请求,就可以立即为缓冲池分配空间并使之可用。
下面的语句:
create bufferpool BP2 size 25000 pagesize 8 K
创建一个名为 BP2 的缓冲池,其大小为 200 MB (25,000 个 8 KB 的页面)。该缓冲池使用 8 KB 的页宽。由于 immediate 选项是默认的,因此只要有足够的可用内存来满足请求,就可以立即为缓冲池分配空间并使之可用。
下面的语句:
create bufferpool BP3 deferred size 1000000
创建一个名为 BP3 的缓冲池,其大小为 4 GB (1,000,000 个 4 KB 的页面)。由于没有指定页宽,缓冲池使用默认的 4 KB 页宽。由于指定了 deferred 选项,因此直到数据库被停止并重新启动时才会为该缓冲池分配空间。
创建表
为了在数据库中创建一个表,必须首先连接到该数据库。您还必须有实例中的 SYSADM 权限,或者数据库中的 DBADM 权限或 createtab 特权。
当创建一个表时,可以指定以下方面:
模式
表名
列定义
主/外键
用于数据、索引和大型对象的表空间
下面的图展示了一个例子。
在哪里创建表?
如果在创建一个表时没有使用 in 子句,那么将按以下顺序放置表数据(及其索引和 LOB 数据):
如果有 IBMDEFAULTGROUP 表空间,并且该表空间的页宽足够大,则放在这个表空间中。
放在一个用户创建的表空间中,该表空间具有能满足表的最小页宽。
如果有 USERSPACE1 表空间,并且该表空间的页宽足够大,则放在 USERSPACE1 中。
IN、INDEX IN 和 LONG IN 子句指定将在其中存储常规表数据、索引和大型对象的表空间。注意,这只适用于 DMS 表空间。
获取表信息
可以使用以下命令来获取表信息:
命令 | 描述 |
list tables | 列出用于当前用户的表 |
list tables for all | 列出数据库中定义的所有表 |
list tables for schema schemaname | 列出指定模式中的表 |
describe table tablename | 显示指定的表的结构 |
例如,下面的命令:
describe table department
产生以下输出:
索引
索引可以:
按升序或降序排列(默认情况下,如果没有指定,则按升序)。
是惟一的(unique)或非惟一(non-unique)的(默认情况下,如果没有指定,则为非惟一的)。
是复合的。
用于实施聚合。
是双向的 —— 这是由 allow 或 disallow reverse scans 控制的。
包括附加的列 —— 这只适用于惟一索引。
下面有一些 create unique 语句演示了这些选项:
create unique index itemno on albums (itemno) desc
create index clx1 on stock (shipdate) cluster allow reverse scans
create unique index incidx on stock (itemno) include (itemname)
create index item on stock (itemno) disallow reverse scans collect detailed statistics
标识列
标识列(identity column)是表中的一个数字列,它导致 DB2 为每个被插入表中的行生成一个惟一的数值。一个表最多只能有一个标识列。这个列的值可以通过 DB2 always 或 by default 两种方式生成:
如果这些值按 always 方式生成,则总是由 DB2 数据库生成这些值,应用程序不能提供显式的值。
如果这些值按 by default 方式生成,那么可以由应用程序显式地提供这些值;只有在应用程序没有提供值的情况下,才由 DB2 生成一个值。 因此,DB2 不能保证这些值是惟一的。该选项用于数据传播,或者装载和卸载一个表。
我们来看一个例子。假设用以下命令创建表:
create table inventory (partno INTEGER GENERATED ALWAYS AS IDENTITY
(START WITH 100 INCREMENT BY 1), description CHAR(20) )
并执行以下语句:
语句 | 结果 |
insert into inventory VALUES (DEFAULT,'door') | inserts 100,door |
那么语句 SELECT * FROM inventory 将产生如下输出:
100 door
101 hinge
102 frame
视图
视图是从一个或多个基本表、别名或视图中派生出来的,在检索数据时与基本表可以互换使用。当更改一个视图中的数据时,表本身中的数据也随之更改。通过创建视图,可以限制对敏感数据的访问,同时允许对其他数据的访问。
视图中的数据并不是存储在表之外的。换句话说,虽然视图的定义在系统编目中占用了空间,但是视图本身并不占用数据库中的空间。
视图的创建者至少需要拥有视图定义中引用的基本表上的 SELECT 特权。
关于所有已有视图的信息存储在:
SYSCAT.VIEWS
SYSCAT.VIEWDEP
SYSCAT.TABLES
下面的 create view 语句展示视图的工作原理:
create view DEPTSALARY AS SELECT DEPTNO, DEPTNAME, SUM(SALARY)
AS TOTALS FROM PAYROLL GROUP BY DEPTNO,DEPTNAME
create view EMPSALARY AS SELECT EMPNO, EMPNAME, SALARY FROM PAYROLL,
PERSONNEL WHERE EMPNO=EMPNUMB
with check option
with check option 指定以下约束,即通过一个视图插入或更新的每一行必须符合视图的定义。不符合视图定义的行就是不满足视图的搜索条件的行。
例如,考虑下面的命令:
create view emp_view2 (empno, empname, deptno) AS (SELECT id, name,
dept FROM employee WHERE dept = 10)with check option
当该视图被用于插入或更新新的值时,with check option 限制 dept 列的输入值。
约束
DB2 中有很多类型的约束:
参照完整性约束
惟一性约束
检查约束
信息约束
约束是不能直接修改的,必须先删除约束,然后用您想要的特征创建一个新的约束。
下面分别讨论每种约束。
参照完整性约束
在创建数据库,或创建数据库后使用 alter table 语句时,将定义参照完整性约束。
建立参照完整性的子句有:
primary key 子句
unique constraint 子句
foreign key 子句
references 子句
例如:
create table artists (artno INT, ... primary key (artno) foreign key dept (workdept)
references department on delete no action)
我们来看看各种不同的参照完整性规则。
插入规则:
有一条隐含的规则,即当被插入行的父行不存在时,不能插入。
删除规则:
限制:如果仍有从属的行,则父行不能删除。
级联:删除父表中的一行同时也会删除从属表中所有相关的行。
无动作(默认情况):在应用所有其他参照约束后,对于每个子行,都强制要求父行的存在。
设置 Null:外键字段设为 null;其他列保持不变。
更新规则:
限制: 如果从属表中的一行与键的初值相匹配,那么对父键的更新将被拒绝。
无动作(默认情况):如果在从属表中没有匹配的行,那么对父键的更新将被拒绝。
惟一性约束
惟一性约束可以用作一个外键约束的主键,就像显式声明的主键一样。这允许将 RI 约束(请参阅 参照完整性约束)放在同一个表中的不同列上。
惟一性约束迫使列中的值是惟一的;列不能包含 null 值。
检查约束
检查约束用于强制实施表级的数据完整性。它迫使表中的值符合约束。随后所有的插入和更新都必须遵从表上定义的约束,否则该语句将失败。
如果表中已有的行不满足约束,则不能定义该约束。为了加快添加大量数据时的速度,可以关闭约束检查,但是表将处在 CHECK PENDING 状态。
信息约束
信息约束是可以由优化器使用的规则,但不是在运行时实施。对于插入、更新或删除操作,其他约束可能导致额外的开销,因此,如果应用程序已经对数据进行了验证,那么使用信息约束也许是更好的方案。
信息约束可以是:
ENFORCED:该约束由数据库管理器在常规操作(例如插入、更新或删除)期间实施。
NOT ENFORCED:如果使用该约束,当表中任何数据违反该约束时,DB2 可能返回错误的结果。
ENABLE QUERY OPTIMIZATION:在适当环境下,该约束可用于查询优化。
DISABLE QUERY OPTIMIZATION:该约束不能用于查询优化。
触发器
触发器(trigger)定义一组动作,这组动作由指定的基本表上的一个动作激活或触发。被触发的动作可能导致对数据库的其他更改,或产生一个异常。触发器可以在插入、更新或删除之前 或之后 触发。
触发器用于:
验证,这类似于约束,但是更为灵活。
调节,允许将新的数据修改或调整为一个预定义的值。
完整性,类似于参照完整性,但是更为灵活。
DB2 存储三角形
存储三角形
在一个 DB2 数据库中,数据和索引的存储是在四个不同级别上定义和控制的。为了支持分区数据库,其中有一个名为分区组(partition groups)的抽象层。分区组是由一个数据库中的一个或多个数据库分区组成的组或集合。当创建一个表空间时,它被指定到一个分区组,并且只能创建在该分区组所包含的那些数据库分区上。每个表空间必须有一个或多个为表空间定义物理存储的容器。容器可以是一个操作系统目录、具有预定大小的文件、未格式化的硬盘之类的原始设备、硬盘上的一个分区或者一个逻辑卷。
表空间
表空间 是一个逻辑实体,用于定义表和索引将被存储在数据库中的什么地方。由于所有 DB2 表和索引都放在表空间中,因此可以在物理上完全控制将表和索引数据存储在哪里。
一个表空间可以使用一个或多个称作容器 的底层物理存储设备来创建。通过表空间,就可以创建在任何物理环境中都能提供最佳性能的物理数据库设计。
要获得关于一个数据库中的表空间的详细信息,可使用以下命令:
get snapshot for tablespaces
list tablespaces
SMS 表空间
简介
系统管理的空间(System Managed Space,SMS)表空间使用操作系统提供的文件系统管理器来分配和管理用于存储表的空间。在 SMS 表空间中,每个容器就是一个操作系统目录,在这个目录中,表对象被创建为文件。当创建一个 SMS 表空间时,用户必须指定用于每个容器的目录的名称。DB2 将在表空间中使用的这些目录中创建表,并且对于每个对象,都使用惟一的文件名。
如果一个表空间是使用多个容器创建的,那么 DB2 将平衡被写到这些容器的数据的数量。由于在 SMS 表空间创建好之后,不能动态地为之添加容器,因此应该知道表空间的大小需求,并且在创建表空间时创建所有必需的容器。
SMS 表空间的特征
对于 SMS 表空间:
所有数据和索引共享相同的表空间。
表空间中的每个表都有其自己的文件名,供所有容器使用。文件扩展名表明存储在文件中的数据的类型。
文件可能动态增长,根据容器的数量、操作系统对文件系统大小的限制以及操作系统对各个文件大小的限制,这种增长有一个上限。
当一个容器中的所有空间都已分配出去时,即使其他容器中还有空间,也仍然认为表空间已满。
新的容器只能被添加到还没有任何容器的分区上的 SMS 中。
在 Linux 或 UNIX 上,文件系统的大小可能会增长。
SMS 表空间非常容易管理,对于 TEMP 表空间,建议使用 SMS 表空间。
创建 SMS 表空间
为了创建一个 SMS 表空间,可使用下面的命令:
create table space TS1 managed by system using ('path1', 'path2', 'path3')
当为一个 SMS 容器指定路径时,它可以是绝对路径,也可以是相对路径。如果该目录不存在,DB2 将创建它。如果该目录已经存在,那么它不能包含任何文件或子目录。例如,命令:
create table space ts1 managed by system using ('D:DIR1')
指定目录的绝对路径。如果该目录不存在,则 DB2 将在数据库服务器的 D: 盘上创建 DIR1 目录。
命令:
create tablespace ts2 managed by system using ('DIR1')
指定相对路径 DIR1。DB2 将在数据库主目录下创建 DIR1 目录。
下面的 SQL 语句用三个不同驱动器或文件系统上的三个容器创建一个 SMS 表空间。注意,两条语句中的表空间名称是一样的,这是因为这个例子要展示 UNIX/Linux 与 Windows 表空间定义之间的不同。
create tablespace smstbspc managed by system
using ('d:tbspc1', 'e:tbspc2', 'f: tbspc3')
create tablespace smstbspc managed by system
using ('/dbase/container1', '/dbase/container2', '/dbase/container3')
修改 SMS 表空间
对 SMS 表空间的修改只能更改预取(prefetch)大小。不能 使用 alter 命令将容器添加到 SMS 表空间。然而,在重定向恢复期间,可以预定义、添加或删除容器。
多维聚合(MDC)
MDC 简介
多维聚合(MDC)允许在物理上同时在多个键或维上将一个表聚合。在 Version 8 之前,DB2 只支持使用聚合索引的单维数据聚合。当在一个表上定义一个聚合索引时,在将记录插入表中或者更新表中的记录时,DB2 试图根据聚合索引的键顺序维护数据在页上的物理顺序。对于那些具有包含聚合索引的键的谓词的查询,这样可以大大提高性能,因为有了良好的聚合之后,就只需要访问物理表的一部分。当页面按顺序存储在磁盘上时,预取的性能会更高。
有了 MDC,相同的优点被扩展到多个维或聚合键上。在查询性能方面,涉及表中一个或多个指定维的范围查询将从底层的聚合获得好处。这些查询只需要访问那些包含具有指定维值的记录的页,符合条件的页将组合在一起。
随着时间的推移,当表中的可用空间被填满时,具有聚合索引的表可能变为非聚合的。然而,一个 MDC 表可以自动、连续地在指定维上维护它的聚合,而不必通过重组表来恢复数据的物理顺序。
当创建一个 MDC 表时,会指定用于顺着它们来聚合表数据的维键。每个指定的维可以用一个或多个列来定义,这一点与索引键相同。对于每个指定的维,会自动创建一个维块索引,该块索引将用于快速、有效地沿着每个指定的维访问数据。此外,还会自动创建一个包含所有维键的块索引。块索引将用于维护插入和更新活动期间的数据聚合,以及用于对数据进行快速有效的访问。
表的维值的每一种惟一的组合都形成了一个逻辑单元,逻辑单元在物理上由一些页块组成,每个页块是磁盘上的一组连续的页。有一些页包含的数据在某个维块索引上具有相同键值,包含这些页的一组块称作一个切片(slice)。表的每个页只存储在一个块中,表的所有块由相同数量的页组成,即所谓的分块因子(blocking factor)。 分块因子与表空间的盘区大小相等,因此块边界与盘区边界成线形关系。
创建 MDC 表
为了创建一个 MDC 表,需要使用 organize by 参数指定表的维,如下所示:
CREATE TABLE MDCTABLE(
Year INT,
Nation CHAR(25),
Colour VARCHAR(10),
... )
ORGANIZE BY(Year, Nation, Color)
在这个例子中,这个表将按 year、nation 和 color 这几个维来组织,逻辑上看起来如下图所示。
您不能将一个表改成 MDC 表,所以在创建数据库之前,应该尽可能使用 design advisor,看看您的表应该是 MDC 表还是普通的表。
MDC 考虑
以下列表总结了对 MDC 表在设计上的考虑。
在确定候选维的时候,应寻找那些不是太细粒度的属性,以允许在每个单元中存储更多的行。这种方法将更好地使用块级索引。
更高的数据量将提高填充密度。
如果只是用于分析,那么首先将数据装载为非 MDC 会比较有用。
表空间盘区大小对于有效的空间使用是一个关键的参数。
虽然 MDC 表可能要求一开始对数据有更多的理解,但是获得的回报是查询时间有望缩短。
有些数据可能不适合于 MDC 表,而使用标准聚合索引则可能更好。
虽然更小的盘区大小可以提高对磁盘空间的使用效率,但是应该考虑查询的 I/O。
更大的盘区通常会减少 I/O 成本,因为每次可以读取更多的数据。反过来,这样又会导致更小的维块索引,因为每个维值将需要更少的块。而且,插入操作将变得更快,因为对新块的需要更少了。
表(范围)分区
表分区简介
DB2 v8.2(及之前版本)的一些技术允许将数据拆分成更小的 “块(chunk)”,以获得更大的查询并行度,消除查询中出现的分区,并帮助提高性能。如前一节所讨论的,MDC 允许 DB2 安排磁盘上的数据,使具有相同维列值的行在块(一组页)中存储在一起。通过使用这种技术,用于搜索具有特定维值的行的查询将导致所有其他分区排除在扫描之外,只有符合条件的行才会被访问。
类似地,数据库分区特性可以拆分一组表,使得一部分数据存放在一个数据分区上。数据库分区可以处于不同的服务器上,这样一来,大型的扫描可以使用多个服务器的处理能力。
DB2 V9 还引入了一种新形式的分区,这种形式在 DB2 for z/OS 以及其他数据服务器供应商的产品中很常见。该特性被称为表分区(table partitioning),它允许将单个表扩展到多个表空间上。
这种新的分区功能有很多优点,包括创建表的语法更简单。下面是一个简化的语法,它创建一个分区表,用于将 24 个月的数据存储在 4 个表空间上的 24 个分区中:
CREATE TABLE fact
(txn_id char(7), purchase_date date, ...)
IN tbsp1, tbsp2, tbsp3, tbsp4
PARTITION BY RANGE (purchase_date)
(
STARTING FROM ('2005-01-01')
ENDING ('2006-12-31')
EVERY 1 MONTH
)
表分区语法
表的创建语法有短的形式,也是长的形式。在深入探讨语法之前,我们先来谈谈分区列。表分区允许指定数据的范围,每个范围归入到一个单独的分区。分区列(一列或多列)就是定义这些范围的。一个分区列可以是 LOBs 和 LONG VARCHAR 列之外的任何 DB2 基本数据类型。您还可以指定多个列(后面有一个例子),如果您想模拟一个函数上的分区,那么可以指定生成的列。
下面是短的形式:CREATE TABLE t1(c1 INT)
IN tbsp1, tbsp2, tbsp3
PARTITION BY RANGE(c1)
(STARTING FROM (0) ENDING (80) EVERY (10))
下面是长的形式,其结果与前面短形式的结果相同:CREATE TABLE t1(c1 INT)
PARTITION BY RANGE(c1)
(STARTING FROM (0) ENDING (10) IN tbsp1,
ENDING (20) IN tbsp2,
ENDING (30) IN tbsp3,
ENDING (40) IN tbsp1,
ENDING (50) IN tbsp2,
ENDING (60) IN tbsp3,
ENDING (70) IN tbsp1,
ENDING (80) IN tbsp2)
快速添加或删除数据范围
另一个优点是,当您分离(detach)一个分区时,可以得到一个独立的表,这个表包含了那个分区的内容。您可以将一个分区从一个表中分离出来,然后对那个新分离出来的分区做一些处理,新分离出来的分区现在实际上是一个物理表。例如,您可以归档那个表,将它移动到第三存储,将它复制到另一个位置,或者做您想做的任何事情。DB2 V9 将异步地清除那个分区表上的任何索引键,而不影响正在运行的应用程序。
与添加一个新分区类似,您只需以和分区表相同的定义创建一个表,为之装入数据,然后将那个分区附加(attach)到主分区表上,如下所示: ALTER TABLE FACT_TABLE ATTACH PARTITION
STARTING '06-01-2006'
ENDING '06-30-2006'
FROM TABLE FACT_NEW_MONTH
表压缩
表压缩简介
行压缩的方法是查看整个表,找到重复的字节字符串,将那些字符串存储在一个字典中,然后用一个表示存储在字典中的实际数据的符号代替出现在表中的那些符号。其主要优点是,DB2 看到的是表中的所有数据以及完整的数据行 —— 而不只是重复的列值。例如,如果在一个列中有一个重复的子字符串,那么可以对它进行压缩。如果多个列中存在重复的字符串(例如城市、州),那么也可以将其压缩成一个单独的符号。
使用表压缩
要使用表压缩,首先必须对表进行设置,使之可以被压缩,然后必须生成字典,字典中包含表中出现的重复的字符串。要将表设置成可以被压缩,可以使用以下命令之一:
create table table_name ... compress yes
或
alter table tablename compress yes
创建压缩字典
创建压缩字典可以使表能够被压缩。DB2 需要扫描表中的数据,发现表中出现的可以压缩的重复字符串,并将其放入字典中。为此,可以使用 reorg 命令。第一次压缩一个表(或者您想重建压缩字典)时,必须运行命令:
reorg table table_name resetdictionary
该命令将扫描表,创建字典,然后执行实际的表重组,从而压缩数据。此后,每当插入数据到表中或者为表装载数据时,都将遵从这个压缩字典,并压缩所有新的数据。如果将来您想运行一次常规的表重组,但是不想重建这个字典,那么可以运行命令:
reorg table table_name keepdictionary
每个表都有它自己的字典,这意味着对于每个分区,分区表都有一个单独的字典。这样很有好处,因为当卷入新的分区时,DB2 能够适应数据的变化。
估计节省的空间
如果您只是想看看能节省多少空间,而不想真正对表进行压缩,那么也行。现在,DB2 INSPECT 命令有一个选项,通过该选项可以报告您决定压缩一个给定的表时可以节省的页数。语法如下:
db2 inspect rowcompestimate table name table_name results keep file_name
然后可以运行命令:
db2inspf file_name
output_file_name
将二进制输出文件转换成一个名为 output_file_name 的文本文件。该文件包含估计通过压缩可以节省的数据页的百分比。
对一个新表进行表压缩的步骤
如果从一个新的系统开始,那么可能需要:
用 compression yes 创建表。
将示例数据装载到表中。
用 resetdictionary 重组表,以创建一个新的字典。
将剩下的数据装载到表中(这次的装载将遵从上述字典,并在装载的同时进行压缩)。
XML
DB2 中的 XML 简介
较长一段时间以来,您已经可以将 XML 数据存储在 DB2 中。当然,您可以将对象存储为 CLOB,有了 XML extender 之后,还可以将文档分割(shred)成关系表,以便通过查询有效地访问 XML 文档的子部分。但是每种方法都有其缺点。分割文档会使文档的保真性受到损失,并且难于更改 XML 模式。XML 的最大优点是模式非常灵活,所以将 XML 文档分割到关系中,使得 XML 模式受到禁锢,这种做法将适得其反。通过 CLOB 可以保持灵活性,但是每当需要读取 XML 的一部分时,都需要在运行时解析 CLOB,所以性能很糟糕。
DB2 V9 引入了一种全新的 XML 存储引擎,在这个引擎中,XML 数据是分层存储的。XML 在本质上就是分层的,所以将 XML 分层地存储在引擎中,可以保持文档的保真性,保留灵活的模式,而且能取得较高的对子文档的访问性能。这种新的分层存储引擎和关系引擎位于相同的 DB2 数据服务器中,因此现在可以将客户信息与客户的 XML 购物订单存储在一起,从而有效地搜索所有信息。
DB2 中的 XML 列
XML 以分层的格式存储在 DB2 中。XML 本身就是分层的,它从根标记(节点)开始,经历整个 XML 字符串(或文档)。在 DB2 中,XML 按照这种分层结构存储在数据页中。如果 XML 数据大于单个数据页的容量,那么 XML 树被拆分成一些子树,每个子树存储在一个数据页中,各个页之间链接起来。
为了创建一个带 XML 数据的表,只需运行命令:
create table table_name (col1 data_type, ..., xml_col_name XML)
这样就可以创建包含您想要的关系列的表,对于 XML 信息,只需为列指定一种 XML 的数据类型。现在您可以将 XML 数据存储在那个列中。
XML 索引
创建 XML 索引与在关系数据上创建一个普通的索引类似,不同的是,您不是在一个列 上创建索引,而是在前面 xml_column_name 列中定义的 XML 模式的一个组件上创建索引。其语法如下:
create index index_name on table_name (xml_column_name)
generate key using xmlpattern '/po/purchaser/@pname' as sql varchar(50)
结束语
在本教程中,我们讨论了:
创建数据库
使用模式
不同的表空间状态
创建和操纵 DB2 对象
创建 SMS 表空间和它们的特征
DB2 自动存储的特征和用法
实现表分区和 MDC
使用表压缩
使用 XML
现在您已经掌握了 DBA 认证考试的数据放置部分。祝您好运!
- ››db2 对float类型取char后显示科学计数法
- ››DB2中出现SQL1032N错误现象时的解决办法
- ››DB2 锁升级示例
- ››数据库对象——存储过程
- ››db2诊断系列之---定位锁等待问题
- ››数据库设计词汇对照表
- ››db2 命令选项解释
- ››管理/var/spool/clientmqueue/下的大文件
- ››数据库大型应用解决方案总结
- ››DB2 最佳实践: 使用 DB2 pureXML 管理 XML 数据的...
- ››DB2 9.5 SQL Procedure Developer 认证考试 735 准...
- ››DB2 9.5 SQL Procedure Developer 认证考试 735 准...
更多精彩
赞助商链接