我们在创建DMS表空间容器时可以选择使用裸设备或文件系统,下面我们来看看两者的区别。我们知道,内存的读写效率比磁盘高近万倍,因此数据库通常会在内存中开辟一片区域,称为Buffer Pool,使数据的读写尽量在这部分内存中完成。同样地,在文件系统中,操作系统为了提高读写效率,也会为文件系统开辟一块Buffer用于读写数据的缓存。这样,数据库中的数据会被缓存两次。为了避免操作系统的这次缓存,我们可以采用裸设备作为数据文件的存储设备。裸设备,也称为裸分区(Raw Partiton),是一个没有被加载(Mount)到操作系统的文件系统上的磁盘分区,它通过字符设备驱动来访问。裸设备的I/O读写不由操作系统控制,而是由应用程序(如数据库)直接控制。
裸设备的优点:
由于屏蔽了文件系统缓冲器而进行直接读写,从而具有更好的性能。对硬盘的直接读写就意味着取消了硬盘与文件系统的同步需求。这一点对于纯OLTP系统非常有用,因为在这种系统中,读写的随机性非常大以至于一旦数据被读写之后,它们在今后较长的一段时间内不会得到再次使用。除了OLTP,裸设备还能够从以下几个方面改善DSS(决策支持系统)应用程序的性能:
排序:对于DSS环境中大量存在的排序需求,裸设备所提供的直接写功能也非常有用,因为对临时表空间的写动作速度更快。
顺序访问:裸设备非常适合于顺序I/O动作。同样地,DSS中常见的顺序I/O(表/索引的全表扫描)使得裸设备更加适用于这种应用程序。
直接读写,不需要经过操作系统级的缓存。节约了内存资源,在一定程度上避免了内存的竞争。
避免了操作系统的cache预读功能,减少了I/O。
采用裸设备避免了文件系统的开销。比如维护I-node、空闲块等。
裸设备的缺点:
裸设备的空间大小管理不灵活。在放置裸设备的时候,需要预先规划好裸设备上的空间使用。还应当保留一部分裸设备以应付突发情况。这也是对空间的浪费。
需要操作系统root用户干预,因为裸设备的创建、更改权限、扩展大小等都需要root用户完成,增加了管理的成本。
文件系统的优点:
文件系统易于管理和维护,如文件的基本管理以及安全和备份等。
文件系统的缺点:
性能比不上裸设备。
我们在选择表空间容器时,从性能上考虑尽量采用裸设备,但是如果我们使用自动存储方式创建数据库和表空间,这种方式不支持裸设备。或者我们为了便于管理而采用文件系统方式。这时候我们采用合理设置文件系统相关选项和表空间的相关选项。下面我们来讲解文件系统方面应该注意的事项。
CIO/DIO
直接 I/O(DIO)由于可以绕过在文件系统级别进行高速缓存,从而改进内存性能。此过程可减少CPU开销并使得更多的内存可用于数据库实例。并发I/O(CIO)具有DIO的优点,并且还可以消除串行化写访问权。与使用文件系统缓冲I/O相比,在具有大量事务处理工作负载和回滚时CIO/DIO机制可增大吞吐量。
DIO和CIO在HP-UX、Solaris、Linux和Windows操作系统最新版本上都受支持。
关键字NO FILE SYSTEM CACHING和FILE SYSTEM CACHING是CREATE和ALTER TABLESPACESQL语句的一部分,允许您指定将对每个表空间使用DIO还是CIO。当 NO FILE SYSTEM CACHING有效时,只要可能,数据库管理器都会尝试使用"并发 I/O"。在不支持CIO的情况下(例如,当使用了JFS 时),将取而代之使用DIO。
建议在表空间级别启用或禁用UNIX、Linux和Windows上的非缓冲I/O。这将允许您在特定表空间上启用或禁用非缓冲I/O,同时避免数据库的物理布局中的任何依赖性。它还允许数据库管理器确定每个文件最适合使用哪种I/O,缓冲的还是非缓冲的。
NO FILE SYSTEM CACHING子句用于启用非缓冲I/O,从而禁用特定表空间的文件高速缓存。一旦启用了非缓冲 I/O,数据库管理器就会根据平台自动确定将使用直接 I/O还是并发I/O。由于使用CIO可以提高性能,所以只要支持CIO,数据库管理器就会使用它。
FILE SYSTEM CACHING选项并不是总没有好处,例如当一个应用程序检索LOB或LONG数据时,这些大对象数据不能经过数据库缓冲池,每次应用程序需要其中一个页时,数据库管理器必须从磁盘对其进行直接读取。但是,如果LOB或LONG数据存储在SMS或DMS文件容器中,文件系统高速缓存可提供缓冲,因此也就改善了性能。
未在CREATE TABLESPACE语句或CREATE DATABASE命令中指定此属性时,数据库管理器将使用基于平台和文件系统类型的默认行为处理请求。查看是否启用FILE SYSTEM CACHING属性,可以使用:
GET SNAPSHOT FOR TABLESPACES命令(此命令会在第12章讲解)
例如,以下是DB2 GET SNAPSHOT FOR TABLEPSACES ON SAPMPLE输出:表空间名 = USERSPACE1
表标识 = 2
表空间类型 =数据库管理的空间
表空间内容类型 = 所有永久数据。大型表空间。
表空间页大小(以字节计) = 4096
表空间扩展数据块大小(以页计) = 32
已启用自动预取大小 = Yes
当前正在使用的缓冲池标识 = 1
下一次启动的缓冲池标识 = 1
使用自动存储器 = Yes
已启用自动调整大小 = Yes
文件系统高速缓存 =No
表空间状态 = 0x'00000000'
…………………………………………略……………………………….
db2pd -db sample -tablespaces命令(此命令会在第12章讲解)
D:\Program Files\IBM\SQLLIB\BIN>db2pd -db sample -tablespaces
Database Partition 0 -- Database SAMPLE -- Active -- Up 0 days 00:03:20
Tablespace Configuration:
Address Id Type Content PageSz ExtentSz Auto Prefetch BufID BufIDDisk FSCNumCntrs MaxStripe LastConsecPg Name
0x7F90C230 0 DMS Regular 8192 4 Yes 4 1 1 Off1 0 3 SYSCATSPACE
0x7F90CA20 1 SMS SysTmp 8192 32 Yes 32 1 1 On
1 0 31 TEMPSPACE1
0x7F90F1E0 2 DMS Large 8192 32 Yes 32 1 1 Off
1 0 31 USERSPACE1
0x7F90F9D0 3 DMS Large 8192 32 Yes 32 1 1 Off
1 0 31 IBMDB2SAMPLEREL
0x7EF22240 4 DMS Large 8192 4 Yes 4 1 1 Off1 0 3 SYSTOOLSPACE
0x7EF22A30 5 DMS Large 8192 32 Yes 32 1 1 Off1 0 31 IBMDB2SAMPLEXML
0x7EF23220 6 SMS UsrTmp 8192 4 Yes 4 1 1 On
1 0 3 SYSTOOLSTMPSPACE
db2look -d -l命令(此命令会在第13章讲解)
下面我们举几个关于文件缓存的例子:
例3-1 假定数据库和所有相关表空间容器位于AIX JFS文件系统上,并且发出了以下语句:
DB2 CREATE TABLESPACE DATA_SPACE MANAGED BY DATABASE USING (file '/db2data1' 800M)
在先前版本中,如果未指定该属性,那么数据库管理器将使用缓冲I/O(FILE SYSTEM CACHING)作为I/O机制;对于版本9.5,数据库管理器使用NO FILE SYSTEM CACHING。
例3-2 在以下语句中,NO FILE SYSTEM CACHING子句指示对于此特定表空间,文件系统级高速缓存将OFF。CREATETABLESPACEtablespacename...NOFILE SYSTEM CACHING
例3-3 以下语句对现有表空间禁用文件系统级高速缓存:ALTERTABLESPACEtablespacename...NOFILE SYSTEM CACHING
例3-4 以下语句对现有表空间启用文件系统级高速缓存:ALTERTABLESPACEtablespacename... FILE SYSTEM CACHING
经过上面的讲解,建议创建表空间时,表空间的容器采用裸设备或支持并发I/O或直接I/O的文件系统。