多线程CLR存储过程是否可行?
我有一项数据密集型任务,具有很多并行化的潜力。 CLR Stored Procs可以很好地消除将数据移出进程的开销,我担心我不得不放弃并行计算。
我有什么选择?
注意:我们在SQL Server 2005上使用< 4个月的范围升级到SQL Server 2008
答案 0 :(得分:4)
如果数据密集且可能并行化,则应以 set 为导向处理它,并让SQL在其认为合适时对其进行并行处理。对于每个CPU的数据访问分区,你将无法做到比SQL更聪明的事情,它只能访问你没有的信息(缓冲池填充状态,页面寿命预期,CPU / NUMA亲和力等)。
如果您的处理是面向标量和CPU密集型的(甚至是一些面向集合的处理),请将处理放在UDF CLR函数中,然后让查询执行对您的函数执行进行并行处理。
如果您的处理有任何类型的I / O(即Web调用),请不将其放在SQL中,放在服务器进程之外。
如果您的处理确实超出了所有这些类别,并且您仍然相信您可以从多线程中受益,理论上可以在SQL中启动线程。请注意,SQL中的CLR主机不是您的普通CLR主机(即众所周知的应用程序主机或ASP主机)。 SQL CLR是第三种主机类型,它提供了自己的基元(线程,锁定,内存管理等),它们位于SOS构造(工作者,锁存器,内存管理员等)之上。我强烈建议不要在SQL中进行显式多线程CLR处理。