¿Las advertencias para usar las funciones de la tabla de tuberías en Oracle para implementar la funcionalidad de vista parametrizada?

StackOverflow https://stackoverflow.com/questions/5980889

Pregunta

Hemos tomado una decisión de capas de algunas "vistas parametrizadas" en algunas vistas regulares en Oracle para alentar correctamente a la correcta cuando se utilicen predicados en las consultas.

La mayor parte del código repetitivo (tablas unidas adecuadamente) estará en la vista, de modo que ya no tendremos muchos procedimientos y funciones diferentes con sus propias copias de uniones y filtros comunes.

Luego, las funciones de la mesa de tuberías de la capa aquellas vistas para asegurarse de que las personas que llaman proporcionen los filtros necesarios para que las vistas no se llamen "para todos los tiempos y el espacio". He mirado alternativas utilizando Sys_Context y Userenv y las variables del paquete y, aunque parecen ser lo que los usuarios de Oracle llaman vistas parametrizadas, simplemente no son viables de tener esas calzas alrededor de una vista cada vez que se usa y no son reutilizables en auto-se une.

He leído mucho sobre esto en una variedad de lugares, incluido StackOverFlow:

¡Funciones valoradas en la tabla en Oracle 11g? (Vistas parametrizadas)

base de datos: funciones de tuberías

está usando un selecto dentro ¿Se permite una función de tabla PL / SQL pipelinada?

Esta es una decisión arquitectónica de tratar de mejorar la capacidad de mantenimiento de una aplicación que se ha enrojecido con muchas consultas repetidas. Las vistas pasarían de alguna manera a ayudar, pero me preocupa que no tengamos forma de hacer cumplir los predicados a las personas que llaman para que las hagan cosas tontas.

He tenido una gran cantidad de éxito utilizando esta técnica en SQL Server con funciones de valores de tabla en línea y realmente ayudó a que el sistema sea mucho más coherente y más fácil de rastrear las dependencias y los efectos de los cambios propuestos, ya que había un ) Menos código y B) más reutilización y menos repetición.

Estoy un poco preocupado por el último enlace, parece implicar que podría tener problemas de concurrencia o sincronización si iba a unirme a una de estas funciones de tabla de tuberías y usarla para actualizar otra tabla.

¡Por favor, comparta sus experiencias con las funciones de la tabla de tuberías y lo que necesito para buscar? Además, si hay una mejor alternativa, avíseme en su respuesta también?

¿Fue útil?

Solución

Sí, el comportamiento de punto a tiempo de consultar una tabla dentro de una función de tuberías es diferente al de consultar la tabla directamente o a través de una vista, de modo que debe tenerse en cuenta. Dicho esto, generalmente no es un problema si la función canalizada está consultando una tabla con poca frecuencia. No puedo pensar en ningún problema de concurrencia o sincronización, aunque.

Mi principal problema con proporcionar funciones canalizadas para que los desarrolladores que se usen (a diferencia de usar las vistas), es que (como algunas vistas) pueden ser fácilmente mal utilizadas. Los desarrolladores pueden optar por unir los resultados de una función canalizada a otra, lo que resulta en consultas muy ineficientes que no pueden aprovechar las cosas como índices, predicados empujados y restricciones de tabla.

Si la capacidad de mantenimiento es su principal problema, preferiría las vistas, pueden ayudar a reducir el código duplicado definiendo las transformaciones comunes en un solo lugar, y quizás las uniones comunes también; Sin embargo, incluso estos son demasiado fáciles de usar (por ejemplo, unirse a una vista, a pesar de que se une a otra tabla que no es requerida por la consulta original).

El rendimiento y la eficiencia, probablemente serán las cosas a tener cuidado. Ponga un riguroso riguroso de revisión en su lugar para todos los SQL en la solicitud para buscar consultas mal escritas o inconsistentes.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top