SQL Server CLR 过程和 SQLCLR_QUANTUM_PUNISHMENT

Dea*_*one 6 sql-server wait-types sql-clr sql-server-2014

我有一个在 SQL Server 2014 上运行的 CLR 存储过程。这个存储过程收集一些数据(通常在数万行范围内编号),对数据运行一些计算,生成一个输出数据集,并写入该输出数据集到几个目标表。对于小型运行,这需要几秒钟。对于我们较大的运行,目前大约需要 25 分钟。在这 25 分钟内,我们观察到大量 SQLCLR_QUANTUM_PUNISHMENT 等待。所以我试图让自己了解我们可以做些什么来减少这些等待的发生。我发现大量资源告诉我,“当 CLR 任务因超出其执行量而受到限制时发生。这种限制是为了减少此资源密集型任务对其他任务的影响。” 和我' 已经读过 SQL Server 的执行时间为 4 毫秒。那么我是否可以假设任何时候 CLR 存储过程或函数占用超过 4 毫秒的 CPU 时间,都会发生这种等待类型?

另外,我找到了一个参考资料,指出某些 CLR 过程应该产生. 现在,我们的 CLR 过程是单线程的。我当然可以在关键位置添加一些睡眠调用,看看会产生什么样的影响。但我想更好地了解正在发生的事情。因此,如果有人有一些好的知识可以分享或有一个好的文档/文章的链接,我将不胜感激。在 BOL 引用之外查找有关此等待类型的信息有点困难。

Sol*_*zky 4

不幸的是,关于这个主题的信息并不多。我可以说是的,您当然应该将其添加Thread.Sleep(0);到代码中的各个位置。这样做使 SQL Server 有机会控制线程。这在进行数据访问(即数据SqlClient访问)的地方是不必要的,因为 SQL Server 已经有能力管理它。

另外,@Remus Rusanu,在另一个问题(可能在 Stack Overflow 上)建议使用Thread.BeginThreadAffinity / Thread.EndThreadAffinity来管理长时间运行的进程,但使用这些要求将 Assembly 设置为UNSAFE.