Мы используем CLR-функции в наших ETL-процессах, чтобы централизовать логику обработки данных и проверку данных. Эти функции являются довольно базовыми и не требуют доступа к данным и детерминированы для обеспечения параллелизма.Производительность сервера CLR sql
Например:
[SqlFunction(DataAccess = DataAccessKind.None, IsDeterministic = true, SystemDataAccess = SystemDataAccessKind.None, IsPrecise = true)]
public static bool check_smallint(string input)
{
string teststring;
try
{
teststring = input.Trim(' ').Replace('-', '0');
if (teststring.Length == 0)
{
teststring = "0";
}
Convert.ToInt16(teststring);
}
catch (NullReferenceException)
{
return true;
}
catch (FormatException)
{
return false;
}
catch (OverflowException)
{
return false;
}
return true;
}
Это прекрасно работает для исполнения за исключением. Query значительно замедлились, что создает проблемы при обработке больших наборов данных (миллионы строк и т. Д.).
До сих пор мы не нашли никого, кто действительно понимал бы CLR-архитектуру SQL, но одно из предложений, которое мы получили, состоит в том, что это может быть вызвано накладными расходами на создание нового соединения или выделение памяти для каждого вызова функции. Таким образом, решение может быть соединением/объединением памяти.
Пожалуйста, не предлагайте разные решения, мы уже рассматриваем их, как встроенный sql, или совершенно другой подход. Стандартные sql-функции во многих случаях не имеют возможности из-за отсутствия ошибок.
PS. Мы используем SQL 2008R2.
Спасибо для вашего комментария. Мы пытаемся это сделать прямо сейчас. –