非常简短的背景: 我们正在利用CLR存储过程来使用Active Directory对查询结果应用访问控制,以限制最终用户可以相应地看到的内容。简而言之,这是通过从数据表中删除行来完成的,其中用户不满足访问结果的条件(在本例中为文档)。
此过滤先前已在客户端上完成,然后才显示结果。 SQL 2008和功能更强大的服务器是将此访问过滤从客户端移除的动机。
我想知道的是,从CLR存储过程等效中调用原始常规T-SQL存储过程是否有任何性能优势,而不是将“内联”T-SQL传递到命令对象(在这种情况下只是原始的T-SQL,它是一个存储过程)?我找不到有人提到这个的地方(部分原因可能是因为作为CLR SP的一个例子会非常令人困惑,我猜:-))。 在我看来,你可能会,因为T-SQL存储过程已经被优化和编译?
有人能够为我确认这个吗?
希望我已经足够清楚了。非常感谢,
科尔姆。
答案 0 :(得分:0)
如果您的SQL CLR存储过程正确地执行了特定查询(很好地参数化)并且相当频繁地执行它,那么该T-SQL查询将在整个“确定最佳执行计划”序列中运行一次,然后存储在SQL Server的计划缓存(并且不会比类似的T-SQL存储过程更快地从中驱逐)。
因此,它将与原始T-SQL存储过程一样“预编译”。从这个角度来看,我认为没有任何好处。
如果您可以从SQL CLR过程中调整SQL语句,使得它实际上甚至不会将这些行包含到最终将丢弃的结果集中,那么您的SQL-CLR就存储了执行正确参数化的T-SQL查询的过程甚至可能比标准T-SQL存储过程返回太多数据要快一些,您需要从中再次排除某些行。