从CLR存储过程调用T-SQL存储过程

4
非常简短的背景: 我们正在利用CLR存储过程应用访问控制,在查询结果上使用Active Directory,以限制最终用户按照要求查看什么内容。简而言之,这是通过从datatable中删除行来完成的,在该行中,用户不满足访问结果(在本例中为文档)的条件。
以前,此筛选是在客户端显示结果之前完成的。 SQL 2008和更强大的服务器是将此访问过滤器从客户端移除的动力。
我想知道的是,与将“内联”T-SQL传递给comand对象(在本例中仅为原始T-SQL)相比,从CLR存储过程等效调用原始常规T-SQL存储过程是否有任何性能优势? 我找不到任何人提到这一点(部分原因可能是因为它作为CLR SPs的示例会非常令人困惑,我猜:-))。 对我来说,似乎你可能已经优化和编译了T-SQL存储过程?
有人能为我确认这一点吗?
希望我表述得足够清楚。非常感谢,
Colm.
1个回答

0

如果您的SQL CLR存储过程可以正确地执行特定查询(良好参数化)并经常执行它,那么该T-SQL查询将通过整个“确定最佳执行计划”序列仅运行一次,然后存储在SQL Server的计划缓存中(并且不会比类似的T-SQL存储过程更快地从中驱逐出去)。

因此,它将与您的原始T-SQL存储过程一样“预编译”。从这个角度来看,我没有看到任何好处。

如果您可以在SQL CLR过程内部调整SQL语句,使其实际上甚至不包括那些最终会被丢弃的行,那么执行良好参数化的T-SQL查询的SQL-CLR存储过程甚至可能比具有标准T-SQL存储过程返回太多数据需要再次排除某些行的速度更快。


这很有道理。我会研究一下调整SQL语句的方法。也许我可以将SIDs直接传递到T-SQL查询中,因为它们已经可用于CLR SP中对查询结果进行过滤。非常感谢你的帮助Marc。 - Colm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接