在Teradata中,群集表的定义非常简单,并且以一种语法存在(如果我错了,请纠正我)。
CREATE TABLE table_name (charcol1 varchar(10), idcol integer)
primary index (idcol);
我正在阅读有关在DB2中为对象创建无共享物理数据布局的大量“集群”表类型。
TD中定义的主索引会将表数据分布到TD服务器可用的所有节点/虚拟cpus中。
在DB2中实现相同的最接近的方法(和语法)是什么?
答案 0 :(得分:2)
我建议从此overview of data partitioning (concepts) for Db2开始。
以下三个子句演示了可以以任何组合方式一起使用的数据组织级别:
- DISTRIBUTE BY将数据均匀分布在数据库分区之间(以实现查询内并行性并平衡每个数据库分区上的负载)(数据库分区)
- PARTITION BY将同一数据分区(表分区)中具有单个维度的相似值的行分组
- ORGANIZE BY可以将同一表范围内的多个维度上具有相似值的行分组(多维聚类),或根据插入操作的时间分组行(插入时间聚类表)。
所有三个子句都可以在同一CREATE TABLE语句中使用。其用法取决于数据和预想的查询。
数据库分区(DISTRIBUTE BY)是您没有要求的共享内容。根据年份跨分区分配数据。
CREATE TABLE SALES
(CUSTOMER VARCHAR(80),
REGION CHAR(5),
YEAR INTEGER)
DISTRIBUTE BY HASH (YEAR)
答案 1 :(得分:1)
表在表空间中创建,表空间在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上,并且基于哈希在这些节点之间分配表数据根据{{1}}列的值计算得出的值。
YEAR
始终建议您明确指定一个表空间,除非选择Db2在没有这种规范的情况下使用的表空间规则适用于您的特定语句。
答案 2 :(得分:0)
这是用于OLAP系统还是OLTP?
很少将与DB2共享的内容用于OLTP。有托管的注意事项,重要的是一次提交的成本要高得多(两阶段提交)。
如果这是OLAP系统,那么您是否正在考虑按列组织的表?您可能不需要分区。