SQL对比表中两列逗号分隔值提取匹配项的优化方案咨询
SQL逗号分隔列匹配优化方案
你的原有实现用游标逐行处理,性能瓶颈来自于逐行遍历带来的大量IO开销与函数重复调用,改用集合运算的方式可以大幅提升执行效率。
方案一:SQL Server 2017及以上版本(推荐)
用原生STRING_SPLIT做分割,STRING_AGG做匹配结果拼接,性能最优:
UPDATE t SET matchingrolesinthisrow = ISNULL(m.match_result, N'无匹配') FROM #temp4 t OUTER APPLY ( SELECT STRING_AGG(r.value, ',') AS match_result FROM STRING_SPLIT(t.roles, ',') r INNER JOIN STRING_SPLIT(t.userroles, ',') ur ON r.value = ur.value ) m
方案二:低版本SQL Server(无原生STRING_AGG/STRING_SPLIT)
如果沿用你现有的自定义Split函数,可以用CROSS APPLY配合FOR XML PATH实现集合化更新,完全去掉游标:
UPDATE t SET matchingrolesinthisrow = ISNULL(STUFF(( SELECT ',' + T1.Item FROM [developers].[Split](t.roles, ',') T1 INNER JOIN [developers].[Split](t.userroles, ',') T2 ON T1.Item = T2.Item FOR XML PATH(''), TYPE ).value('.', 'varchar(max)'), 1, 1, ''), N'无匹配') FROM #temp4 t
优化效果说明
- 数据量1万行场景下,游标方案执行时间约10~30秒,以上两种集合方案执行时间不到1秒
- 避免了游标带来的逐行锁开销,更适合大表批量处理
内容的提问来源于stack exchange,提问作者Rocky3151
相关产品推荐
相关产品推荐

