暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

OceanBase:分区表

原创 李真旭 2020-05-29
5664

这是Oceanbase学习系列第2篇文章,重点测试一下ob对于分区表的支持情况(注意我这里测试均为ob的oracle模式),供大家参考。

首先我们来看下对于分区的支持有哪些:

partition_option:
PARTITION BY HASH(expression)
[subpartition_option] PARTITIONS partition_count
| PARTITION BY KEY([column_name_list])
[subpartition_option] PARTITIONS partition_count
| PARTITION BY RANGE {(expression) | COLUMNS (column_name_list)}
[subpartition_option] (range_partition_list)
复制

从文档来看,OB目前支持hash,range,key 3种分区方式(其中key就类似list分区);同时也支持复合分区(即二级子分区);我们今天先来测试一下普通分区的情况。

1)key分区(list)测试

obclient> create table enmotech(a number,b number)
-> partition by list(a)
-> (partition part_1 values ((1),(2)),
->  partition part_2 values ((3),(4)),
->  partition part_3 values ((5),(6)),
->  partition part_4 values(default)
-> );
Query OK, 0 rows affected (0.05 sec)
obclient> insert into enmotech values(1,100);
Query OK, 1 row affected (1.14 sec)
obclient> insert into enmotech values(2,101);
Query OK, 1 row affected (0.00 sec)
obclient> insert into enmotech values(3,100);
Query OK, 1 row affected (0.01 sec)
obclient> insert into enmotech values(4,102);
Query OK, 1 row affected (0.00 sec)
obclient> insert into enmotech values(5,112);
Query OK, 1 row affected (0.00 sec)
obclient> insert into enmotech values(8,9999999);
Query OK, 1 row affected (0.00 sec)
obclient> commit;
Query OK, 0 rows affected (0.00 sec)
obclient> select * from enmotech;
+------+---------+
| A    | B       |
+------+---------+
|    1 |     100 |
|    2 |     101 |
|    3 |     100 |
|    4 |     102 |
|    5 |     112 |
|    8 | 9999999 |
+------+---------+
6 rows in set (0.01 sec)
obclient> 
obclient> select table_owner,table_name,PARTITION_NAME,PCT_USED,TABLESPACE_NAME,NUM_ROWS,COMPRESSION,LAST_ANALYZED
-> from dba_tab_partitions where table_name=upper('enmotech');
+-------------+------------+----------------+----------+-----------------+----------+-------------+---------------+
| TABLE_OWNER | TABLE_NAME | PARTITION_NAME | PCT_USED | TABLESPACE_NAME | NUM_ROWS | COMPRESSION | LAST_ANALYZED |
+-------------+------------+----------------+----------+-----------------+----------+-------------+---------------+
| ROGER       | ENMOTECH   | PART_4         |     NULL | NULL            |     NULL | DISABLED    | NULL          |
| ROGER       | ENMOTECH   | PART_3         |     NULL | NULL            |     NULL | DISABLED    | NULL          |
| ROGER       | ENMOTECH   | PART_2         |     NULL | NULL            |     NULL | DISABLED    | NULL          |
| ROGER       | ENMOTECH   | PART_1         |     NULL | NULL            |     NULL | DISABLED    | NULL          |
+-------------+------------+----------------+----------+-----------------+----------+-------------+---------------+
4 rows in set (0.03 sec)
obclient> explain select * from enmotech where a=3 \G;
*************************** 1. row ***************************
Query Plan: =======================================
|ID|OPERATOR  |NAME    |EST. ROWS|COST|
---------------------------------------
|0 |TABLE SCAN|ENMOTECH|1        |37  |
=======================================
Outputs & filters: 
-------------------------------------
0 - output([ENMOTECH.A], [ENMOTECH.B]), filter([ENMOTECH.A = 3]), 
access([ENMOTECH.A], [ENMOTECH.B]), partitions(p1)
1 row in set (0.00 sec)
ERROR: 
No query specified
obclient> select * from enmotech partition (part_2);
+------+------+
| A    | B    |
+------+------+
|    3 |  100 |
|    4 |  102 |
+------+------+
2 rows in set (0.00 sec)
obclient> 
obclient> explain select * from enmotech where a=7 \G;
*************************** 1. row ***************************
Query Plan: =======================================
|ID|OPERATOR  |NAME    |EST. ROWS|COST|
---------------------------------------
|0 |TABLE SCAN|ENMOTECH|1        |37  |
=======================================
Outputs & filters: 
-------------------------------------
0 - output([ENMOTECH.A], [ENMOTECH.B]), filter([ENMOTECH.A = 7]), 
access([ENMOTECH.A], [ENMOTECH.B]), partitions(p3)
1 row in set (0.00 sec)
ERROR: 
No query specified
obclient> alter table enmotech drop partition PART_2;
Query OK, 0 rows affected (0.04 sec)
obclient> purge recyclebin;
Query OK, 0 rows affected (0.03 sec)
obclient> show recyclebin;
Empty set (0.00 sec)
obclient> alter table enmotech add partition values ((3),(4)) ;
ERROR-00600: internal error code, arguments: -5598, cannot add partition when DEFAULT partition exists
obclient> 
obclient> alter table enmotech drop partition PART_3;
Query OK, 0 rows affected (0.02 sec)
obclient> show recyclebin;
Empty set (0.01 sec)
obclient>  alter table enmotech truncate partition part_1;
ERROR-00600: internal error code, arguments: -4007, truncate partition not supported
obclient>
复制

