Advertências para o uso de funções de tabela em pipeline no Oracle para implementar a funcionalidade de visualização parametrizada?

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

Pergunta

Tomamos a decisão de colocar algumas "visualizações parametrizadas" em camadas sobre algumas visualizações regulares no Oracle para encorajar corretamente onde os predicados sempre serão usados ​​nas consultas.

A maior parte do código repetitivo (tabelas unidas apropriadamente) estará na visualização, de modo que não teremos mais muitos procedimentos e funções diferentes com suas próprias cópias de junções e filtros comuns.

Em seguida, colocaremos funções de tabela em pipeline sobre essas visualizações para garantir que os chamadores forneçam os filtros necessários para que as visualizações não sejam chamadas "para todo o tempo e espaço".Eu olhei alternativas usando sys_context e userenv e variáveis ​​de pacote e embora pareçam ser o que os usuários do Oracle chamam de visualizações parametrizadas, elas simplesmente não são viáveis ​​para ter esses calços em torno de uma visualização toda vez que ela é usada e não são reutilizáveis ​​em auto-junta-se.

Eu li muito sobre isso em vários lugares, incluindo StackOverflow:

Funções com valor de tabela no ORACLE 11g?(visualizações parametrizadas)

Base de dados:Funções em pipeline

É permitido usar um SELECT dentro de uma função de tabela PL/SQL em pipeline?

Esta é uma decisão arquitetônica para tentar melhorar a capacidade de manutenção de um aplicativo que se tornou extenso com MUITAS consultas repetidas.As opiniões ajudariam de alguma forma, mas estou preocupado porque não temos como impor predicados aos chamadores para impedi-los de fazer coisas tolas.

Tive muito sucesso usando essa técnica no SQL Server com funções com valor de tabela embutidas e isso realmente ajudou a tornar o sistema muito mais coerente e mais fácil de rastrear dependências e efeitos das alterações propostas, já que havia a) menos código eb) mais reutilização e menos repetição.

Estou um pouco preocupado com esse último link, parece implicar que eu poderia ter problemas de simultaneidade ou de tempo se me juntasse a uma dessas funções de tabela em pipeline e a usasse para atualizar outra tabela.

Compartilhe suas experiências com funções de tabela em pipeline e o que preciso procurar?Além disso, se houver uma alternativa melhor, deixe-me saber na sua resposta também.

Foi útil?

Solução

Sim, o comportamento pontual de consultar uma tabela dentro de uma função em pipeline é diferente daquele de consultar a tabela diretamente ou por meio de uma visualização, portanto, isso precisa ser levado em consideração.Dito isto, geralmente não é um problema se a função em pipeline estiver consultando uma tabela atualizada com pouca frequência.Não consigo pensar em nenhum problema de simultaneidade ou tempo.

Meu principal problema em fornecer funções em pipeline para uso dos desenvolvedores (em vez de usar visualizações) é que elas (como algumas visualizações) podem ser facilmente mal utilizadas.Os desenvolvedores podem optar por unir os resultados de uma função em pipeline a outra, resultando em consultas muito ineficientes que não podem tirar vantagem de coisas como índices, predicados enviados e restrições de tabela.

Se a manutenção for o seu principal problema, então eu preferiria visualizações - elas podem ajudar a reduzir o código duplicado, definindo transformações comuns em um só lugar, e talvez também junções comuns;no entanto, mesmo estes são facilmente mal utilizados (por ex.ingressar em uma visualização, mesmo que ela se junte a outra tabela que não seja exigida pela consulta original).

Desempenho e eficiência provavelmente serão os itens a serem observados.Implemente um regime de revisão rigoroso para todo o SQL no aplicativo para procurar consultas mal escritas ou inconsistentes.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top