0

我正在尝试加入两个表(阶段和目标)以进行更改数据捕获。加入表格时,我有两个选择,

  1. 加入主键的每一列部分(STG.KEY_1=TGT.KEY_1 AND STG.KEY_2=TGT.KEY_2)
  2. 根据Key Columns的MD5值加入(MD5(STG.KEY_1||STG.KEY_2)=MD5(TGT.KEY_1||TGT.KEY_2)

性能和成本会有区别吗?

我用 10 万条记录的表尝试了两种方法,但使用历史选项卡统计数据并没有太大区别。

逻辑上 PK KEY join 更有意义,但有什么方法可以证明这一点?

4

2 回答 2

1

使用自然键有时可以比散列具有性能优势,但前提是满足多个条件。

雪花分区修剪发生在两个级别,一个在编译期间,一个在执行期间。通常编译时修剪比执行时修剪修剪更多的微分区。连接时的修剪发生在执行期间。如果您使用自然键,例如简单的递增整数,并且如果您在连接之前至少过滤一个表,那么另一个表也有可能从执行时修剪(也称为动态修剪)中受益。例如,如果您有一个连接将一侧限制为一个月的数据,并且在一个范围内的 PK 上具有自然顺序,则另一个表也有可能按日期范围排列在具有相关 FK 的微分区中在同一范围内。

使用散列消除了这种可能性,因为散列算法将熵应用于散列 - 不再有任何自然排序。如果您使用哈希并且它们的性能与原始密钥大致相同,则密钥不符合帮助修剪的条件或效果可以忽略不计。如果您使用散列,最好将键定义为 BINARY 类型而不是 VARCHAR。

于 2021-09-22T14:50:22.023 回答
1

当数据暂存时包含一个哈希列,当加载该数据时,该哈希列包含在加载中,因此未来的比较将与目标中已经存在的单个哈希列进行比较。

不要即时进行哈希比较,逐列比较几乎没有什么区别,这也将简化您的代码。选择创建哈希列时,请确保它是二进制数据类型,二进制使用 varchar 的一半字节长度。

于 2021-09-23T00:41:01.083 回答