3

多线程 CLR 存储过程是否可能?

我有一项数据密集型任务,具有很大的并行化潜力。CLR 存储过程可以很好地消除将数据移出进程的开销,我担心我不得不放弃并行计算。

我有哪些选择?

注意:我们使用的是 SQL Server 2005,计划在 4 个月内升级到 SQL Server 2008

4

1 回答 1

4

如果是具有并行化潜力的数据密集型,您应该以面向集合的方式处理它,并让 SQL 在它认为合适的时候并行化处理。在对每个 CPU 的数据访问进行分区方面,您将无法做任何比 SQL 已经做的更智能的事情,它只是可以访问您没有的信息(缓冲池填充状态、页面寿命预期、CPU/NUMA 关联等)。

如果您的处理是面向标量和 CPU 密集型的(甚至是一些面向集合的处理),请将处理放在 UDF CLR 函数中,然后再次让查询执行并行化您的函数执行。

如果您的处理有任何类型的 I/O(即 Web 调用),请不要将其放在 SQL 中,放在服务器进程之外。

如果您的处理确实不属于所有这些类别,并且您仍然相信您可以从多线程中受益,那么理论上可以在 SQL 中启动线程。请注意,SQL 中的 CLR 主机不是您的正常 CLR 主机(即众所周知的应用程序主机或 ASP 主机)。SQL CLR 是第三种主机类型,在SOS结构(worker、latch、memory clerks 等)之上提供自己的原语(线程、锁定、内存管理等)。我强烈建议不要在 SQL 中进行显式多线程 CLR 处理。

于 2009-08-24T20:33:34.363 回答