2010-01-19 13 views
5

Soy un desarrollador de C# que ha trabajado en bases de datos básicas en T-SQL. Sin embargo, necesito escribir un procedimiento almacenado muy complicado, muy por encima de mi conocimiento de T-SQL.SQL Server 2008 CLR vs T-SQL: ¿Existe una diferencia eficiencia/velocidad?

¿Escribir un procedimiento almacenado en C# utilizando CLR .net como parte de SQL Server 2008 hace que mi procedimiento almacenado sea menos eficiente que si estuviera escrito en T-SQL? ¿La diferencia (si la hay) es significativa? ¿Por qué?

Respuesta

8

CLR requieren cierta sobrecarga de comunicación (para pasar datos entre el CLR y SQL Server)

regla de oro es:

  • Si la lógica incluye sobre todo transformaciones de conjuntos masivos de datos, los cuales se puede realizar usando operaciones de conjunto, luego use TSQL.

  • Si su lógica en su mayoría incluye cálculos complejos de cantidades relativamente pequeñas de datos, use CLR.

Con las operaciones de ajuste se puede hacer mucho más de lo que parece. Si publica sus requisitos aquí, probablemente podamos ayudarlo.

+0

¿Qué tan grande de una sobrecarga de comunicación estamos hablando? Tengo grandes conjuntos de datos, pero también estoy haciendo cálculos complejos en lugar de establecer operaciones. –

+0

'@ bytenik': esto depende en gran medida de lo que va a hacer con los datos. Una función de agregado 'SQL' incorporada, por ejemplo, funciona aproximadamente' 3' veces más rápido que un agregado 'CLR'. Si va, por ejemplo, a unir dos conjuntos de registros, tendrá que desarrollar y codificar la unión en el 'CLR', mientras que' SQL Server' tiene varios algoritmos nativos y selecciona el más apropiado, lo que puede aumentar el rendimiento por órdenes de magnitud Por otro lado, 'SQL Server' no tiene agregados en ejecución, y' CLR' puede ser de gran ayuda. Necesito ver sus requisitos para dar una respuesta más específica. – Quassnoi

5

Por favor, vea Performance of CLR Integration:

este tema se describen algunos de los opciones de diseño que mejoran el rendimiento de la integración de Microsoft SQL Server con Microsoft .NET marco de Common Language Runtime (CLR).

0

La pregunta de "¿Escribir un procedimiento almacenado en C# utilizando .NET CLR como parte de SQL Server 2008 hace que mi procedimiento almacenado sea menos eficiente que si estuviera escrito en T-SQL?" es realmente demasiado amplio para dar una respuesta significativa. La eficiencia varía mucho dependiendo de no solo qué tipos de operaciones está haciendo, sino también cómo realiza esas operaciones. Podría tener un procedimiento almacenado CLR que supere en rendimiento a un Proc T-SQL equivalente, pero en realidad tiene un peor rendimiento debido a una codificación deficiente, y viceversa.

Dada la naturaleza general de la pregunta, puedo decir que "en general", las cosas que se pueden hacer en T-SQL (sin demasiada complejidad) probablemente deberían hacerse en T-SQL. Una posible excepción podría ser para los TVF ya que el CLR API tiene una opción muy interesante para transmitir los resultados (escribí un artículo para SQL Server Central - se requiere registro gratuito - aproximadamente STVFs). Pero no hay forma de saberlo con certeza sin tener las versiones CLR y T-SQL del código y las pruebas con datos de nivel de producción (incluso el código mal escrito normalmente funcionará lo suficientemente bien con 10k filas o menos).

Así que la pregunta verdadera aquí se reduce a:

que sé C# mejor de lo que sé de T-SQL. ¿Que debería hacer?

Y en este caso, sería mejor simplemente preguntar cómo abordar esta tarea en particular en T-SQL.Es muy posible que existan soluciones no complejas que aún no conoces, pero que podrías entender al conocer la función/técnica/etc. Y aún puedes codificar una solución equivalente en SQLCLR y compara el rendimiento entre ellos. Pero si no hay una respuesta satisfactoria para manejarlo en T-SQL, entonces hazlo en SQLCLR.

Dicho esto, hice un estudio hace 3 años con respecto a SQLCLR vs T-SQL Performance y publiqué los resultados en Simple-Talk.

Cuestiones relacionadas