¿Es buena idea mover la lógica de las sentencias SQL?

8

Prefacio a esta pregunta diciendo que soy muy nuevo en el desarrollo de software profesional.

Trabajo en un equipo que toma datos de otros grupos de mi empresa y los convierte en informes que pueden usar los ejecutivos de negocios.

En el proceso de transferencia y análisis de datos, tenemos algunas instrucciones SQL que procesan mucho los datos. Casi todos los SELECTusos TRIM, etc. SUBSTR, en CASTgran medida para reducir los campos al tamaño y formato adecuados. Además, hay muchos casos especiales que se explican mediante el uso de CASEdeclaraciones dentro SELECTde.

El software del servidor Teradata que utilizamos emite mensajes de error notablemente crípticos. Como resultado, hacemos muchas conjeturas sobre qué datos están rompiendo qué instrucción SQL.

Mi pregunta es: ¿sería una buena idea reducir estas declaraciones SQL algo complejas a una forma menos compleja que omita el procesamiento y el manejo de casos especiales, y en su lugar, esto funciona en un script o programa externo? ¿Tiene esto algún sentido?

Bryan Glazer
fuente

Respuestas:

12

Una gran ventaja de mover el código de procesamiento fuera de su SQL es que su SQL se vuelve mucho más simple de administrar.

Una desventaja es que si alguna vez desea utilizar esas consultas en algún otro programa, ahora debe poner sus procesos de procesamiento de resultados a disposición del otro programa. Podría ser tan simple como copiar un archivo de biblioteca que contiene las clases necesarias, pero aún así significa que cualquier cambio en la biblioteca debe propagarse y todos los clientes deben reconstruirse con la nueva biblioteca.

Otra opción: ¿Por qué no utilizar una vista (o varias vistas si necesita resultados con un formato diferente para diferentes clientes) para contener la mayor parte del código de formato? De esa manera, puede obtener los resultados de la consulta "sin procesar", o el formato agradable, dependiendo de lo que necesite.

FrustratedWithFormsDesigner
fuente
3
+1 por sugerir una vista que les permitiría separar el SQL de formato del SQL lógico.
2
+1 para una vista. Definitivamente la primera solución que consideraría.
Matt S
6

Estoy de acuerdo con la sugerencia ya hecha sobre el uso de una Vista para esta lógica. Solo me gustaría agregar una cosa más sobre las declaraciones de casos. Tenga en cuenta que extraer las declaraciones de Caso del SQL podría tener un impacto significativo en el rendimiento del sistema. Esas declaraciones de casos podrían estar reduciendo significativamente la cantidad de datos devueltos. Ejecutar el filtrado de casos en la capa de la base de datos a través de sentencias SQL es normalmente mucho más eficiente que extraer todos los datos y realizar el filtrado en un script o programa externo. Si está considerando esto, le recomiendo hacer algunos análisis de datos y pruebas de rendimiento antes de seguir adelante con esa solución.

Shane
fuente
4

Agregar un proceso externo generalmente solo hace que el sistema sea más difícil de depurar, pero realmente depende de la situación. Usa tu juicio . Considere el tiempo requerido para desarrollar / mantener proyectos fuera de banda.

¿Ya estás usando un proceso ETL ? No tengo experiencia con Teradata, pero separar sus pasos proporciona una visión mucho más clara de lo que está sucediendo. Aquí hay una descripción general de 2 segundos:

  1. Extracto: extraiga sus datos de la fuente y colóquelos en el almacenamiento temporal de la etapa 1. No cambie el formato de los datos.
  2. Transformar: Extraiga de la etapa 1, y haga todo el caso / trim / substr / cast / formateo, etc. que requiera aquí. Colóquelo en la etapa 2 de almacenamiento temporal.
  3. Cargar: Extraiga de la etapa 2 y coloque todos los datos en el almacenamiento de destino.

Esto generalmente proporciona suficiente información para administrar con éxito este tipo de sistema.

Zachary Yates
fuente
2
Ah, sí, ETL es precisamente lo que estamos haciendo. Excepto que parece ser algo más como ETTTLTLTL con la mayoría de los pasos de Transformación realizados en SQL. Creo que mi objetivo es escribir los pasos de transformación en un lenguaje más extensible con mejor manejo de errores que Teradata SQL, lo cual es un desastre.
Bryan Glazer
3

Me inclinaría a dejar los bits CASE en su lugar, ya que están relacionados con la lógica real de producir los datos para que alguien / cosa los consuma. Por lo tanto, eliminarlos significa que debe enviar un conjunto de datos más grande y el cliente debe procesarlo: ahora ha dividido la "lógica" de su informe en dos capas separadas y esto no es bueno.

Pero dejaría como un ladrillo caliente cualquier formato de su código (a menos que sea específicamente parte de predicados JOIN, etc.) porque formatearlo es el trabajo del consumidor ... así que sea cual sea la herramienta de informes que usen, ya sea Excel, Crystal, etc. es bueno formateando cosas en la localización correcta y todo ese jazz. Deje que el cliente haga lo que es bueno (mostrar cosas en bonitos colores) y deje que el servidor se concentre en lo que hace mejor: procesar datos.

Stephen Byrne
fuente
En algunos entornos, la aplicación que consume los datos también se puede ejecutar en el servidor. Entonces la pregunta se convierte en dónde es más eficiente hacer el formateo u otras transformaciones. En algunos casos, especialmente cuando los valores se repiten comúnmente, entonces puede ser más eficiente en general dejar que el servidor use una función determinista una vez para cada valor encontrado, y simplemente use los resultados almacenados en caché, en casos posteriores de esos valores. ¿Por qué tener múltiples aplicaciones que computan la misma transformación cuando el servidor puede hacerlo una vez para todos?
WarrenT
@WarrenT, ese es un punto justo PERO si estas funciones son deterministas, entonces, ¿por qué molestarse incluso en el almacenamiento en caché? es una mala idea tener en su base de datos: está asumiendo que todas estas aplicaciones querrían que los datos que muestran a sus usuarios estén en el mismo formato. Lo que significa que, por ejemplo, todos en su oficina en el extranjero deben ver las fechas de los informes como dd / mm / aaaa solo porque la base de datos está localizada en inglés británico. ¿Seguramente puedes estar de acuerdo en que esto es una locura?
Stephen Byrne