VLDB (超大型数据库,very large databases)处理查询操作时,将会耗费大量的时间和资源来获取所需的数据,这将影响查询的性能。一个需要遍历整张表或索引的查询将使性能降低到无法容忍的地步。这对于决策支持系统(DSS),如数据仓库系统是严峻的考验。
为了解决这些VLDB面临的挑战,ASE15的数据分区(Partition)功能将有效地减少管理所需的时间并提高应用的性能。数据分区功能将有助于满足任何容量的ASE数据库在管理、维护和性能上的要求。
数据分区可以将大的表或者索引分割成小的数据片,并存放在不同的存储单元中。数据库管理员可以在底层处理数据的存储、维护和管理工作。
“segment(段)”在ASE中被定义为设备的单元。它常常被用来存储特定类型数据,例如:系统数据、日志数据和用户数据。分区可以存贮在不同的段上或者不同的分区存储在同一个段上。类似的,一个或多个段可以存放在任何的逻辑或物理设备上,这样可以分离I/O来提高性能和数据的可用性。在一个分区上的表或索引数据可以以不同于其他分区的方式来管理和操作。查询只须访问那些包含所需数据的分区。
数据库管理员可以更快捷地管理和维护这些较小的分区,而不是像以前那样不得不面对巨型的表和索引。一些日常的任务甚至可以在多个分区上并行地执行,这不但可以节省时间,还可以在分区上自动运行。当数据增长时,只需添加新的分区即可。
在ASE15中提供了四种数据分区的方式:
1、轮循分区(round-robin),是在ASE15之前版本中唯一提供的分区方式。这种方式是在分区上顺序排列数据,没有办法决定数据在分区上的存储位置,并且查询操作会涉及所有的分区。
create table office_table (
office_id char(3) not null,
office_name varchar(30) not null,
address varchar(40) not null,
office_mgr int not null )
partition by roundrobin (
part1 on seg1,
part2 on seg2,
part3 on seg3 )
其他的三种分区方式称之为“语义数据分区”方式,因为可以通过这些方式确定数据的分区存放位置。
2、范围分区(Range Partitioning),在ASE15中将被广泛使用的方式。
利用这种分区方式,数据库管理员可以通过数据的范围确定数据在分区上的存储位置。
例如,数值1,2,3,4存储在分区1中,而5,6,7,8存储在分区2中,诸如此类。
下面是利用范围分区方式基于date/time 列创建表的语法
create table customer (
ord_date datetime not null,
name varchar(20) not null,
address varchar(40) not null)
partition by range (ord_date) (
ord_date1 values <= (3/31/05) on segment1,
ord_date2 values <= (6/30/05) on segment2,
ord_date3 values <= (9/30/05) on segment3,
ord_date4 values <= (12/31/05) on segment4)
范围分区尤其对于那些持续更新、插入和删除,且某些字段中包含连续数据,例如用户号或订单/交易日期的表尤为有效。这样的表需要数据库管理员额外的维护和管理,最适合使用范围分区。
3、列表分区(List Partitioning),可以将不同的数据分割存放在不同的分区上。
列表分区类似于范围分区,但这里实际被写入分区的数据是确定的。例如在包含有全球各地区数据的“地区”关键字段上建立列表分区。该列数据有没有排序,以及数据在分区上存储的顺序,都不影响列表分区存储数据。下面是利用列表分区方式创建表的语法示例:
create table customer (
cust_id char(10) not null,
cust_name varchar(30) not null,
state char(2) not null,
phone char(10) not null)
partition by list (state) (
west values (’CA’, ‘OR’) on seg1,
east values (’NY’, ‘NJ’) on seg2)
create table nation (
nationkey integer not null,
name char(25) not null,
regionkey varchar(30) not null,
comment varchar(152) not null)
on segment 1partition by list (regionkey)(
region1 values ('Americas'),
region2 values ('Asia'),
region3 values ('Europe'),
4、哈希分区(Hash Partitioning)。在这种方式下数据是根据特定的列和内部哈希运算法则来确定数据的存放方式。
这里不需要指定列表或数值的范围。如果列键包含唯一数据,或者数据重复度极小,哈希分区将在其所有分区上平衡数据存储。然而,如果有大量重复数值,分区将会“倾斜”,一些分区上的数据可能会比其它分区多。
哈希分区在要为大表建立很多分区,或者关键列中的数据没有排序的情况下尤为有用。它同时还可以配合查询处理引擎使得查询工作更为有效。
create table lineitem (
l_orderkey int not null,
l_partkey char(10) not null,
l_suppkey char(4) not null,
l_linenumber int not null,
l_quantity int not null)
partition by hash (l_orderkey, l_linenumber)(
litem_hash1 on seg1,
litem_hash2 on seg2,
litem_hash3 on seg3)
二、使用ASE15分区的前提条件是什么?
条件1.获得允许使用分区的许可并安装在资产管理器(SYSAM-2_0)中
条件2.用isql等连接ASE中,用如下方式设置允许使用分区
1> sp_configure “enable semantic partitioning”,1
2> go
三、如何修改number of open partitions分区数配置参数?
ASE使用 “number of open partitions” 参数来控制允许最多的分区数,注意该参数配置愈大将占用更多的内存。
1> sp_configure “number of open partitions”,800
2> go
四、初始时如何计算合适的分区数?
在系统闲时,执行如下命令可得到所应该配置的分区数
1> sp_countmetadata “open partitions”
2> go
There are 647 user partitions in all database(s), requiring 617 Kbytes of
memory. The ‘open partitions’ configuration parameter is currently set to 500.
五、使用过程中如何监控分区数是否合适?
在系统高峰时段或大量建表删除表和分区后使用如下命令监控分区数
1> sp_monitorconfig “open partition”
2> go
Name Num_free Num_active Pct_act Max_Used Num_Reuse
————————- ———– ———– ——- ———– ———–
number of open partitions 443 357 44.63 397 0
在“Max_Used”基础上再加10%的开销既是应该配置的合适分区数
397 * 1.1 = 436.7 > 437
1> sp_configure “number of open partitions”,437
2> go
六、如何估计分区数所占用的内存或一定内存所能配置的分区数?
1> sp_helpconfig “number of open partitions”,”1000″
2> go
……
Configuration parameter, ‘number of open partitions’, will consume 953K of memory if configured at 1000.
Changing the value of ‘number of open partitions’ to ‘1000′ increases the amount of memory ASE uses by 474 K.
1> sp_helpconfig “number of open partitions”,”10M”
2> go
……
Configuration parameter, ‘number of open partitions’, can be configured to 10736 to fit in 10M of memory.
七、如何取消分区
如要取消分区,必须先将分区修改为 roundrobin,且在一个段上。
1> alter table lineitem partition by roundrobin (part1)
2> go
其实如此该表就没分区了
然后就可重新分区
1> alter table lineitem partition by hash(l_orderkey)
2> (hash1,hash2,hash3,hash4)
3> go
八、分区注意事项
1.代理表和系统表不能分区
2.“alter table”与“create table”的分区语法相同,可以:
将单个分区修改为多分区
在改变分区类型的同时改变分区的数量
改变键值和边界值
改变分区所在的段
仅有范围(range)和列表(list)分区可以增加分区
注意修改分区类型等时,ASE系统要将表中的数据按照修改后的分区类型重新分配,如果是大表最好在并行方式且数据库的“select into”开关应打开,这样速度快.
3.分区操作要注意:
分区不能删除,但分区的表可“truncate table”和“select into”
取消分区可通过将分区修改为一个roundrobin的分区来实现
分区的键值和边界值要与数据类型兼容。“rang”分区的键值必须是升序且数据类型不能是“BLOB”、“Java”、“bit”和计算列
4.分区与索引
当改变分区策略或分区键,或者将没分区的表分区时均应删除索引
改变分区其它属性时不必删除索引
主键必须是分区的条件,因为主键和分区都会决定数据的物理存放顺序,一个表是不可能有两种数据的物理存放顺序的。如果主键不是分区的条件,一个变通的办法是将主键建为唯一值索引,如:
create table sales
(cust_id char(10) not null,
ord_id char(10) not null,
salesdate date not null,
salespsn int not null)
partition by range (salesdate)
(q1 values <= (’3/31/2005′) on seg1,
q2 values <= (’6/30/2005′) on seg2,
q3 values <= (’9/30/2005′) on seg3,
q4 values <= (MAX) on seg4)
create unique index idx1 on sales(cust_id,ord_id)
九、可以对单个分区做的操作
truncate table sales partition jan
update statistics sales partition feb
update table statistics sales partition mar
delete statistics sales partition apr
reorg forwarded_rows sales partition may
reorg reclaim_space sales partition jun
reorg compact sales partition jul
reorg rebuild sales local_idx partition aug
bcp custdb..sales partition sept, oct, nov out months.dat …
dbcc checktable (sales, null, dec)