Chinaunix首页 | 论坛 | 博客
  • 博客访问: 101915706
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-18 21:05:31

    来源:赛迪网    作者:skid

分区键

分区键是用于确定特定一行数据存储在哪个分区的一个列(或一组列)。

    分区键是在一个表上用 CREATE TABLE 语句定义的。如果没有提供分区键,则默认地从主键的第一个列创建分区键。如果没有主键,则默认的分区键是表上第一个非 long/非 LOB 型的列。如果没有列能满足作为默认分区键的条件,则表在创建后就没有分区键,也就意味着这个表不能横跨一个以上的分区。

在选择分区键时,应该注意以下几点:

  • 表是如何被访问的。
  • 查询工作负载的性质。
  • 数据库系统所采用的连接策略。

    如果不需要特别考虑并置,那么能使数据均匀地散布在数据库分区组中所有数据库分区上的分区键就是好的分区键。在与一个数据库分区组相关联的表空间中,每个表的分区键可以确定表是否是并置的。

    不恰当的分区键可能导致数据分布不均匀。具有分布不均匀的数据的列和具有少量 distinct 值的列都不应该被选作分区键。distinct 值的数量必须多到足以确保数据行均匀地分布在数据库分区组中的所有数据库分区上。应用分区散列算法的代价与分区键的规模成比例。分区键不能多于 16 个列,列数越少导致的性能就越好。分区键中不应该包括不必要的列。

在定义分区键时,应考虑以下几点:

  • 只包含 long 数据类型(LONG VARCHAR、 LONG VARGRAPHIC、BLOB、CLOB 或 DBCLOB)的多分区的表的创建是不受支持的。
  • 分区键的定义不能修改。
  • 分区键应该包括最频繁参与连接的列。
  • 分区键应该由经常出现在 GROUP 子句中的列组成。
  • 任何惟一键或主键都必须包含分区键中的所有列。
  • 在在线事务处理(OLTP)环境中,分区键中的所有列出现在事务中时应该使用等号(=)加常量或主机变量。例如,假设在事务中经常用到雇员号 emp_no:

    UPDATE emp_table SET ... WHERE emp_no = host-variable

    在此情况下,EMP_NO 列可以作为 EMP_TABLE 的由单列组成的分区键。

散列分区是用于确定每一行在分区表中的位置的方法。该方法工作原理如下:

  1. 散列算法应用于分区键的值,产生 0 到 4095 之间的一个分区号。
  2. 当创建数据库分区组时,同时会创建分区映射。每个分区号按循环的方式顺序地填充分区映射。
  3. 分区号用作分区映射的索引。分区映射中的号码就是表所在的数据库分区的分区号。

分区映射

    在分区数据库环境中,数据库管理器必须有方法知道表的哪些行存储在哪个数据库分区上,以便发现它需要的数据。数据库管理器使用一个称作分区映射的映射来发现数据。

    分区映射是内部生成的数组,对于多分区的数据库分区组,这个数组包含 4,096 个条目,对于单分区的数据库分区组,这个数组只包含一个条目。

    对于单分区的数据库分区组,分区映射只有一个条目,其中包含数据库表中所有的行所在的数据库分区的分区号。对于多分区数据库分区组,数据库分区组中的分区号是以循环的方式指定的。就像城市地图按网格分成一些区一样,数据库管理器使用分区键来确定数据所存储在的位置(数据库分区)。

例如,假设您在 5 个数据库分区(分区号为 0-4)上有一个数据库。那么,这个数据库的 IBMDEFAULTGROUP 数据库分区组的分区映射为:

0 1 2 3 4 0 1 2 3 4 0 1 2...

如果在使用数据库分区 1 和 2 的数据库中创建了一个数据库分区组,那么这个数据库分区组的分区映射为:

1 2 1 2 1 2 1 2...

    如果数据库中所装载的表的分区键是 1 到 500,000 之间的整数,则分区键被散列到 0 到 4 095 之间的一个分区号。这个号码将用于作为分区映射的一个索引,以选择那一行所在的数据库分区。

    分区映射是在分区数据库中控制数据存储位置的一种灵活的方式。另外还有一种再分配(redistribution)实用程序,通过它可以改变数据在数据库中的数据库分区上的分布(使之平衡或偏斜),不过这超出了本文的范围。

DB2NODE 环境变量

    DB2NODE 环境变量用于指定想要连接到的目标逻辑分区。如果没有设置该变量,那么它将默认地等于用机器上的端口 0 定义的那个分区(在 db2nodes.cfg 文件中)。

如果要连接到逻辑分区 2,那么可以输入以下命令:

  • DB2NODE=2
  • export DB2NODE
  • db2 terminate

为了确保更改生效,必须用 terminate 命令。

为了识别当前活动逻辑节点,可以发出以下命令:

db2 "values (current dbpartitionnum)"

发出横跨多个机器和分区的命令

    这两个工具使跨所有机器或所有分区执行命令变得容易。两个工具使用相同的一组有用的选项,这些选项可以在 DB2 Command Window 中通过 "rah ?" 或 "db2_all ?" 命令显示出来。

db2_all

db2_all 用于在所有指定的分区上运行命令。

