更新大复制维度(SQL Server PDW)


8

我们将SQL Server PDW设备用于我们的数据仓库。我们仓库中的表之一是具有约2000万行的复制表。作为ETL流程的一部分,我们需要使该维度的旧记录过期;但是,我们看到更新少数记录(<100)需要1个小时以上才能完成。如果可以的话,这就是我想要改进的地方。

自然,我想到的一个选择就是将“维度”从“复制”更改为“分布式”。我的测试表明,这将解决ETL过程花费很长时间(从1.5个小时降低到30秒)的问题,但是针对此维度的分布式版本的所有联接都将受到影响,因为联接几乎从未基于同一分布柱。当我查看其中一些查询的执行计划时,通常会看到ShuffleMoveBroadcastMove操作。

因此,我对PDW专家的问题是:

为了提高在此Dimension 的复制版本中更新记录的性能,是否可以做其他事情?

再一次,移动到分布式表似乎不是最好的解决方案,因为它会影响其他人开发的数百个已编写的SQL查询和报告。


1
我在这里没有看到很多PDW问题,如果您没有得到答案,请尝试MSDN SQL Server论坛。响应速度也很快。祝好运。
阿里·拉泽吉

Answers:


5

几个问题。2000万行不一定那么大。

您正在使用什么过程立即执行更新和删除?

维是聚集列索引,聚集索引还是堆?

您是说在更新和删除此表时存在移动,还是将表从复制表更改为分布式表时才看到移动?

如果是后者,就不足为奇了。您不太可能加入和聚合。如果您要通过更新/删除来触发移动,那么我们可以看一下-尽管一个具体的示例会有所帮助。

一般而言,我将从尝试保持ETL简单开始。

对维度使用CTAS,仅选择要保留的行,并在任何新行中合并,并使用CASE拾取所有更改(将UPDATE转换为CTAS中的转换)。完成后,您可以使用一对RENAME OBJECT命令从当前表切换到新表。这给您带来了桌子历史视图的额外好处-您可以在闲暇时放下。


1

复制不会阻止您使用分区。对表进行分区。

然后,对于需要删除或更新的行,使用LEFT JOIN和COALESCE将整个分区CTAS到新表中,从更改后的行中获取适当的(即新的)更新值,同时保留所需的行并排除你不知道的

最后,使用旧分区对新表进行分区切换。

并做了 :)

以我的经验,PDW不喜欢更新和删除。CTAS和分区开关运行良好。


1

PDW中的UPDATE语句仅部分并行,而不像CTAS那样完全并行。

也就是说,这很可能取决于索引。您正在运行的实际代码是什么?您是否有索引来帮助查找您即将到期的记录?您仍然需要应用一些标准调整技术,即将非聚簇索引应用于行存储表。PDW不支持主键的事实通常似乎意味着人们忘记了为其自然键编制索引,因此不要陷入困境……

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.