我们可以发现ob能够很好支持list分区,同时也支持分区的drop操作;但是不支持truncate分区操作。同时如何存在default 分区的情况下,也无法进行add partition操作.另外对于分区的drop,默认是不会存放到回收站的。也就是说ob的flashback table功能无法支持分区表(至于flashback database行不行,稍后再测试)。

另外可以看到,sql语句条件指定分区键,执行计划会进行分区裁剪,需要注意的是分区编号默认从p0开始。

  1. range分区测试
obclient> create table enmotech_p(a number,b number)
-> partition by range(a)
-> (partition p_1 values less than (10),
-> partition p_2 values less than (20),
-> partition p_3 values less than (30)
-> );
Query OK, 0 rows affected (0.05 sec)
obclient> insert into enmotech_p values(1,10000);
Query OK, 1 row affected (0.03 sec)
obclient> insert into enmotech_p values(11,10000); 
Query OK, 1 row affected (0.01 sec)
obclient> insert into enmotech_p values(22,10000);  
Query OK, 1 row affected (0.01 sec)
obclient> insert into enmotech_p values(33,10000);  
ERROR-14400: inserted partition key does not map to any partition
obclient> alter table enmotech_p add partition p_max values(default);
ERROR-00600: internal error code, arguments: -4016, Ooooooooooooops
obclient> 
obclient> alter table enmotech_p add partition p_max values(maxvalue);
ERROR-00900: You have an error in your SQL syntax; check the manual that corresponds to your OceanBase version for the right syntax to use near 'maxvalue)' at line 1
obclient> 
obclient> alter table enmotech_p add partition p_max values(99999999999999999999);
Query OK, 0 rows affected (0.05 sec)
obclient> insert into enmotech_p values(33,10000);  
Query OK, 1 row affected (0.01 sec)
obclient> insert into enmotech_p values(33333333,10000); 
Query OK, 1 row affected (0.00 sec)
obclient> commit;
Query OK, 0 rows affected (0.00 sec)
obclient> select * from enmotech_p;
+----------+-------+
| A        | B     |
+----------+-------+
|        1 | 10000 |
|       11 | 10000 |
|       22 | 10000 |
|       33 | 10000 |
| 33333333 | 10000 |
+----------+-------+
5 rows in set (0.00 sec)
复制

可以看到,目前ob2.2版本还不支持max分区。那么是否支持global或者local 索引呢?

