Многопоточный код в хранимых процессах CLR? - PullRequest
3 голосов
/ 24 августа 2009

Возможны ли многопоточные хранимые процедуры CLR?

У меня задача с большими объемами данных с большим потенциалом для распараллеливания. Хранимые Procs CLR были бы полезны для устранения издержек, связанных с удалением данных из процесса, я боюсь, что мне придется отказаться от параллельных вычислений.

Какие у меня варианты?

Примечание: мы находимся на SQL Server 2005 с планами на <4 месяца для обновления до SQL Server 2008 </p>

1 Ответ

4 голосов
/ 25 августа 2009

Если данные интенсивны с возможностью распараллеливания, вы должны обработать их set ориентированным образом и позволить SQL парализовать процессный знак так, как он считает нужным. Вы не сможете сделать что-то более умное, чем это делает SQL, в отношении разделения доступа к данным для каждого процессора, у него просто есть доступ к информации, которой у вас нет (состояние заполнения пула буферов, ожидаемое время жизни страницы, соответствие CPU / NUMA и т. Д.).

Если ваша обработка ориентирована на скаляр и требует много ресурсов процессора (и даже некоторой обработки, ориентированной на множество), поместите обработку в функцию CLR UDF и снова позвольте выполнению запроса парализовать выполнение вашей функции.

Если ваша обработка имеет какой-либо вид ввода / вывода (например, веб-вызовы), не поместите его в SQL, поместите вне процесса сервера.

Если ваша обработка на самом деле выходит за пределы всех этих категорий, и вы все еще считаете, что могли бы извлечь выгоду из многопоточности, теоретически возможно запускать потоки внутри SQL. Имейте в виду, что хост CLR внутри SQL является , а не вашим обычным хостом CLR (т. Е. Известным хостом приложения или хостом ASP). SQL CLR - третий тип хоста, предлагающий свои собственные примитивы (потоки, блокировка, управление памятью и т. Д.), Расположенные поверх конструкций SOS (рабочие, защелки, клерки памяти и т. Д.). Я настоятельно рекомендую не делать явную многопоточную обработку CLR в SQL.

...