大表与多表 - 规范化数据

时间:2013-09-17 17:19:29

标签: teradata multiple-tables

我目前正在开展一个项目,每周收集一次客户人口统计数据并将增量(从前几周)存储为新记录。这个过程将包含160个变量和几亿人(我的管理层和咨询公司需要这个,尽管~100个变量似乎毫无用处)。这些变量将从Teradata仓库中的9个不同表中收集。

我打算把它分成两个表。

  1. 经常使用的人口统计数据表(约有60个来自3个表的变量)
    • 规范化(1个客户ID并为每个人口统计变量添加日期)
  2. 表格很少或未使用的人口统计数据(约有100个来自6个表的变量)
    • 规范化(1个客户ID并为每个人口统计变量添加日期)
  3. 由于备份限制,MVC用于节省尽可能多的空间,因为它将存在的数据库的大小有限。 (注意客户ID目前占表1大小的30%(3.5gb),因此额外的表会增加存储成本)

    将通过查找与分析师选择的日期相关的最新记录来访问表格:

    SELECT cus_id,demo
        FROM db1.demo_test 
        WHERE (cus_id,add_dt) IN (
            SELECT cus_id, MAX(add_dt) 
                FROM db1.dt_test 
                WHERE add_dt <= '2013-03-01'  -- Analyst selected Point-in-Time Date
             GROUP BY 1)
    GROUP BY 1,2
    

    此数据将用于建模目的,因此合理的SELECT速度是可以接受的。

    1. 这种方法对于存储和查询是否合理?
      • 是否有任何个别表太大?
    2. 有更好的建议方法吗?
      • 我对进一步分裂的担忧是
        • 由于日期和客户ID等不可压缩字段造成的空间
        • 加入2-3个表格的速度(我怀疑内部联接可能会使用非常少的资源。)
    3. 请原谅我对此事的无知。我通常使用不会持续很长时间的大型表(我是专业的数据分析师),或者我为长期数据收集而构建的表只包含少量列。

2 个答案:

答案 0 :(得分:2)

160列的表的宽度,稀疏填充不一定是不正确的物理实现(在3NF中标准化或略微去标准化)。我还看到了非定期访问的属性被移动到文档表的情况。如果您选择在实际实施中实施后者,那么每个表共享相同的主索引将符合您的最佳利益。这允许将这些表(60个属性和100个属性)连接到Teradata上的AMP本地。

如果表格的访问权限也包含add_dt列,您可能希望在此列上创建分区主索引。这将允许优化器在查询的WHERE子句中包含add_dt列时消除其他分区的扫描。另一种选择是测试add_dt列上值有序二级索引的行为。

答案 1 :(得分:2)

Rob的评论:

您当前的PI /分区是什么?

目前的表现不令人满意吗?

分析师如何在时间点,任何其他常见条件下访问?

根据您的需要,(prev_dt,add_dt)可能比单个add_dt更好。加载的开销更大,但查询可能与日期一样简单...在prev_dt和end_dt之间。

(cus_id)上的连接索引,(add_dt)也可能有用。

你可以用一个RANK替换MAX(子查询)(MAX通常较慢,只有当cus_id是PI RANK可能更差时):

SELECT *
FROM db1.demo_test 
QUALIFY 
  RANK() OVER (PARTITION BY cus_id ORDER BY add_dt DESC) = 1

在TD14中,您可以将单个表拆分为列分区表的两个行容器。

...