obclient> create index idx_enmotech_a on enmotech_p(a) local;
Query OK, 0 rows affected (0.43 sec)
obclient> select * from enmotech_p where a=33;
+------+-------+
| A    | B     |
+------+-------+
|   33 | 10000 |
+------+-------+
1 row in set (0.00 sec)
obclient> explain select * from enmotech_p where a=33 \G;
*************************** 1. row ***************************
Query Plan: =========================================
|ID|OPERATOR  |NAME      |EST. ROWS|COST|
-----------------------------------------
|0 |TABLE SCAN|ENMOTECH_P|1        |37  |
=========================================
Outputs & filters: 
-------------------------------------
0 - output([ENMOTECH_P.A], [ENMOTECH_P.B]), filter([ENMOTECH_P.A = 33]), 
access([ENMOTECH_P.A], [ENMOTECH_P.B]), partitions(p3)
1 row in set (0.00 sec)
ERROR: 
No query specified
obclient> 
obclient> select OWNER,INDEX_NAME,TABLE_NAME,PARTITIONING_TYPE,LOCALITY
-> from dba_part_indexes where TABLE_NAME=upper('enmotech_p');
+-------+----------------+------------+-------------------+----------+
| OWNER | INDEX_NAME     | TABLE_NAME | PARTITIONING_TYPE | LOCALITY |
+-------+----------------+------------+-------------------+----------+
| ROGER | IDX_ENMOTECH_A | ENMOTECH_P | RANGE_COL         | LOCAL    |
+-------+----------------+------------+-------------------+----------+
1 row in set (0.10 sec)
obclient> select INDEX_NAME,PARTITION_NAME,HIGH_VALUE,PARTITION_POSITION,INTERVAL,SEGMENT_CREATED,BLEVEL
-> from dba_ind_partitions where INDEX_owner='ROGER';
Empty set (0.02 sec)
复制

这里不知道为什么,居然查不到 ?看来ob的oracle模式数据字典方面兼容性还不够好。

那么对于global index的支持呢?

obclient>  create index idx_enmotech_a1 on  enmotech_p(a) global;
ERROR-01408: such column list already indexed
obclient> drop index idx_enmotech_a;
Query OK, 0 rows affected (0.02 sec)
obclient> create index idx_enmotech_a1 on  enmotech_p(a) global;
ERROR-00600: internal error code, arguments: -4007, create global index on table without primary key not supported
obclient> 
obclient> alter table enmotech_p add constraint enmotech_a_pk primary key (a);
ERROR-00600: internal error code, arguments: -4007, Not supported feature or function
obclient> alter table enmotech_p truncate partition p_3;
ERROR-00600: internal error code, arguments: -4007, truncate partition not supported
obclient>
复制

发现ob居然不支持add 主键约束,当然是分区情况下。最后查看官方文档发现语法有差异:

alter_table_action:
ADD [COLUMN] {column_definition | (column_definition_list)}
| CHANGE [COLUMN] column_name column_definition
| MODIFY [COLUMN] column_definition
| ALTER [COLUMN] column_name {SET DEFAULT const_value | DROP DEFAULT}
| DROP [COLUMN] column_name
| ADD [CONSTRAINT [constraint_name]] UNIQUE {INDEX | KEY} [index_name] index_desc
| ADD {INDEX | KEY} [index_name] index_desc
| ADD FULLTEXT [INDEX | KEY] [index_name] fulltext_index_desc
| ALTER INDEX index_name [VISIBLE | INVISIBLE]
| DROP {INDEX | KEY} index_name
| ADD PARTITION (range_partition_list)
| DROP PARTITION (partition_name_list)
| [SET] table_option_list
| RENAME [TO] table_name
| DROP TABLEGROUP
复制

可以看到不支持add primary key,但是可以add unique index。另外从命令上来看也不支持move partition操作。不过总的来说功能也还算完善了。而且还在支持invisable index呢? 这可是Oracle 11g才有的新功能。

  1. hash分区测试
