在Linux上利用数据分区功能提高可伸缩性和性能
2009-12-23 15:00:13 来源:WEB开发网如果使用类似于上面的字符串,并且分区号仍然是 5,那么将看到:
表 6. 数据库分区表达式的使用
例子 | 容器名称 |
'/dbdir/node $N /cont1' | '/dbdir/node5/cont1' |
'/ $N+1000 /file1' | '/1005/file1' |
' $N%10 /container' | '5/container' |
'/dir/ $N%5+2000 /dmscont' | '/dir/2000/dmscont' |
如果在一个由两个分区组成的数据库上发出以下语句:
CREATE TABLESPACE TBSP1 MANAGED BY DATABASE USING (device '/dev/container $N' 10000)
那么将看到下列容器被创建:
/dev/container0 - on DATABASE PARTITION 0
/dev/container1 - on DATABASE PARTITION 1
分区键
分区键是用于确定特定一行数据存储在哪个分区的一个列(或一组列)。
分区键是在一个表上用 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 的由单列组成的分区键。
散列分区是用于确定每一行在分区表中的位置的方法。该方法工作原理如下:
散列算法应用于分区键的值,产生 0 到 4095 之间的一个分区号。
当创建数据库分区组时,同时会创建分区映射。每个分区号按循环的方式顺序地填充分区映射。
分区号用作分区映射的索引。分区映射中的号码就是表所在的数据库分区的分区号。
更多精彩
赞助商链接