在 Teradata 中创建密钥
Posted
技术标签:
【中文标题】在 Teradata 中创建密钥【英文标题】:Creating key in Teradata 【发布时间】:2015-01-07 12:50:15 【问题描述】:所以当我更多地探索 Teradata 时,我遇到了一个问题。 这就是如何快速有效地创建代理键,
使用像 Informatica 这样的 ETL 工具有一个限制,它可以生成密钥,比如 Sequence Generator 最多只能创建 20 亿个,之后呢? Teradata 有一个标识列功能,可以替代使用,但不会妨碍并行性,例如它不会一次插入 1 行数据,并在插入另一行之前等待标识列的值增加。 如果是这种情况,应该怎么做才能以高性能插入数十亿行。如果我错了,请帮助我,对于 Teratada 的这项大技术是新手。
谢谢。
【问题讨论】:
【参考方案1】:Informatica 序列生成器的限制为 9223372036854775807。您可以将 Alpha_numneric 序列用于代理键,例如 A1、A2...A9223372036854775807,然后是 B1、B2...B9223372036854775807。这会将限制增加到 27*9223372036854775807,并且对于任何数据集,这个限制看起来都是无穷无尽的。为此,您需要设置序列生成器的循环属性。
【讨论】:
问题是序列生成器不是失败证明,如果你有提交间隔为 1000 并且你在 199 加载失败,序列生成器将不会回滚并且下次从 200 开始生成值,从而在密钥生成。现在考虑这个场景,你的提交间隔为 100 万。 然后我们可以使用可变端口进行序列生成(使用 Max+1),并且可以通过使用任何文件或数据库目标来保存最后一个 Max 值。请注意,对于大十进制计算,您必须在会话配置中启用高精度。【参考方案2】:您的里程可能会有所不同,但我们已经成功地通过在目标表中获取代理键的MAX()
来增加代理键,然后使用ROW_NUMBER()
来增加要插入的新记录的代理键目标表。
这种方法的成功取决于您的 ETL 方法。对我们来说,我们将数据加载到应用我们的转换的阶段表中。加载数据后,使用 MERGE
或简单的 UPDATE
/ INSERT
语句将数据的 UPSERT 暂存到目标表非常简单。
【讨论】:
以上是关于在 Teradata 中创建密钥的主要内容,如果未能解决你的问题,请参考以下文章
在 Teradata 中创建具有“with recursive”语句的递归视图
Teradata SQL 周数 - 从 1 月 1 日开始的第 1 周,周数与一周中的特定日期对齐