obclient>  create table enmo_hash(a number,b varchar2(20))
-> partition by hash(a) partitions 8;
Query OK, 0 rows affected (0.57 sec)
obclient> 
obclient> insert into enmo_hash values(1,'xxx');
Query OK, 1 row affected (0.16 sec)
obclient> set global autocommit=on;
Query OK, 0 rows affected (0.01 sec)
obclient> insert into enmo_hash values(2,'xxx'); 
Query OK, 1 row affected (0.03 sec)
obclient> insert into enmo_hash values(10,'xxx'); 
Query OK, 1 row affected (0.01 sec)
obclient> insert into enmo_hash values(110,'xxx'); 
Query OK, 1 row affected (0.00 sec)
obclient> insert into enmo_hash values(1110,'xxx'); 
Query OK, 1 row affected (0.00 sec)
obclient> insert into enmo_hash values(11100,'xxx');
Query OK, 1 row affected (0.00 sec)
obclient> insert into enmo_hash values(12200,'xxx');  
Query OK, 1 row affected (0.27 sec)
obclient> insert into enmo_hash values(1220,'xxx');  
Query OK, 1 row affected (0.03 sec)
obclient> insert into enmo_hash values(3220,'xxx');   
Query OK, 1 row affected (0.00 sec)
obclient> insert into enmo_hash values(3230,'xxx'); 
Query OK, 1 row affected (0.10 sec)
obclient> select * from enmo_hash;
+-------+------+
| A     | B    |
+-------+------+
|     2 | xxx  |
|  1110 | xxx  |
|  3220 | xxx  |
|  3230 | xxx  |
|  1220 | xxx  |
| 11100 | xxx  |
| 12200 | xxx  |
|     1 | xxx  |
|   110 | xxx  |
|    10 | xxx  |
+-------+------+
10 rows in set (0.28 sec)
obclient> explain select * from enmo_hash where a=110 \G;
*************************** 1. row ***************************
Query Plan: ========================================
|ID|OPERATOR  |NAME     |EST. ROWS|COST|
----------------------------------------
|0 |TABLE SCAN|ENMO_HASH|1        |37  |
========================================
Outputs & filters: 
-------------------------------------
0 - output([ENMO_HASH.A], [ENMO_HASH.B]), filter([ENMO_HASH.A = 110]), 
access([ENMO_HASH.A], [ENMO_HASH.B]), partitions(p5)
1 row in set (0.01 sec)
ERROR: 
No query specified
obclient> select TABLE_NAME,PARTITION_NAME,HIGH_VALUE,PARTITION_POSITION,PCT_FREE,INI_TRANS,MAX_TRANS,INITIAL_EXTENT,NEXT_EXTENT,NUM_ROWS
-> from dba_tab_partitions where table_name=upper('enmo_hash');
+------------+----------------+------------+--------------------+----------+-----------+-----------+----------------+-------------+----------+
| TABLE_NAME | PARTITION_NAME | HIGH_VALUE | PARTITION_POSITION | PCT_FREE | INI_TRANS | MAX_TRANS | INITIAL_EXTENT | NEXT_EXTENT | NUM_ROWS |
+------------+----------------+------------+--------------------+----------+-----------+-----------+----------------+-------------+----------+
| ENMO_HASH  | p7             | NULL       |                  7 |     NULL |      NULL |      NULL |           NULL |        NULL |     NULL |
| ENMO_HASH  | p6             | NULL       |                  6 |     NULL |      NULL |      NULL |           NULL |        NULL |     NULL |
| ENMO_HASH  | p5             | NULL       |                  5 |     NULL |      NULL |      NULL |           NULL |        NULL |     NULL |
| ENMO_HASH  | p4             | NULL       |                  4 |     NULL |      NULL |      NULL |           NULL |        NULL |     NULL |
| ENMO_HASH  | p3             | NULL       |                  3 |     NULL |      NULL |      NULL |           NULL |        NULL |     NULL |
| ENMO_HASH  | p2             | NULL       |                  2 |     NULL |      NULL |      NULL |           NULL |        NULL |     NULL |
| ENMO_HASH  | p1             | NULL       |                  1 |     NULL |      NULL |      NULL |           NULL |        NULL |     NULL |
| ENMO_HASH  | p0             | NULL       |                  0 |     NULL |      NULL |      NULL |           NULL |        NULL |     NULL |
+------------+----------------+------------+--------------------+----------+-----------+-----------+----------------+-------------+----------+
8 rows in set (0.18 sec)
obclient> select count(1) from enmo_hash;
+----------+
| COUNT(1) |
+----------+
|       10 |
+----------+
1 row in set (0.21 sec)
obclient> select count(1) from enmo_hash partition (p0);
+----------+
| COUNT(1) |
+----------+
|        3 |
+----------+
1 row in set (0.01 sec)
obclient> select count(1) from enmo_hash partition (p1);
+----------+
| COUNT(1) |
+----------+
|        1 |
+----------+
1 row in set (0.00 sec)
obclient> select count(1) from enmo_hash partition (p2);
+----------+
| COUNT(1) |
+----------+
|        1 |
+----------+
1 row in set (0.15 sec)
obclient> select count(1) from enmo_hash partition (p3);
+----------+
| COUNT(1) |
+----------+
|        2 |
+----------+
1 row in set (0.00 sec)
obclient> select count(1) from enmo_hash partition (p4);
+----------+
| COUNT(1) |
+----------+
|        0 |
+----------+
1 row in set (0.01 sec)
obclient> select count(1) from enmo_hash partition (p5);
+----------+
| COUNT(1) |
+----------+
|        2 |
+----------+
1 row in set (0.00 sec)
obclient> select count(1) from enmo_hash partition (p6);
+----------+
| COUNT(1) |
+----------+
|        1 |
+----------+
1 row in set (0.01 sec)
obclient> select count(1) from enmo_hash partition (p7);
+----------+
| COUNT(1) |
+----------+
|        0 |
+----------+
1 row in set (0.00 sec)
obclient> 
obclient> insert into enmo_hash select * from enmo_hash;
Query OK, 10 rows affected (0.28 sec)
Records: 10  Duplicates: 0  Warnings: 0
obclient> insert into enmo_hash select * from enmo_hash;
Query OK, 20 rows affected (0.20 sec)
Records: 20  Duplicates: 0  Warnings: 0
obclient> insert into enmo_hash select * from enmo_hash;
Query OK, 40 rows affected (0.06 sec)
Records: 40  Duplicates: 0  Warnings: 0
......
obclient> insert into enmo_hash select * from enmo_hash;
Query OK, 327680 rows affected (5.69 sec)
Records: 327680  Duplicates: 0  Warnings: 0
obclient> insert into enmo_hash select * from enmo_hash;
ERROR-00600: internal error code, arguments: -4012, Timeout
obclient> 
obclient> show variables like '%timeout%';
+---------------------+-----------+
| VARIABLE_NAME       | VALUE     |
+---------------------+-----------+
| connect_timeout     | 10        |
| interactive_timeout | 28800     |
| net_read_timeout    | 30        |
| net_write_timeout   | 60        |
| ob_query_timeout    | 10000000  |
| ob_trx_idle_timeout | 120000000 |
| ob_trx_timeout      | 100000000 |
| wait_timeout        | 28800     |
+---------------------+-----------+
8 rows in set (0.09 sec)
obclient> show variables like '%commit%';
+---------------+-------+
| VARIABLE_NAME | VALUE |
+---------------+-------+
| autocommit    | ON    |
+---------------+-------+
1 row in set (0.05 sec)
obclient> set ob_query_timeout=1000000000;
Query OK, 0 rows affected (0.04 sec)
obclient> set ob_trx_timeout=1000000000;
Query OK, 0 rows affected (0.04 sec)
obclient> insert into enmo_hash select * from enmo_hash;
Query OK, 655360 rows affected (14.38 sec)
Records: 655360  Duplicates: 0  Warnings: 0
obclient>

