【问题标题】:DB2 equivalency for Teradata clustered tablesTeradata 聚簇表的 DB2 等效性
【发布时间】:2019-06-13 13:56:31
【问题描述】:

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

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

我了解到,在为对象创建无共享物理数据布局方面,DB2 中有许多“集群”表类型。

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

在 DB2 中最接近的方法(和语法)是什么?

【问题讨论】:

  • 这是为了了解语法还是为了实现(性能/架构)目标?
  • 性能匹配但易于维护/设计

标签: db2 teradata db2-luw udb


【解决方案1】:

我建议从 overview of data partitioning (concepts) for 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)

【讨论】:

    【解决方案2】:

    表是在表空间中创建的,表空间是在 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
    ...
    

    这意味着如果您运行以下语句,则该表将在位于数据库分区(节点)0-3 上的表空间USERSPACE1 中创建,并且表数据基于计算的哈希值在这些节点之间分布YEAR 列的值。

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

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

    【讨论】:

      【解决方案3】:

      这是用于 OLAP 系统还是 OLTP?

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

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

      【讨论】:

      • OLAP。按列组织的表是一个有趣的想法(从 Sybase IQ 回来,作为此类的先驱之一)。
      猜你喜欢
      • 1970-01-01
      • 2011-04-22
      • 1970-01-01
      • 2014-09-14
      • 2015-06-27
      • 2015-06-13
      • 1970-01-01
      • 2021-05-09
      • 2010-10-22
      相关资源
      最近更新 更多