Ica*_*rus 8 data-warehouse sql-server sql-server-pdw
我们将SQL Server PDW 设备用于我们的数据仓库。我们仓库中的一个表是一个复制表,大约有 2000 万行。作为我们 ETL 过程的一部分,我们需要使这个维度的旧记录过期;但是,我们看到更新少量记录 (<100) 需要 1 个多小时才能完成。如果可以的话,这是我想改进的地方。
当然,我想到的一个选择是将这个维度从复制更改为分布式。我的测试表明,它可以解决 ETL 过程耗时较长的问题(从 1.5 小时缩短到 30 秒),但是针对此维度的分布式版本的所有连接都会受到影响,因为连接几乎从不基于相同的分布柱子。当我查看其中一些查询的执行计划时,我通常会看到ShuffleMove或BroadcastMove操作。
所以我对 PDW 大师的问题是:
还有什么可以做的以提高此维度的复制版本中更新记录的性能吗?
同样,迁移到分布式表似乎不是最好的解决方案,因为它会影响数百个已编写的 SQL 查询和其他人开发的报告。
小智 5
几个问题。2000 万行不一定那么大。
您现在正在使用什么过程来执行更新和删除?
该维度是 CLUSTERED COLUMNSTORE INDEX、CLUSTERED INDEX 还是 HEAP?
您是说更新和删除此表时有移动,还是在将表从复制更改为分布式时才看到移动?
如果是后者,也就不足为奇了。您不太可能与连接和聚合兼容。如果你正在做一些事情来通过你的更新/删除来触发移动,那么我们可以看看——尽管一个具体的例子会有所帮助。
一般而言,我会首先尝试保持 ETL 简单。
针对维度使用 CTAS 仅选择要保留的行,合并任何新行并使用 CASE 获取任何更改(将 UPDATE 转换为 CTAS 中的转换)。完成后,您可以使用一对 RENAME OBJECT 命令从当前表切换到新表。这为您提供了一个额外的好处,即拥有您的桌子的历史视图 - 您可以在闲暇时放下。
小智 1
被复制并不会阻止您使用分区。对表进行分区。
然后,对于需要删除或更新的行,CTAS 将整个分区放入一个新表中,使用 LEFT JOIN 和 COALESCE 从更改的行中获取适当的(即新的)更新值,同时保留所需的行并排除那些你不知道的。
最后,将新表与旧分区进行分区切换。
并做了 :)
根据我的经验,PDW 不喜欢更新和删除。CTAS 和分区开关工作良好。