复制

从SQL语法上来讲,几乎跟Oracle partition一致,这一点很赞。这下Oracle dba可以无缝切换了。 在进行数据insert时,我strace了一下observer进程,我们来看看情况。

[root@td1 yum.repos.d]# ps -ef|grep obs
root       529   450  0 10:55 pts/1    00:00:00 grep --color=auto obs
admin     4003     1 99 May27 ?        19:53:43 /home/admin/oceanbase/bin/observer -i ens192 -P 2882 -p 2881 -z zone1 -d /home/admin/oceanbase/store/obdemo -r 192.168.101.41:2882:2881 -c 20200525 -n obdemo -l ERROR -o memory_limit=36G,system_memory=10G,datafile_size=60G,config_additional_dir=/data/1/obdemo/etc3;/data/log1/obdemo/etc2
[root@td1 yum.repos.d]# strace -fr -o /tmp/ob.log -p 4003
strace: Process 4003 attached with 869 threads
^Cstrace: Process 4003 detached
strace: Process 4004 detached
.......
[root@td1 tmp]# cat ob.log |grep 'fildes='|head -20
4467       0.000006 io_submit(140663265980416, 1, [{data=0x7fec901098e0, pwrite, fildes=1681, str="\0\1\0\0\0\1\0\0\0\0\0\0\20\0\0\0\0\0\0\0\17U\0\5\246\254w\2652\345\0\0"..., nbytes=4096, offset=40599552}] <unfinished ...>
4467       0.000008 io_submit(140663265980416, 1, [{data=0x7fec901098e0, pwrite, fildes=1681, 
......
str="\306\32\4\300\250e)\0\0\vB\0\5\246\234[\345\306\32\0\5\246\254w\327\247}\0\0\0\0`"..., nbytes=4096, offset=40603648}] <unfinished ...>
4467       0.000004 io_submit(140663265980416, 1, [{data=0x7fec901098e0, pwrite, fildes=1681, str="\306\32\4\300\250e)\0\0\vB\0\5\246\234[\345\306\32\0\5\246\254w\327\247}\0\0\0\0`"..., nbytes=4096, offset=40603648}] <unfinished ...>
[root@td1 tmp]# 
[root@td1 tmp]# cat ob.log |grep 'fildes='|head -100|awk '{print $3 $7 $9 $10}'|sort |uniq -c
9 io_submit(140663265980416,fildes=1681,\2\5\5?\377\0\26\2-\377"...,nbytes=4096,
1 io_submit(140663265980416,fildes=1681,\2\5\5?\377\0\26\2-\377"...,nbytes=8192,
9 io_submit(140663265980416,fildes=1681,nbytes=4096,offset=40599552}]
13 io_submit(140663265980416,fildes=1681,nbytes=4096,offset=40603648}]
8 io_submit(140663265980416,fildes=1681,nbytes=4096,offset=40607744}]
10 io_submit(140663265980416,fildes=1681,nbytes=4096,offset=40611840}]
10 io_submit(140663265980416,fildes=1681,nbytes=4096,offset=40615936}]
3 io_submit(140663265980416,fildes=1681,nbytes=4096,offset=40624128}]
12 io_submit(140663265980416,fildes=1681,nbytes=4096,offset=40628224}]
13 io_submit(140663265980416,fildes=1681,nbytes=4096,offset=40632320}]
4 io_submit(140663265980416,fildes=1681,nbytes=4096,offset=40636416}]
1 io_submit(140663265980416,fildes=1681,nbytes=8192,offset=40599552}]
1 io_submit(140663265980416,fildes=1681,nbytes=8192,offset=40603648}]
1 io_submit(140663265980416,fildes=1681,nbytes=8192,offset=40607744}]
1 io_submit(140663265980416,fildes=1681,nbytes=8192,offset=40611840}]
1 io_submit(140663265980416,fildes=1681,nbytes=8192,offset=40615936}]
1 io_submit(140663265980416,fildes=1681,nbytes=8192,offset=40624128}]
1 io_submit(140663265980416,fildes=1681,nbytes=8192,offset=40628224}]
1 io_submit(140663265980416,fildes=1681,nbytes=8192,offset=40632320}]
[root@td1 fd]# ls -ltr|awk '{print $11}'|grep '/data/'| more
/data/1/obdemo/sstable/block_file
/data/log1/obdemo/slog
/data/log1/obdemo/ilog
/data/log1/obdemo/clog
/data/log1/obdemo/slog/1
/data/log1/obdemo/clog/5
[root@td1 fd]# ls -ltr > /tmp/ob_fd.log
[root@td1 fd]# cat /tmp/ob_fd.log |grep '/data'
lrwx------ 1 admin admin 64 May 28 10:58 740 -> /data/1/obdemo/sstable/block_file
lr-x------ 1 admin admin 64 May 28 10:58 737 -> /data/log1/obdemo/slog
lr-x------ 1 admin admin 64 May 28 10:58 1004 -> /data/log1/obdemo/ilog
lr-x------ 1 admin admin 64 May 28 10:58 1001 -> /data/log1/obdemo/clog
lrwx------ 1 admin admin 64 May 28 10:58 1983 -> /data/log1/obdemo/slog/1
lrwx------ 1 admin admin 64 May 28 10:58 1681 -> /data/log1/obdemo/clog/5
复制

