SAP HANA HDB 分区管理:
使用SAP HANA数据库的分区特性,可以把列存储的大数据表水平分割存储在不同的分区中。
SAP HANA的分区只能对列存储表使用,如果对行存储的表使用会出现语法错误。
错误信息:SAP DBTech JDBC: [257]: sql syntax error: not supported for row table
SAP HANA的分区表可以包含多个分区,每个分区都是独立的。
分区的有点:
负载均衡:使用表分区,各个分区的个体数据可以分布存储在不同的分布服务器中。对一张表进行查询时,不是由单一的服务器进行处理,而是分解到所有关联的主分区的服务器进行并行处理。同时数据分散到各个分区中,减少数据损坏。
并行性:操作并行性,操作并行使用几个执行线程对每张表。对大表的查询、增加、修改等操作可以分解到表的不同分区来并行执行,可使运行速度更快
分区修剪:查询分析,看看是否匹配给定的分区规格一个表。如果找到匹配,它有可能确定的实际分区(保存数据问题)。使用这种方法可以减少系统的负载,响应时间也更好的。
明确的分区处理:SAP HANA数据库会主动控制分区,例如:增加分区来存储为即将到来的一个月的数据。
限制:一个非分区表不能存储超过2亿行数据,通过使用分区,这限制可以克服把表由分布到几个分区进行存储。但请注意,每个分区不能超过2亿行数据。
性能: SAP HANA数据库增量合并的性能依赖于数据库主索引的大小,如果数据只有在一部分的分区中被修改,那么会有很少的一部分数据需要做增量合并,这样对数据库的性能更好。
修改-删除分区:
ALTER TABLE mytab ADD PARTITION OTHERS
ALTER TABLE mytab DROP PARTITION OTHERS
查看表分区的情况:
select * from sys.M_CS_PARTITIONS where table_name = tablename
SAP HANA 提供的分区类型:
单级分区(single-level partitioning): HASH, Range,Round-Robin.
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
范围分区(Range partitioning):
范围分区可以用来创建一个专用的分区,范围可以是一个定值也可以使一个范围。您可以选择把每季度的数据放在一个分区内,也可为一年中每个月份都创建一个分区。
另外还可以选择使用范围分区为主动管理的分区表,分区可以被创建或删除,如:数据库可以创建一个分区为即将到来的一个月,新的数据将被插入到新的分区中。
如果插入一条数据没有匹配上任何一个分区的条件,SAP HANA会反馈一个错误信息,为了避免这种情况,在创建分区时,需要创建一个剩余分区(rest partition).
注意:范围分区不适合负荷分配。
范围分区对数据类型的限制:仅仅对字符串,整数,日期是可以使用的。
语法:进行分区的字段必须是主键的一部分。
创建整数类型的分区:INT
CREATE COLUMN TABLE mytab (a INT, b INT, c INT, PRIMARY KEY (a,b)) PARTITION BY RANGE (a)
(PARTITION 1 <= VALUES < 5,
PARTITION 5 <= VALUES < 20,
PARTITION VALUE = 44,
PARTITION OTHERS)
创建一个范围的分区用: PARTITION <= VALUES <
创建一个定值的分区用: PARTITION VALUE =
创建一个剩余分区用: PARTITION OTHERS
删除一个范围的分区用:alter table mytab drop partition 1 <= VALUES < 5
删除一个定值的分区用:alter table mytab2 drop partition VALUE = 44
删除一个剩余分区用: alter table mytab2 drop partition OTHERS
创建日期类型分区:Date
CREATE COLUMN TABLE TEST_RANGE_PARTITION_DATE (ID INT,NAME VARCHAR(20),BIRTHDAY DATE,PRIMARY KEY(ID,BIRTHDAY))
PARTITION BY RANGE(BIRTHDAY) (
PARTITION '2011-12-31' <= VALUES < '2012-04-01',
PARTITION OTHERS)
创建字符串类型分区:String
CREATE COLUMN TABLE TEST_RANGE_PATITION_STRING (ID INT,CITY VARCHAR(20),DESCRIPTION VARCHAR(50), PRIMARY KEY(ID,CITY))
PARTITION BY RANGE(CITY)(
PARTITION VALUES = '广州' ,
PARTITION VALUES = '上海',
PARTITION VALUES = '厦门',
PARTITION OTHERS
)
分区的字段不是主键的一部分的情况:
CREATE COLUMN TABLE TEST_RANGE_PATITION_STRING_NOKEY (ID INT,CITY VARCHAR(20),DESCRIPTION VARCHAR(50),PRIMARY KEY(ID))
PARTITION BY RANGE(CITY)(
PARTITION VALUES = '广州' ,
PARTITION VALUES = '上海',
PARTITION VALUES = '厦门',
PARTITION OTHERS
)
错误信息:SAP DBTech JDBC: [435] (at 140): invalid expression: partition column should be included in primary key columns: CITY: line 2 col 20 (at pos 140)
没有创建剩余分区:(rest partition)
CREATE COLUMN TABLE mytab_test (a INT, b INT, c INT, PRIMARY KEY (a,b)) PARTITION BY RANGE (a)
(PARTITION 1 <= VALUES < 5,
PARTITION 5 <= VALUES < 20,
PARTITION VALUE = 44
)
INSERT INTO MYTAB_TEST VALUES (55,5,55); a的值为55没有落在任何一个分区内。
错误信息:Could not execute 'insert into mytab_test values (55,5,55)'
SAP DBTech JDBC: [2048] (at 24): column store error: [2592] Error allocating rows to parts;Could not allocate value '55' for column 'A' to a part. The table has no rest part. Create a new partition for the value.
增加分区:对mytab_test 表增加 rest partition
ALTER TABLE MYTAB_TEST ADD PARTITION OTHERS;
INSERT INTO MYTAB_TEST VALUES (55,5,55);
执行信息:
Statement 'ALTER TABLE MYTAB_TEST ADD PARTITION OTHERS' successfully executed in 41 ms 439 µs - Rows Affected: 0
Statement 'INSERT INTO MYTAB_TEST VALUES (55,5,55)' successfully executed in 58 ms 119 µs - Rows Affected: 1
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
SAP HANA HDB 分区管理 (二) http://blog.csdn.net/qptufly/article/details/7965305