db2_all ";db2 update db cfg for SAMPLE using NEWLOGPATH /db2_db/logs"

分号用于作为一个前缀,表明该命令将在各分区上并发地运行。

rah

rah 用于在组成分区环境的所有机器上运行一个命令。

数据库备份

    当执行离线数据库备份时,需要单独备份编目分区。但是,在线备份时就不需要这样,因为日志是包括在备份镜像中的。例如,我们有一个名为 sample 的数据库和一个 /dev/backup 目录,从所有分区那里都可以访问这个目录。

首先需要备份位于分区 0 上的编目分区,这里只需指定 "<<+0<"" (在这个例子中)

db2_all '<<+0< db2 BACKUP DATABASE sample TO /dev/backup'

接着备份其他分区(除了分区 0),方法是指定 "<<-0<":

db2_all '|<<-0< db2 BACKUP DATABASE sample TO /dev/backup'

注意,前缀 "|" 将导致依次运行 BACKUP 命令。现在,在 /dev/backup 目录中可以找到每个分区的备份镜像。

表中行的分布

    DBPARTITIONNUM 函数可用于确定一个行所在的分区。例如,如果用在一个 SELECT 子句中,那么该函数将返回表中组成 SELECT 语句结果的每一行的分区号。

    该函数的参数必须是一个表中某一列的全限定或非限定列名。结果的数据类型是 INTEGER,并且不会为 null。由于只返回行这一级的信息,所以不管指定表的哪一列,结果总是相同的。如果没有 db2nodes.cfg 文件,则结果为 0。

例如:

select lastname, dbpartitionnum(lastname) as part_num from employee order by 1


清单 7. 使用 dbpartitionnum 函数的结果集

     LASTNAME        PART_NUM--------------- -----------ADAMSON                   0BROWN                     2GEYER                     1GOUNOT                    1HAAS                      1HENDERSON                 0JEFFERSON                 1JOHNSON                   1            JONES                     3

节点和数据库目录

节点(node)目录包含在建立从客户机工作站到所有合适的数据库服务器的通信时所需的信息。

数据库(database)目录包含客户机所连接到的所有数据库的数据库访问信息。

设计上的考虑

    DB2 Design Advisor 是获得有效的分区建议的最直接的工具,可以通过 Control Center GUI 或 db2advis 命令行工具来使用它。通过一个可更新的分区映射,结合一个散列算法,可以指定分区键与数据库分区的映射,这个映射可用于确定每个数据行的位置和检索。

    于是,对于大型的表,工作负载可以分布在多个分区上,而更小的表也可以存储在一个或多个数据库分区上。由于每个数据库分区都有它的数据上的本地索引,因此提高了本地数据访问的性能。

    DB2 还支持部分分块(de-clustering),在此情况下,表和表空间可以分布在可用分区的一个子集上。取决于数据库分区的数量,您可以有一个或多个单分区的数据库分区组,以及一个或多个多分区的数据库分区组。每个分区必须使用一个惟一的分区号,而同一个数据库分区可以属于一个或多个数据库分区组中。

    为了确保包含系统编目表的分区能够快速恢复,应避免将用户表也放在那个数据库分区上。为此,可以将用户表放在不包括 IBMCATGROUP 数据库分区组中的数据库分区的数据库分区组中。

    除非想要利用与更大的表的并置,否则应该将小型的表放在单分区的数据库分区组中。应避免使中等规模的表横跨太多的数据库分区。例如,对于一个 100 MB 的表,将它放在包含 16 个分区的数据库分区组上可能比将它放在包含 32 个分区的数据库分区组上得到的性能要好。

    您可以使用数据库分区组来将在线事务处理(OLTP)表与决策支持(DSS)表隔离开来,以确保 OLTP 事务的性能不受负面影响。

在多分区数据库分区组中,如果索引是分区键的超集,那么只能创建一个惟一的索引。

在创建数据库时,应确保在用于数据库位置的 "ON" 子句中指定一个本地(非共享)目录。例如,

CREATE DATABASE SAMPLE ON /db2_db

其中 /db2_db is 是一个预先存在的本地目录。

    在默认情况下,数据库管理器配置中的默认数据库路径(DBTDBPATH)参数是 instance owner(被 NFS 共享)的 home 目录的位置。如果在不指定数据库位置的情况下创建数据库,那么将使用 DBTDBPATH 创建数据库,这里 DBTDBPATH 指向共享的 instance-owner 目录。这样将降低性能。

创建数据库之后,应该确保每个数据分区还有它自己的日志本地目录。您可以使用以下命令:

db2_all ";db2 update db cfg for SAMPLE using NEWLOGPATH /db2_db/logs"

节点号被自动附加在路径的后面。这样做是为了维护多逻辑节点配置中路径的惟一性。

结束语

    本文讲解了在 DB2 UDB 中使用 Data Partitioning Feature (DPF) 的理论基础,详细解释了 DPF 的安装过程和一些重要概念,并且谈到在 SUSE Linux Enterprise 环境中启用 DPF 时在设计上的一些考虑。更好地理解了 SUSE Linux 环境中的 DB2 DPF 之后,就可以很快地掌握如何在 SUSE Linux 环境中启用 DPF。

阅读(649) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~