不难看出ob这里使用了异步IO;但是每一笔交易都必须刷日志落盘到clog. clog即commit log. OB这里的写模式看起来很特殊,后面再研究一下。 最后我们来看看ob 的oracle兼容模式下,hash分区的数据是否均衡.

obclient> select count(1) from enmo_hash;
+----------+
| COUNT(1) |
+----------+
|  1310720 |
+----------+
1 row in set (1.38 sec)
obclient> select count(1) from enmo_hash partition (p0);
+----------+
| COUNT(1) |
+----------+
|   393216 |
+----------+
1 row in set (0.38 sec)
obclient> select count(1) from enmo_hash partition (p1);
+----------+
| COUNT(1) |
+----------+
|   131072 |
+----------+
1 row in set (0.14 sec)
obclient> select count(1) from enmo_hash partition (p2);
+----------+
| COUNT(1) |
+----------+
|   131072 |
+----------+
1 row in set (0.13 sec)
obclient> select count(1) from enmo_hash partition (p3);
+----------+
| COUNT(1) |
+----------+
|   262144 |
+----------+
1 row in set (0.25 sec)
obclient> select count(1) from enmo_hash partition (p4);
+----------+
| COUNT(1) |
+----------+
|        0 |
+----------+
1 row in set (0.00 sec)
obclient> select count(1) from enmo_hash partition (p5);
+----------+
| COUNT(1) |
+----------+
|   262144 |
+----------+
1 row in set (0.24 sec)
obclient> select count(1) from enmo_hash partition (p6);
+----------+
| COUNT(1) |
+----------+
|   131072 |
+----------+
1 row in set (0.13 sec)
obclient> select count(1) from enmo_hash partition (p7);
+----------+
| COUNT(1) |
+----------+
|        0 |
+----------+
1 row in set (0.00 sec)
复制

