0

在 Teradata 中,聚簇表的定义非常简单,并且存在于单一语法中(如果我错了,请纠正我)。

CREATE TABLE table_name (charcol1 varchar(10), idcol integer)
primary index (idcol);

我读到 DB2 中有很多关于为对象创建无共享物理数据布局的“集群”表类型。

TD 中定义的主索引会将表数据分布在 TD 服务器可用的所有节点/虚拟 CPU 上。

在 DB2 中实现相同目标的最接近的方法(和语法)是什么?

4

3 回答 3

2

我建议从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)
于 2019-05-30T05:42:55.157 回答
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 上的表空间中创建,并且表数据基于根据YEAR列值计算的哈希值在这些节点之间分布。

CREATE TABLE SALES 
(
  CUSTOMER   VARCHAR(80)
, REGION     CHAR(5)
, YEAR       INTEGER
)
IN USERSPACE1
DISTRIBUTE BY HASH (YEAR);

始终建议显式指定表空间,除非在没有此类规范的情况下选择 Db2 使用的此类表空间的规则适用于您的特定语句。

于 2019-05-30T07:55:02.333 回答
0

这是用于 OLAP 系统还是 OLTP?

Shared nothing with DB2 很少用于 OLTP。有托管方面的考虑,重要的是提交的成本要高得多(2阶段提交)。

如果这是一个 OLAP 系统,那么您是否正在考虑按列组织的表?您可能不需要分区。

于 2019-06-13T05:56:31.923 回答