Sybase ASE15数据分区技术及应用
ASE15中的数据分区介绍
数据分区技术可以将大的表或者索引分割成小的“数据片”,并存放在不同的“存储单元”中。数据库管理员可以在底层进行数据的存储、维护和管理工作。“segment(段)”在ASE中被定义为设备的单元。它常常被用来存储特定类型数据,例如:系统数据、日志数据和用户数据。分区可以存贮在不同的段上或者不同的分区存储在同一个段上。类似的,一个或多个段可以存放在任何的逻辑设备或物理设备上,这样可以通过分离I/O来提高性能和数据的可用性。在一个分区上的表或索引的数据可以以不同于其他分区的方式来管理和操作。查询时只须访问那些包含所需数据的分区。
数据库管理员可以更快捷地管理和维护这些较小的分区,而不是像以前那样不得不面对巨型的表和索引。一些日常的任务甚至可以在多个分区上并行地执行,这不但可以节省时间,还可以在分区上自动运行。当数据增长时,只需添加新的分区即可。
在ASE15中提供了四种方式的数据分区。第一种方式称之为轮询(round-robin)分区,是在ASE15之前版本中唯一提供的分区方式。这种方式是在分区上顺序排列数据,没有办法决定数据在分区上的存储位置,并且查询操作会涉及所有的分区。其他的三种分区方式统称为“语义数据分区”,因为可以通过这些方式确定数据的分区存放位置。在ASE15中将被广泛使用的方式是范围分区(Range Partitioning)方式。利用这种分区方式,数据库管理员可以通过数据的范围确定数据在分区上的存储位置。下一种方式是列表分区(List Partitioning)方式,可以将不同的数据分割存放在不同的分区上。第三种语义分区方式是哈希分区(Hash Partitioning)方式,在这种方式下数据是根据特定的列和内部哈希运算法则来确定数据的存放方式的。
如何使用数据分区
Sybase ASE中的分区功能只能在V15.0以及后续的版本中使用,ASE V15.0之前的版本中无法使用数据分区功能。在ASE V15.0之前版本中对于大表一般根据业务系统特点“分割表”来提高查询性能。
使用ASE15分区功能之前的工作
ASE15分区功能需要单独的license支持,如果使用企业版的话,需要获得使用分区组件的许可证文件,并拷贝到目录($SYBASE\SYSAM-2_0\licenses)中。对于ASE15.0开发版,默认可以使用分区功能。创建ASE服务后数据分区功能默认是关闭的,通过配置参数:enable semantic partitioning启用分区功能。
启动数据分区功能,使用isql登录ASE服务器。执行:
sp_configure "enable semantic partitioning",1
go
修改分区数配置参数
ASE15.0使用 "number of open partitions" 这个选项表示ASE能够同时访问/打开的最大分区数目。每个分区被访问的时候,系统都会分配一个内部的结构来存储这个分区的in-memory信息,分区越多将占用更多的内存。执行如下命令可得到当前服务器内所有对象的分区数,以及所配置的分区数。
sp_countmetadata "open partitions"
go
最大分区数默认为:500,将分区调整为:1000
sp_configure "number of open partitions",1000
go
监控分区数是否合适
在大量建表、删表和使用表分区后执行命令监控分区数:
sp_monitorconfig "open partition"
go
1>sp_monitorconfig "open partition"
2> go
Usage information at date and time: Dec 6 2011 4:22PM.
Name Num_free Num_active Pct_act Max_Used Reuse_cnt
------------------------- ----------- ----------- ------- ----------- -----------
number of open partitions 477 23 4.60 25 0
(1 row affected)
在“Max_Used”基础上再加10%的开销既是应该配置的合适分区数:25 * 1.1 = 28
用于分区的 create table 语法
create table详细的命令语法可以参考Sybase官方手册,或者参考下面的链接地址:http://infocenter.sybase.com/help/topic/com.sybase.infocenter.dc36272.1502/html/commands/X80969.htm
create table命令中关于分区部分的语法为:
partition_clause::=
partition by range ( column_name[, column_name ]...)
( [ partition_name ] values <= ( { constant | MAX }
[, { constant | MAX } ] ...) [ on segment_name ]
[, [ partition_name ] values <= ( { constant | MAX }
[, { constant | MAX } ] ...) [ on segment_name ] ]...)
| partition by hash (column_name[, column_name ]...)
{ ( partition_name [ on segment_name ]
[, partition_name [ on segment_name ] ]...)
| number_of_partitions
[ on (segment_name[, segment_name ] ...) ] }
| partition by list (column_name)
( [ partition_name ] values ( constant[, constant ] ...)
[ on segment_name ]
[, [ partition_name ] values ( constant[, constant ] ...)
[ on segment_name ] ] ...)
| partition by roundrobin
{ ( partition_name [ on segment_name ]
[, partition_name [ on segment_name ] ]...)
| number_of_partitions
[ on ( segment_name [, segment_name ]...) ] }
分区使用实例
(1)范围分区
范围分区尤其对于那些持续更新、插入和删除,且某些字段中包含连续数据,例如用户号或订单/交易日期的表尤为有效。这样的表需要数据库管理员额外的维护和管理。
下面是利用范围分区方式基于订单详细信息表(OrderList)上的交易日期(datetime) 列创建表分区的语法示例:
create table OrderList (
order_date datetime not null,
customer_ID int not null,
customer_Name char(20) not null,
ListDetails varchar(250) null
)
partition by range (order_date)
(
order_date1 values <= ('2009-01-01') on "default",
order_date2 values <= ('2009-04-01') on "default",
order_date3 values <= ('2009-07-01') on "default",
order_date4 values <= ('2009-10-01') on "default",
order_date5 values <= ('2010-01-01') on "default"
)
go
为了提高针对分区表的SQL语句的查询性能,建议将分区放置到不同的物理磁盘上面。Sybase中利用“段”来控制对象的存储位置。下面在demo数据库的数据设备demo_dat上面新建一个名为segment1的段:
sp_addsegment "segment1",demo,demo_dat
go
(2)列表分区
列表分区类似于范围分区,但这里实际被写入分区的数据是确定的。下面的示例是会员信息表,根据会员所属地区进行分区。
create table Members(
mem_ID int not null,
mem_name char(25) not null,
mem_sex char(1) not null,
mem_region char(30) not null,
note varchar(250) null
)
partition by list (mem_region)
(
locate1 values ('北京'),
locate2 values ('上海'),
locate3 values ('广州'),
locate4 values ('山东'),
locate5 values ('江苏'),
locate6 values ('河北'),
locate7 values ('辽宁'),
locate8 values ('等等…')
)
go
(3)哈希分区
这种数据分区方式是根据在指定列上利用内部哈希算法计算的结果来决定数据存储到哪一个分区。这里不需要指定列表或数值的范围。如果列键包含唯一数据,或者数据重复度极小,哈希分区将在其所有分区上平衡数据存储。然而,如果有大量重复数值,分区将会“倾斜”,一些分区上的数据可能会比其它分区多。
哈希分区在要为大表建立很多分区,或者关键列中的数据没有排序的情况下尤为有用。它同时还可以配合查询处理引擎使得查询工作更为有效。
create table lineitem (
l_orderkey integer not null,
l_partkey integer not null,
l_suppkey integer not null,
l_linenumber integer not null,
l_quantity money not null,
l_extendedprice money not null
)
partition by hash (l_orderkey, l_linenumber)
(
litem_hash1 on "default",
litem_hash2 on "default",
litem_hash3 on "default",
litem_hash4 on "default"
)
go
(4)轮循分区
这种分区方式是在ASE15之前版本中唯一提供的分区方式。在分区上顺序排列数据,没有办法决定数据在分区上的存储位置,并且查询操作会涉及所有的分区。
create table office(
office_id char(6) not null,
office_name varchar(30) not null,
address varchar(100) not null,
office_leader int not null
)
partition by roundrobin
(
part1 on "default",
part2 on "default",
part3 on "default"
)
go
删除分区
在上面的哈希分区例子中我们建了一个按l_orderkey和l_linenumber组合列分四个区的表:lineitem。
如要取消分区,必须先将分区修改为roundrobin,且在一个段上:
alter table lineitem partition by roundrobin (part1)
go
这样该表就没有分区。删除分区后,ASE会将该表上的数据移动到其它页面。这是一种清理表空间碎片的一种办法。可以再次重新分区。
alter table lineitem partition by hash(l_orderkey)
(hash1,hash2,hash3,hash4)
go
分区注意事项
代理表和系统表不能分区
“alter table”与“create table”的分区语法相同,可以:
Ø 将单个分区修改为多分区
Ø 在改变分区类型的同时改变分区的数量
Ø 改变键值和边界值
Ø 改变分区所在的段
Ø 仅有范围(range)和列表(list)分区可以增加分区
注意修改分区类型等时,ASE系统要将表中的数据按照修改后的分区类型重新分配,如果是大表最好在并行方式且数据库的“select into”开关应打开,这样速度快。
分区操作要注意
分区不能删除,但分区的表可“truncate table”和“select into”。取消分区可通过将分区修改为一个roundrobin的分区来实现。分区的键值和边界值要与数据类型兼容。“rang”分区的键值必须是升序且数据类型不能是“BLOB”、“Java”、“bit”和计算列。
分区与索引
当改变分 区策略或分区键,或者将没分区的表分区时均应删除索引。改变分区其它属性时不必删除索引。主键必须是分区的条件,因为主键和分区都会决定数据的物理存放顺 序,一个表是不可能有两种数据的物理存放顺序的。如果主键不是分区的条件,一个变通的办法是将主键建为唯一值索引。
可以对分区执行的命令操作
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)
用SQL得到分区表的分区键和分区值
参考:https://www.dbainfo.net/get-parition-key-values-by-system-catalogs.htm
写的很不错,赞一下~
不过这样介绍”number of open partitions”会不会更贴切一些? 这个选项应该是表示ASE能够同时访问/打开的分区数目。每个分区被访问的时候,系统都会分配一个内部的结构来存储这个分区的in-memory信息。
谢谢。
您的解释很贴切。
这个选项应该表示的是同时访问/打开的最大分区数目。
請問企業版的license需要購買嗎?
Sybase ASE15 企业版的license需要购买,另外ASE15的分区partition功能也需要购买license。