下看起来每个hash分区的数据分布并不够均匀。怀疑是测试方式不太对,我再次进行了测试。

obclient>  create table enmo_hash2(USERID NUMBER(38),CREATED date) partition by hash(USERID) partitions 4;
Query OK, 0 rows affected (0.11 sec)
obclient> select USERID,CREATED from sys.DBA_USERS;
+------------------+---------------------+
| USERID           | CREATED             |
+------------------+---------------------+
| 1100611139403782 | 2020-05-27 15:55:55 |
| 1100611139403783 | 2020-05-27 15:55:55 |
| 1100611139403784 | 2020-05-27 15:55:55 |
| 1100611139404827 | 2020-05-27 16:00:12 |
+------------------+---------------------+
4 rows in set (0.01 sec)
obclient> insert into enmo_hash2 select USERID,CREATED from sys.DBA_USERS;
Query OK, 4 rows affected (0.08 sec)
Records: 4  Duplicates: 0  Warnings: 0
........
obclient> insert into enmo_hash2 select * from enmo_hash2;
Query OK, 12 rows affected (0.02 sec)
Records: 12  Duplicates: 0  Warnings: 0
.......
obclient> insert into enmo_hash2 select * from enmo_hash2;
Query OK, 393216 rows affected (6.26 sec)
Records: 393216  Duplicates: 0  Warnings: 0
obclient> select count(1) from enmo_hash2;
+----------+
| COUNT(1) |
+----------+
|   786432 |
+----------+
1 row in set (0.80 sec)
obclient> select count(1) from enmo_hash2 partition (p0);
+----------+
| COUNT(1) |
+----------+
|        0 |
+----------+
1 row in set (0.01 sec)
obclient> select count(1) from enmo_hash2 partition (p1);
+----------+
| COUNT(1) |
+----------+
|   589824 |
+----------+
1 row in set (0.55 sec)
obclient> select count(1) from enmo_hash2 partition (p2);
+----------+
| COUNT(1) |
+----------+
|        0 |
+----------+
1 row in set (0.00 sec)
obclient> select count(1) from enmo_hash2 partition (p3);
+----------+
| COUNT(1) |
+----------+
|   196608 |
+----------+
1 row in set (0.18 sec)
复制

从第二次测试来看数据分布仍然非常不均衡,不知道为什么?知道的朋友请指正一下,谢谢!

这里针对前面的简单测试总结一下:

  1. ob能够较好的支持list,key,hash分区模式;

  2. 对于分区的drop操作,回收站是不起作用的;另外不支持truncate partition和move partition操作;

  3. 部分兼容Oracle的dba视图看上去数据不太对,说明兼容性还需要提高;

  4. SQL条件带分区键,SQL执行时会直接进行分区裁剪,这是标准的分区支持功能;

  5. hash分区的数据分布不太均衡,不知道是我的测试方式不对还是是单副本的缘故?

总的来说对Oracle的兼容说还不错,还支持了不少的dba_xxx视图,而且ob也有00600错误?Oracle dba们可以无缝切换啦!

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论