如何综合掌握 DB2 和 Informix
2007-10-01 22:15:20 来源:WEB开发网数据库创建和存储模型
在 DB2 中,可以使用数据库创建命令或使用控制中心工具创建数据库。本文将介绍如何使用命令创建数据库和数据库对象。在探讨这些命令之前,先来了解一下什么是表空间。
表空间
表空间是一个包含表、索引、大对象和长数据的存储结构。表空间谓语数据库内。它允许您直接将数据库和表数据的位置分配到容器上。(一个容器可以是一个目录名、一个设备名或一个文件名。)这种机制可以提供改善的性能和更加灵活的配置。一个数据库可以具有多于一个的表空间,而一个表空间不能同时属于多个数据库。
表空间管理
在 DB2 中,可以有两种不同的方式管理表空间:, table spaces are managed in two different ways:
- 系统管理的空间(SMS):SMS 表空间由操作系统进行管理。容器被定义成常规操作系统文件,并且是通过操作系统调用访问的。这意味着所有的常规操作系统功能将处理以下内容:操作系统将缓冲 I/O;根据操作系统约定分配空间;如有必要就自动扩展表空间。但是,不能从 SMS 表空间删除容器,并且仅限于将新的容器添加到分区的数据库。前一节中所说明的那三个缺省表空间都是 SMS。
- 数据库管理的空间(DMS):DMS 表空间是由 DB2 管理的。可以将容器定义成文件(在创建表空间时将把给定的大小全部分配给它们)或设备。分配方法和操作系统允许多少 I/O,DB2 就可以管理多少 I/O。可以通过使用
ALTER TABLESPACE
命令来扩展容器。还可以释放未使用的那部分 DMS 容器(从 Version 8 开始)。 当创建数据库时,将创建三个表空间(SYSCATSPACE、TEMPSPACE1 和 USERSPACE1)。
根据表空间的用途和管理方式将它们分类。根据用途有五种不同的表空间:
- 目录表空间:每个数据库只有一个目录表空间,它是在发出
CREATE DATABASE
命令时创建的。目录表空间被 DB2 命名为 SYSCATSPACE,它保存了系统目录表。总是在创建数据库时创建该表空间。 - 常规表空间:常规表空间保存表数据和索引。它还可以保存诸如大对象(Large Object,LOB)之类的长数据,除非这些数据显式地存储在长表空间中。如果某些表空间是数据库管理的空间(Database Managed Space,DMS),则可以将表及其索引分别放到单独的常规表空间中。我们将在本文后面定义 DMS 和系统管理的空间(System Managed Space,SMS)之间的区别。每个数据库中必须至少有一个常规表空间。创建数据库时指定该表空间的默认名为 USERSPACE1。
- 长表空间: 长表空间用于存储长型或 LOB 表列,它们必须驻留在 DMS 表空间中。它们还可以存储结构化类型的列或索引数据。如果没有定义长表空间,那么将把 LOB 存储在常规表空间中。长表空间是可选的,缺省情况不会创建长表空间。
- 系统临时表空间: 系统临时表空间用于存储执行 SQL 操作(比如排序、重组表、创建索引和连接表)期间所需的内部临时数据。每个数据库必须至少有一个系统临时表空间。随数据库创建的系统临时表空间的默认名为 TEMPSPACE1。
- 用户临时表空间: 用户临时表空间存储已声明的全局临时表。创建数据库时不存在用户临时表空间。至少应当创建一个用户临时表空间以允许定义已声明的临时表。用户临时表空间是可选的,默认情况下不会创建用户临时表空间。
图 8 显示了一个具有五个表空间的数据库:一个目录表空间、两个常规表空间、一个长表空间和一个系统临时表空间。没有创建用户临时表空间。其中有 8 个容器。
图 8. 具有表空间和缓冲池的 DB2 数据库
可使用以下命令创建此类数据库和表空间。
create database sampleconnect to samplecreate bufferpool BP1 size 1000 pagesize 4 Kcreate bufferpool BP2 size 1000 pagesize 8 Kcreate bufferpool BP3 size 1000 pagesize 32 Kcreate regular tablespace userspace1 pagesize 8 k managed by databaseusing (file 'C1U1' 1000, file 'C2U1' 1000) bufferpool BP2 create regular tablespace userspace2 pagesize 4 k managed by databaseusing (file 'C1U2' 1000) bufferpool BP1 create large tablespace largespace1 pagesize 32 k managed by databaseusing (file 'C1L1' 1000, file 'C2L1' 1000, file 'C3L1' 1000) bufferpool BP3create temporary tablespace systemp1 pagesize 32 k managed by system using (path '/db1/C1T1') bufferpool BP3 |
使用上面这组命令将创建缓冲池和表空间。现在来看一下 DB2 中的容器和缓冲池是什么。
容器
每个表空间都有一个或多个容器。重申一次,您可以认为容器是孩子,而表空间是其父母。每个容器只能属于一个表空间,但是一个表空间可以拥有许多容器。可以将容器添加到 DMS 表空间,或者从 DMS 表空间中删除容器,而且可以更改容器的大小。只能将容器添加到某个分区中分区数据库上的 SMS 表空间,在添加之前该分区还未给表空间分配容器。添加新的容器时,将启动一个自动的重新均衡操作以便将数据分布到所有容器上。要了解更多关于容器和重新均衡操作的内容,请参考 DB2 9 Information Center。缓冲池
一个缓冲池是与单个数据库相关联的,可以被多个表空间使用。当考虑将缓冲池用于一个或多个表空间时,必须保证表空间页大小和缓冲池页面大小对于缓冲池所 “服务” 的所有表空间而言都是一样的。一个表空间只能使用一个缓冲池。创建数据库时,会创建一个名为 IBMDEFAULTBP 的默认缓冲池,所有的表空间都共享该缓冲池。可以使用CREATE BUFFERPOOL
语句添加更多的缓冲池。大型缓冲池还会对查询优化产生影响,因为更多的工作可在内存中完成。要了解更多关于缓冲池的内容,请参考 DB2 9 Information Center。 IDS 中的数据库创建
现在您已经了解了 DB2 中数据库是如何创建的以及 如何对表空间进行管理,现在来看一下在 IDS 中 dbspaces 和数据库是如何彼此相关的。
dbspaces
dbspace 是由一个或多个块组成的逻辑单元。Chunk 表示存储的物理单元。数据库服务器可以使用成熟的(cooked)文件或原始(raw)设备来存储数据。数据库是被创建在常规 dbspace 中的,因此在创建数据库之前必须已经存在一个常规 dbspace。默认的常规 dbspace 称为 rootdbs,它是在创建 IDS 实例时被创建的。除非 create database
命令中说明要使用另一个常规 dbspace,否则将使用默认 dbspace 创建数据库。系统目录表和数据库本身位于同一个 dbspace 中。同一个 Informix 实例中的任何其他数据库都可以使用所有的 dbspace。IDS 具有大量的 dbspace,下面将做简要介绍。
- 常规 dbspace: 常规 dbspace 用来存放数据库对象,如系统目录表、用户表和索引。
- 临时 dbspace:临时 dbspace 属于常规 dbspace,数据库服务器在存储临时表时将使用到它。当使用临时 Blobspace 时,数据库服务器并不记录日志。由于这样做减少了 I/O 和检查点操作因而改善了数据库性能。
- Blobspaces: blobspace 是由一个或多个块组成的逻辑单元。blobspace 用来存储文本和字节数据。数据库服务器将存储在 blobspace 中的数据直接写入到磁盘。不会对 blobspace 对象记录日志。
- Sbspaces: sbspace 是由一个或多个块组成的逻辑单元。sbspace 用来存储智能大对象。智能大对象由字符大对象(CLOBs)和二进制大对象(BLOBs)数据类型组成。可以对存储在 sbspace 中的数据库对象记录日志。使用 Informix API(一个应用程序)可以存储或检索存储在 sbspace 中的智能 LOB。
- Extspaces: extspace 是与一个字符串相关联的逻辑名称,该字符串表示外部数据的位置。在对数据库进行开发时(扩展 IDS 的功能)将用到 extspace。可以使用相应的用户定义的访问方法来访问 extspace 中的内容。
举例来说,如果运行下面的数据定义语言(data definition language,DDL),首先会创建 2 GB 大小的 dbspace Dbdbspace
,然后在 dbspace Dbdbspace
中创建数据库 sampledb
。sampledb 的数据库目录表位于 Dbdbspace 中。
Onspaces -c -d Dbdbspace -p /work/database/chunk1 -o 0 -s 20480000 where,c For Creating Dbspacep path name for the physical unito offset in K bytess size of dbspace in Kbytesa for adding chunk to a dbspaceCreate database sampledb in Dbdbspace; |
图 9. 具有 Dbspace 和块的 IDS 数据库
如图 9 所示,数据库中的所有数据库对象可以被存储在一些 dbspace 中。这个例子具有一个默认的 Root Dbspace、三个称为 Root Dbspace 的常规 dbspace、User Dbspace、Index Dbspace、一个 Temporary Dbspace、一个 Blobspace、一个智能 LOB sbspace 和一个 extspace。上面这个例子中 Database 1 中的数据库对象跨越了所有可用的 dbspace。表和索引可以驻留在不同的 dbspace 中。为了更好地理解,一个常规 dbspace 被命名为 Index Dbspace,您可以选择在这个 dbspace 中创建索引。您还可以选择在根 dbspace 中创建数据库(尽管这不是一个很好的应用)。在图 9 中,Database 2 驻留在 Root Dbspace 中。
下面的代码将向 userDbSpace 添加一个块: Onspaces -a -d UserdbSpace -p /work/database/chunk3 -o 0 -s 4096000
. 关于 dbspaces 和向 dbspaces 添加块(chunk)的更多信息,请参见 IDS v10.0 Information Center。
更多精彩
赞助商链接