5.举例说明
5.1 创建垂直分区表
CREATE TABLE TT(C1 INT CLUSTER PRIMARY KEY, C2 INT, C3 VARCHAR(100), C4 VARCHAR(300)) PARTITION BY COLUMN(C2);
系统内部将创建3张表,分别是垂直分区基表TT,垂直分区子表TT0DMPART和TT1DMPART。分区子表的命名规则是,在主表名之后附加后缀NDMPART,其中N为0、1、2…。
5.2 查看表定义
调用系统函数TABLEDEF,查看系统创建的3张表定义如下:
SELECT TABLEDEF('SYSTEM', 'SYSDBA', 'TT');
CREATE TABLE "TT" AT "SYSTEM"(
"C1" INTEGER NOT NULL,
"C2" INTEGER,
"C3" VARCHAR(100),
"C4" VARCHAR(300),
CLUSTER PRIMARY KEY("C1"))
PARTITION BY COLUMN(("C1", "C2"), ("C1", "C3"))
SELECT TABLEDEF('SYSTEM', 'SYSDBA', 'TT0DMPART');
CREATE TABLE "TT0DMPART" AT "SYSTEM"(
"C1" INTEGER NOT NULL,
"C2" INTEGER,
CLUSTER PRIMARY KEY("C1"))
SELECT TABLEDEF('SYSTEM', 'SYSDBA', 'TT1DMPART');
CREATE TABLE "TT1DMPART" AT "SYSTEM"(
"C1" INTEGER NOT NULL,
"C3" VARCHAR(100),
"C4" VARCHAR(300),
CLUSTER PRIMARY KEY("C1"))
CREATE TABLE "TT" AT "SYSTEM"(
"C1" INTEGER NOT NULL,
"C2" INTEGER,
"C3" VARCHAR(100),
"C4" VARCHAR(300),
CLUSTER PRIMARY KEY("C1"))
PARTITION BY COLUMN(("C1", "C2"), ("C1", "C3"))
SELECT TABLEDEF('SYSTEM', 'SYSDBA', 'TT0DMPART');
CREATE TABLE "TT0DMPART" AT "SYSTEM"(
"C1" INTEGER NOT NULL,
"C2" INTEGER,
CLUSTER PRIMARY KEY("C1"))
SELECT TABLEDEF('SYSTEM', 'SYSDBA', 'TT1DMPART');
CREATE TABLE "TT1DMPART" AT "SYSTEM"(
"C1" INTEGER NOT NULL,
"C3" VARCHAR(100),
"C4" VARCHAR(300),
CLUSTER PRIMARY KEY("C1"))
可以看到系统自动创建的分区子表,都包含了CLUSTER PK列C1,C2列位于分区子表TT0DMPART中,而C3,C4列位于分区子表TT1DMPART中。
5.3 查看查询计划
EXPLAIN SELECT * FROM TT;
#RSET:[0, 1, 0];
#XNLP:[0, 1, 0]; CROSS_JOIN
#CSEK:[2, 1, 0]; INDEX33560184(TT1DMPART), FULL_SCAN
#CSEK:[0, 0, 0]; INDEX33560183(TT0DMPART), INDEX_EQU_SEARCH
EXPLAIN SELECT C2 FROM TT;
#RSET:[2, 1, 0];
#CSEK:[2, 1, 0]; INDEX33560183(TT0DMPART), FULL_SCAN
EXPLAIN SELECT C2 FROM TT WHERE C1 = 1;
#RSET:[0, 0, 0];
#CSEK:[0, 0, 0]; INDEX33560183(TT0DMPART), INDEX_EQU_SEARCH
#RSET:[0, 1, 0];
#XNLP:[0, 1, 0]; CROSS_JOIN
#CSEK:[2, 1, 0]; INDEX33560184(TT1DMPART), FULL_SCAN
#CSEK:[0, 0, 0]; INDEX33560183(TT0DMPART), INDEX_EQU_SEARCH
EXPLAIN SELECT C2 FROM TT;
#RSET:[2, 1, 0];
#CSEK:[2, 1, 0]; INDEX33560183(TT0DMPART), FULL_SCAN
EXPLAIN SELECT C2 FROM TT WHERE C1 = 1;
#RSET:[0, 0, 0];
#CSEK:[0, 0, 0]; INDEX33560183(TT0DMPART), INDEX_EQU_SEARCH
分析上述查询计划,可以获知,如果查询列只涉及某个分区子表情况下,系统只需要扫描特定的分区子表数据。由于分区子表中包含的数据比分区前少的多,因此可以极大的减少扫描物理页的数量,从而提升系统性能。
但是,当查询列分布在不同分区子表中,系统需要通过连接查询,从分区子表中获取数据,这将对系统性能产生负面影响。
因此,用户应该根据实际应用情况,科学划分,慎重使用垂直分区来提升系统性能。