上海腾科教育达梦数据库培训干货分享国产数据库DM6初体验(2)

下面来体验下,创建一个垂直分区表:

create table test_part(
id int ,
t1 varchar(10),
t2 varchar(10),
t3 varchar(10),
t4 varchar(10),
CLUSTER PRIMARY KEY(id)
)
partition by column
((id,t1,t2),
(id,t3,t4)
);

  通过DM的系统表sysparttables 查看当前分区表信息:

SQL>select * from sysparttables;
BASE_TABLE_ID        PART_TABLE_ID        RESVD1        RESVD2        RESVD3        RESVD4        RESVD5        
1    1007        1008        NULL    NULL    NULL    NULL    NULL    
2    1007        1009        NULL    NULL    NULL    NULL    NULL    
2 rows got
time used: 0.268(ms).

  我们能看到基表ID是1007,分区子表ID式1008,1009。那么我们找出1007,1008,1009这三个表。

SQL>select name from systables where id=1007;
name    
1    test_part    
1 rows got
time used: 0.301(ms).
SQL>select name from systables where id=1008;
name        
1    test_part00DMPART    
1 rows got
time used: 0.236(ms).
SQL>select name from systables where id=1009;
name        
1    test_part01DMPART    
1 rows got
time used: 0.185(ms).

  我们利用tabledef 函数验证下这三个表的定义。

SQL>select tabledef('mytest','sysdba','test_part');
1    CREATE TABLE "test_part" AT "mytest"
(
"id" INTEGER,
"t1" VARCHAR(10),
"t2" VARCHAR(10),
"t3" VARCHAR(10),
"t4" VARCHAR(10),
CLUSTER PRIMARY KEY("id"))PARTITION BY COLUMN(("id", "t1", "t2"), ("id", "t3", "t4"))
1 rows got
time used: 0.228(ms).

SQL>select tabledef('mytest','sysdba','test_part00DMPART');
1    CREATE TABLE "test_part00DMPART" AT "mytest"
(
"id" INTEGER,
"t1" VARCHAR(10),
"t2" VARCHAR(10),
CLUSTER PRIMARY KEY("id"))    
1 rows got
time used: 0.290(ms).

SQL>select tabledef('mytest','sysdba','test_part01DMPART');
1    CREATE TABLE "test_part01DMPART" AT "mytest"
(
"id" INTEGER,
"t3" VARCHAR(10),
"t4" VARCHAR(10),
CLUSTER PRIMARY KEY("id"))    
1 rows got
time used: 0.292(ms).

  可以看到系统自动创建的分区子表,都包含了CLUSTER PK列id,t1,t2列位于分区子表test_part00DMPART中,而t3,t4列位于分区子表test_part01DMPART中。

SQL>explain select * from test_part;
#RSET:[2, 2, 0];
    #XNLP:[0, 0, 0]; CROSS_JOIN
        #CSEK:[2, 2, 0]; INDEX33555488(test_part00DMPART), FULL_SCAN
        #CSEK:[2, 2, 0]; INDEX33555489(test_part01DMPART), INDEX_EQU_SEARCH
time used: 7.339(ms).
SQL>explain select t1,t2 from test_part;
#RSET:[2, 2, 0];
    #CSEK:[2, 2, 0]; INDEX33555488(test_part00DMPART), FULL_SCAN
time used: 0.212(ms).
SQL>explain select t3,t4 from test_part;
#RSET:[2, 2, 0];
    #CSEK:[2, 2, 0]; INDEX33555489(test_part01DMPART), FULL_SCAN
time used: 0.199(ms).

  从执行计划可以明显看出,当全表查询时,其实是把2个子表JOIN得出结果。而当只查询子表所有的列时,只需要查询子表。在实际应有中,遇到类似上面的例子的情况,使用垂直分区将会大大减少了查询数据量,提高了查询效率,以优化系统性能。

猜你喜欢

转载自blog.csdn.net/qq_42726883/article/details/108651454