Распараллелить процедуру TSQL CLR

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

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

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

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

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

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

SELECT dbo.PredictServices([FleetID]) FROM Vehicles

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

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


person PeterBelm    schedule 29.07.2011    source источник


Ответы (1)


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

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

person Oleg Zhylin    schedule 01.08.2011