4
使用SQL CLR标量函数模拟HASHBYTES的可伸缩方法是什么?
作为ETL流程的一部分,我们将暂存中的行与报表数据库进行比较,以找出自从上次加载数据以来是否实际更改了任何列。 比较是基于表的唯一键和所有其他列的某种哈希值。我们目前使用HASHBYTES该SHA2_256算法,并且发现如果许多并发工作线程都在调用,则该算法无法在大型服务器上扩展HASHBYTES。 在96台核心服务器上进行测试时,以每秒哈希数衡量的吞吐量不会增加超过16个并发线程。我通过将并发MAXDOP 8查询数从1 更改为12进行测试。测试MAXDOP 1显示了相同的可伸缩性瓶颈。 作为一种解决方法,我想尝试一个SQL CLR解决方案。这是我尝试陈述要求的尝试: 该功能必须能够参与并行查询 函数必须是确定性的 该函数必须接受NVARCHAR或VARBINARY字符串的输入(所有相关列都串联在一起) 字符串的典型输入大小为100-20000个字符。20000不是最大值 哈希冲突的机会应大致等于或优于MD5算法。CHECKSUM对我们不起作用,因为有太多的碰撞。 该功能必须在大型服务器上很好地扩展(随着线程数量的增加,每个线程的吞吐量不应显着降低) 对于Application Reasons™,假定我无法保存报表的哈希值。这是一个不支持触发器或计算列的CCI(还有其他我不想讨论的问题)。 HASHBYTES使用SQL CLR函数进行仿真的可扩展方式是什么?我的目标可以表示为在大型服务器上每秒获得尽可能多的哈希,因此性能也很重要。我对CLR感到很糟糕,所以我不知道该如何完成。如果它激励任何人回答,我计划在可能的情况下尽快为这个问题添加赏金。下面是一个示例查询,它非常粗略地说明了用例: DROP TABLE IF EXISTS #CHANGED_IDS; SELECT stg.ID INTO #CHANGED_IDS FROM ( SELECT ID, CAST( HASHBYTES ('SHA2_256', CAST(FK1 AS NVARCHAR(19)) + CAST(FK2 AS NVARCHAR(19)) + CAST(FK3 AS NVARCHAR(19)) + CAST(FK4 AS NVARCHAR(19)) + …