Распараллелить процедуру TSQL CLR - PullRequest
0 голосов
/ 30 июля 2011

Я пытаюсь выяснить, как можно распараллелить некоторый процедурный код для создания записей в таблице.

Вот ситуация (извините, я не могу дать много информации о реальном коде):

Я должен предсказать, когда потребуется обслуживание транспортного средства, основываясь на предыдущей дате обслуживания, текущем пробеге, запланированном ежедневном пробеге и разнице в пробеге между каждой службой.

В целом - это очень процедурно, для каждого транспортного средства мне нужно учитывать его историю, текущее состояние обслуживания, суточный пробег (который может меняться в зависимости от диапазонов, определенных в плане пробега), и последовательность обслуживания .

В настоящее время я вычисляю все это в PHP, и для 100 автомобилей это занимает около 20 секунд. Поскольку в будущем это может быть увеличено до нескольких тысяч, 20 секунд - это слишком много.

Поэтому я решил попробовать сделать это в хранимой процедуре CLR. Сначала я думал, что попробую многопоточность, но быстро обнаружил, что это не так просто сделать на хосте TSQL. Мне было рекомендовано разрешить TSQL самостоятельно выполнять распараллеливание. Пока не знаю как. Если бы не факт, что код должен создавать записи, я мог бы определить его как функцию и сделать:

SELECT dbo.PredictServices([FleetID]) FROM Vehicles

И TSQL должен понять, что он может распараллелить это, но я не знаю альтернативы процедурам.

Что я могу сделать, чтобы распараллелить это?

1 Ответ

0 голосов
/ 01 августа 2011

Вы получили правильную рекомендацию.У вас просто нет средств .NET Framework для параллелизма в вашей хранимой процедуре CLR.Также имейте в виду, что ниша для хранимых процедур CLR довольно узка и отрицательно влияет на производительность и масштабируемость SQL Server.

Если я правильно понимаю задачу, вам нужно вычислить функцию PredictServices для некоторых записей и сохранитьрезультаты обратно в базу данных.В этом случае хранимые процедуры CLR могут быть вашим вариантом при условии, что PredictServices - это просто доступ к данным / прямое преобразование данных.Рекомендуется создать службу WWF (Windows Workflow Foundation) для выполнения вычислений и вызова ее из PHP.В Workflow Service вы можете реализовать любое решение, в том числе с параллелизмом.

...