3.1.3 创建数据库(3)
如果省略任何关键字,DB2将使用默认值来生成表空间。表空间定义采用这些选项,其语法如下:
- |--MANAGED BY--------------------------------------------------->
- |>--+-SYSTEM USING--(----'container-string'-+--)--------------------------------+-->
- '-DATABASE USING--(----+-FILE---+--'container-string' --number-of-pages-+--)-' '-DEVICE-'
- >--+-----------------------------+------------------------------>
- '-EXTENTSIZE--number-of-pages-'
- >--+-------------------------------+---------------------------->
- '-PREFETCHSIZE--number-of-pages-'
注意,上面的语法不包括与自动存储数据库相关联的选项。
我们来详细看看这个语法。MANAGED BY选项让DB2生成这些表空间并决定如何管理空间。SMS表空间使用SYSTEM USING关键字,如下所示:
- SYSTEM USING ('container string')
对于SMS表空间,容器字符串(container string)标识一个或多个将属于这个表空间的容器,表空间数据将存储在这些容器中。每个容器字符串可以是绝对的或相对的目录名。如果目录名不是绝对的,它就相对于数据库目录。如果目录的任何部分不存在,数据库管理程序就会创建这个目录。容器字符串的格式取决于操作系统。
使用DATABASE USING关键字定义DMS表空间:
- DATABASE USING ( FILE/DEVICE 'container string' number of pages|K|M|G )
对于DMS表空间,容器字符串标识一个或多个将属于这个表空间的容器,表空间数据将存储在这些容器中。指定容器的类型(FILE或DEVICE)和大小(按照PAGESIZE大小的页面)。大小还可以指定为一个整数,后面跟着K(表示千字节)、M(表示兆字节)或G(表示千兆字节)。可以混合指定FILE和DEVICE容器。
对于FILE容器,容器字符串必须是绝对或相对的文件名。如果文件名不是绝对的,它就相对于数据库目录。如果目录名的任何部分不存在,数据库管理程序就会创建这个目录。如果文件不存在,数据库管理程序就会创建这个文件并初始化为指定的大小。对于DEVICE容器,容器字符串必须是设备名而且这个设备必须已经存在,对于DEVICE容器通常需要使用操作系统root权限创建逻辑卷并且赋予DB2实例使用的权限,一般通过UNIX/Linux的chown命令实现这一点。
重要提示:所有容器必须在所有数据库上是唯一的;一个容器只能属于一个表空间。
- EXTENTSIZE number of pages
EXTENTSIZE指定数据库可以写到一个容器中的PAGESIZE页面数量,达到这个数量之后将跳到下一个容器。EXTENTSIZE值还可以指定为一个整数,后面跟着K、M或G。数据库管理程序在存储数据时重复地循环使用各个容器。EXTENTSIZE大小是在表空间级定义的。一旦为表空间指定了扩展数据块大小,就不能改变了。数据库配置参数 DFT_EXTENT_SZ指定数据库中所有表空间的默认扩展数据块大小。这个值的范围是2到256个页面;因此,绝对大小是从8KB到1024KB(对于4KB页面),或者从16 KB到2048KB(对于8KB页面)。可以在CREATE TABLESPACE语句中使用EXTENTSIZE参数覆盖这个数字。
- PREFETCHSIZE number of pages
PREFETCHSIZE指定在执行数据预获取时将从表空间中读取的PAGESIZE页面数量。连续的预读取是指数据库管理程序能够提前预测查询,在实际引用页面之前读取这些页面。这样查询就不需要等待底层操作系统执行I/O操作。这种异步的检索可以显著减少执行时间。可以通过修改CREATE TABLESPACE语句中的PREFETCHSIZE参数来控制执行预获取的积极程度。在默认情况下,这个值设置为DFT_PREFETCH_SZ数据库配置参数。这个值代表在DB2触发预读取请求时每次读取多少个页面。通过将这个值设置为扩展数据块大小的倍数,可以并行地读取多个扩展数据块。当表空间的容器在不同的硬盘上时,这个功能甚至效率更高。预读取大小还可以指定为一个整数,后面跟着K、M或G。
关于PREFETCHSIZE的设置,我们在后面表空间性能小节还会详细讲解。
CREATE DATABASE命令示例
下面是一个CREATE DATABASE命令的示例,它使用了前面讨论的许多选项。
- CREATE DATABASE MYDB
- DFT_EXTENT_SZ 4
- CATALOG TABLESPACE MANAGED BY DATABASE USING
- (FILE 'C:\DB2DATA\CATALOG.DAT' 2000, FILE 'D:\DB2DATA\CATALOG.DAT' 2000)
- EXTENTSIZE 8
- PREFETCHSIZE 16
- TEMPORARY TABLESPACE MANAGED BY SYSTEM USING
- ('C:\TEMPTS','D:\TEMPTS')
- USER TABLESPACE MANAGED BY DATABASE USING
- (FILE 'C:\TS\USERTS.DAT' 1200)
- EXTENTSIZE 24
- PREFETCHSIZE 48
我们来详细地看看每一行:
CREATE DATABASE:这个语句定义要创建的数据库的名称。
DFT_EXTENT_SZ 4:这个参数告诉DB2默认的扩展数据块大小是4个页面,除非在创建表空间时显式地声明,否则默认使用这个值。
CATALOG TABLEPSACE MANAGED BY DATABASE USING:DB2编目空间将由数据库管理。
FILE 'C:\....':表空间的位置将跨两个文件,每个文件有2000个页面的空间。
EXTENTSIZE 8:EXTENTSIZE是8个页面。这个设置会覆盖DFT_EXTENT_SZ。
PREFETCHSIZE 16:在查询处理期间,同时预读取16个页面。
TEMPORARY TABLESPACE MANAGED BY SYSTEM USING:DB2使用的临时空间将由操作系统处理。
'C:\TEMPTS' ...:临时空间将跨两个文件,文件的大小在DB2执行期间自动地调整。
USER TABLESPACE MANAGED BY DATABASE USING:用户表空间(放置真正的表的地方)将由DB2直接管理。
FILE 'C:\TS\...':这个空间只有一个容器,它由1200个页面组成。
EXTENTSIZE 24:USER表空间的EXTENTSIZE是24个页面。
PREFETCHSIZE 48:查询处理期间,同时预读取48个页面。
上面我们介绍了关于如何创建DB2数据库的背景知识。在大多数情况下,CREATE DATABASE命令的默认值提供了一个可以满足开发和测试需要的数据库。一旦决定将数据库转入生产环境,就需要对DB2使用的数据布局和表空间定义付出更大的努力。尽管这需要做更多的规划工作,但是产生的数据库更容易管理,性能也可能更好。关于这部分内容我们会在3.2节中详细讲解。