我目前正在开展一个项目,每周收集一次客户人口统计数据并将增量(从前几周)存储为新记录。这个过程将包含160个变量和几亿人(我的管理层和咨询公司需要这个,尽管~100个变量似乎毫无用处)。这些变量将从Teradata仓库中的9个不同表中收集。
我打算把它分成两个表。
由于备份限制,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速度是可以接受的。
请原谅我对此事的无知。我通常使用不会持续很长时间的大型表(我是专业的数据分析师),或者我为长期数据收集而构建的表只包含少量列。
答案 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中,您可以将单个表拆分为列分区表的两个行容器。
...