在 Teradata 中,聚簇表的定义非常简单,并且存在于单一语法中(如果我错了,请纠正我)。
CREATE TABLE table_name (charcol1 varchar(10), idcol integer)
primary index (idcol);
我读到 DB2 中有很多关于为对象创建无共享物理数据布局的“集群”表类型。
TD 中定义的主索引会将表数据分布在 TD 服务器可用的所有节点/虚拟 CPU 上。
在 DB2 中实现相同目标的最接近的方法(和语法)是什么?
我建议从Db2 的数据分区(概念)概述开始。
以下三个子句展示了可以以任意组合方式一起使用的数据组织级别:
- DISTRIBUTE BY 在数据库分区之间均匀分布数据(以启用查询内并行性并平衡每个数据库分区之间的负载)(数据库分区)
- PARTITION BY 对同一数据分区中单个维度具有相似值的行进行分组(表分区)
- ORGANIZE BY 对同一表范围内多个维度上具有相似值的行进行分组(多维集群)或根据插入操作的时间对行进行分组(插入时间集群表)。
所有三个子句都可以在同一个CREATE TABLE语句中使用。它的使用取决于数据和设想的查询。
数据库分区 (DISTRIBUTE BY) 是您要求的无共享。根据 YEAR 跨分区分布数据。
CREATE TABLE SALES
(CUSTOMER VARCHAR(80),
REGION CHAR(5),
YEAR INTEGER)
DISTRIBUTE BY HASH (YEAR)
表是在表空间中创建的,表空间是在 Db2 for LUW 中的数据库分区组(或您可以根据需要创建的节点集)中创建的。
您可以使用以下查询来了解哪些表空间驻留在哪些数据库分区组中。
SELECT
-- T.TBSPACEID, T.TBSPACETYPE
CASE T.DATATYPE
WHEN 'A' THEN 'REGULAR'
WHEN 'L' THEN 'LARGE'
WHEN 'T' THEN 'SYSTEMP'
WHEN 'U' THEN 'USRTEMP'
END DATATYPE
, T.DBPGNAME
--, T.PAGESIZE
, T.TBSPACE
--, B.BPNAME
--, G.MIN_NODENUM, G.MAX_NODENUM, G.NODE_COUNT
, G.NODES_LIST
FROM SYSCAT.TABLESPACES T
JOIN SYSCAT.BUFFERPOOLS B ON B.BUFFERPOOLID=T.BUFFERPOOLID
LEFT JOIN (
SELECT
DBPGNAME
, COUNT(*) NODE_COUNT
, MIN(DBPARTITIONNUM) MIN_NODENUM
, MAX(DBPARTITIONNUM) MAX_NODENUM
, LISTAGG(DBPARTITIONNUM, ',') WITHIN GROUP (ORDER BY DBPARTITIONNUM) NODES_LIST
FROM SYSCAT.DBPARTITIONGROUPDEF
GROUP BY DBPGNAME
) G ON G.DBPGNAME=T.DBPGNAME
ORDER BY T.TBSPACEID;
假设您得到以下结果:
DATATYPE DBPGNAME TBSPACE NODES_LIST
-------- --------------- ---------- ----------
...
LARGE IBMDEFAULTGROUP USERSPACE1 0,1,2,3
...
这意味着如果您运行以下语句,则该表将在USERSPACE1位于数据库分区(节点)0-3 上的表空间中创建,并且表数据基于根据YEAR列值计算的哈希值在这些节点之间分布。
CREATE TABLE SALES
(
CUSTOMER VARCHAR(80)
, REGION CHAR(5)
, YEAR INTEGER
)
IN USERSPACE1
DISTRIBUTE BY HASH (YEAR);
始终建议显式指定表空间,除非在没有此类规范的情况下选择 Db2 使用的此类表空间的规则适用于您的特定语句。
这是用于 OLAP 系统还是 OLTP?
Shared nothing with DB2 很少用于 OLTP。有托管方面的考虑,重要的是提交的成本要高得多(2阶段提交)。
如果这是一个 OLAP 系统,那么您是否正在考虑按列组织的表?您可能不需要分区。