【问题标题】:Best approaches to UPDATE the data in tables - Teradata更新表中数据的最佳方法 - Teradata
【发布时间】:2017-04-07 01:50:05
【问题描述】:

我是Teradata 的新手,幸运的是有机会处理DDL-DML 的两个语句。

我观察到的一件事是 Teradata 在处理UPDATE 具有大量记录的表中的数据时非常慢。

我在 Google 上找到的执行此更新的最简单方法是编写带有 CASEINSERT-SELECT 语句,该列包含要使用新值更新的值。

但是当这种情况出现在Data Warehouse 环境中时,当我们需要从包含数百万行的表中更新多个列时怎么办? 哪种方法最好遵循?

INSERT-SELECTMERGE-UPDATEMLOAD ?

不确定上述任何方法是否未用于此UPDATE 操作。

提前谢谢你!

【问题讨论】:

  • 如果不能使用索引,则更新需要全表扫描,但通常很快(仅更新主索引或分区列很慢,但无论如何都是不好的做法)。此外,巨大的更新可能会导致巨大的瞬态日志。表中的行数和更新行的百分比是多少?您的更新是如何编码的?
  • @Dnoeth 目前我们在事实表中有 382,​​851,001 # 行。但这是每周每月的增量。所以现在我们可以使用 INSERT-SELECT 方法。但是很快,由于空间限制,在我们的案例中这将失败。仅供参考,我们有不止一个列用户一个 PI 和表是一个 mutliset。通常我们需要更新不是 PI 的列。
  • 任何辅助/连接索引? MERGE 通常比 UPDATE 好(可能避免假脱机)。您的更新是如何编码的?一个巨大的 Select 表还是一个源表?
  • @dnoeth,表中没有使用二级索引。更新也很简单,加入。例如:- 从事实更新事实,暗集 col1 = col2 where ...

标签: performance teradata


【解决方案1】:

在企业级别,我们预计数量会很大,并且更新通常是一些计划的作业/脚本的一部分。

由于数据量巨大,更新是一项代价高昂的操作,如果更新失败(由于回退日志),可能会在一段时间内阻塞表。尽管脚本经过了很好的测试,并且在生产环境中很少发生故障,但最好将需要更新的数据以所需的形式加载到临时表中,并在删除匹配的记录后插入到同一个表中以维护 SCD-1(其中我们不保留历史记录)。

【讨论】:

  • MLOAD 实用程序可以用于此目的吗?如果是,它会提供更好的性能吗?
  • 当我们谈论对表的更新时,其他加载和导出实用程序移出了画面(快速加载、快速导出和 BTEQ:不适合批量)。剩下的是 MLoad 或 TPump。 Mload 在性能上击败了 TPump,除非并且直到更新发生在非常少量的记录上。当这种情况发生时,TPump 的性能可能会接近 Mload。 Mload 在块级别上运行,而 TPump 在行级别上运行。
猜你喜欢
  • 2016-03-16
  • 1970-01-01
  • 2023-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多