SQL Server 2008 CLR и T-SQL: есть ли разница в эффективности/скорости?

Я разработчик C#, который выполнил некоторую базовую работу с базами данных в T-SQL. Однако мне нужно написать очень сложную хранимую процедуру, намного превышающую мои знания T-SQL.

Не приведет ли написание хранимой процедуры на C# с использованием .net CLR в составе SQL Server 2008 меньшей эффективности, чем если бы она была написана на T-SQL? Существенна ли разница (если есть)? Почему?


person David Pfeffer    schedule 19.01.2010    source источник


Ответы (3)


CLR требуют некоторых затрат на связь (для передачи данных между CLR и SQL Server)

Правило большого пальца:

  • Если ваша логика в основном включает в себя преобразования массивных наборов данных, которые можно выполнить с помощью операций над множествами, используйте TSQL.

  • Если ваша логика в основном включает сложные вычисления относительно небольших объемов данных, используйте CLR.

С помощью операций над множествами можно сделать гораздо больше, чем кажется. Если вы разместите свои требования здесь, возможно, мы сможем помочь.

person Quassnoi    schedule 19.01.2010
comment
О каких коммуникационных накладных расходах идет речь? У меня есть огромные наборы данных, но я также выполняю сложные вычисления с ними, а не операции с множествами. - person David Pfeffer; 20.01.2010
comment
@bytenik: это сильно зависит от того, что вы собираетесь делать с данными. Например, встроенная агрегатная функция SQL работает примерно в 3 раза быстрее, чем агрегатная функция CLR. Если вы собираетесь, скажем, соединить два набора записей, вам нужно разработать и жестко запрограммировать объединение в CLR, тогда как SQL Server имеет несколько встроенных алгоритмов и выбирает наиболее подходящий, что может повысить производительность на порядки. С другой стороны, в SQL Server отсутствуют работающие агрегаты, и CLR может очень помочь. Мне нужно увидеть ваши требования, чтобы дать более конкретный ответ. - person Quassnoi; 20.01.2010

См. Производительность интеграции CLR:

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

person Andrew Hare    schedule 19.01.2010

Вопрос «Не приведет ли написание хранимой процедуры на C# с использованием .net CLR как части SQL Server 2008 моей хранимой процедуры менее эффективной, чем если бы она была написана на T-SQL?» действительно слишком широк, чтобы дать осмысленный ответ. Эффективность сильно зависит не только от того, какие типы операций вы выполняете, но и от того, как вы выполняете эти операции. У вас может быть хранимая процедура CLR, которая должна превосходить эквивалентную процедуру T-SQL, но на самом деле работает хуже из-за плохого кода, и наоборот.

Учитывая общий характер вопроса, я могу сказать, что «в целом» то, что можно сделать в T-SQL (без особой сложности), вероятно, следует делать в T-SQL. Одно возможное исключение может быть для TVF, так как CLR API имеет очень интересную опцию для потоковой передачи результатов обратно (я написал статью для SQL Server Central — требуется бесплатная регистрация — о STVF). Но невозможно узнать наверняка, не имея версий кода CLR и T-SQL и не тестируя обе версии с данными производственного уровня (даже плохо написанный код обычно достаточно хорошо работает с 10 000 строк или меньше).

Таким образом, настоящий вопрос здесь сводится к следующему:

Я знаю C# лучше, чем T-SQL. Что я должен делать?

И в этом случае было бы лучше просто спросить, как решить эту конкретную задачу в T-SQL. Вполне может быть, что есть несложные решения, о которых вы просто еще не знаете, но сможете понять, изучив функцию/технику/и т. д. И вы все равно можете написать эквивалентное решение в SQLCLR. и сравните производительность между ними. Но если нет удовлетворительного ответа для обработки этого в T-SQL, сделайте это в SQLCLR.

При этом 3 года назад я провел исследование производительности SQLCLR и T-SQL и опубликовал результаты на Простой разговор.

person Solomon Rutzky    schedule 13.07.2014