我在Server 2014上运行了一个CLR存储过程。此存储过程收集一些数据(通常在数万行范围内编号),对数据运行一些计算,生成一个输出数据集,并将该输出数据集写入两个目标表。对于小跑,这需要几秒钟。对于我们的更大的运行,它目前大约需要25分钟。在这25分钟内,我们观察到大量的SQLCLR_QUANTUM_PUNISHMENT等待。所以我试着教育自己我们能做些什么来减少这些等待的发生。我发现了大量的资源告诉我,“当CLR任务因为超出其执行量而被节流时发生,这样做是为了减少这个资源密集型任务对其他任务的影响。”我读过Server的执行量是4ms。那么,假设CLR存储过程或函数占用4ms以上的CPU时间,就会出现这种等待类型吗?
另外,我找到了一个指示某些CLR过程应该产生的引用。现在,我们的CLR过程是单线程的。我当然可以在关键的地方添加一些睡眠电话,看看这会产生什么样的影响。但我想更好地了解发生了什么。因此,如果有人有一些好的知识可以分享或链接到一个好的文件/文章,我将不胜感激。在BOL报价之外查找有关此等待类型的信息有点困难。
发布于 2017-02-20 14:32:56
不幸的是,在这个话题上没有太多的信息。我可以说是的,您当然应该将Thread.Sleep(0);添加到代码中的不同位置。这样做使Server有机会控制线程。对于正在进行数据访问的地方(即SqlClient内容)来说,这是不必要的,因为Server已经有能力管理它。
此外,@ Rusanu,在另一个问题(可能是堆栈溢出)中,建议使用Thread.BeginThreadAffinity / Thread.EndThreadAffinity来管理长期运行的进程,但使用这些要求将程序集设置为UNSAFE。
https://dba.stackexchange.com/questions/164891
复制相似问题