Avvertenze per l'utilizzo delle funzioni della tabella pipelinata in Oracle per implementare funzionalità di visualizzazione parametrizzata?

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

Domanda

Abbiamo preso una decisione di livellare alcune "visualizzazioni parametrizzate" su alcune viste regolari in Oracle per poter incoraggiare correttamente correttamente dove i predicati saranno sempre utilizzati nelle query.

La maggior parte del codice ripetitivo (le tabelle unite in modo appropriato) saranno visibili, in modo che non avremo più molte diverse procedure e funzioni con le proprie copie di join e filtri comuni.

Allora layer Wiremeremo le funzioni della tabella pipeline su quelle visualizzazioni per garantire che i chiamanti forniscano i filtri necessari in modo che le viste non siano chiamate "per tutti i tempi e lo spazio". Ho esaminato le alternative usando sys_context e userenv e variabili dei pacchetti e sebbene siano quali utenti Oracle chiamano le viste parametrizzate, semplicemente non sono vitali ad avere quei spessori intorno a una vista ogni volta che viene utilizzato e non sono riutilizzabili in Self-joins.

Ho letto molto su questo in una varietà di luoghi, incluso Stackoverflow:

Funzioni a tavola a Oracle 11G? (Viste parametrizzate)

Database: funzioni con pipeline

Sta usando una selezione interna Una funzione PL / SQL pipelinata Funzione consentita?

Questa è una decisione architettonica per cercare di migliorare la manutenibilità di un'applicazione che è diventata tentacolare con molte query ripetute. Viste andrebbero in qualche modo per aiutare, ma sono preoccupato che non abbiamo modo di far rispettare i predicati sui chiamanti per fermarli a fare cose stupide.

Ho avuto una grande quantità di successo utilizzando questa tecnica in SQL Server con funzioni di valore in linea in linea e ha davvero aiutato a rendere il sistema molto più coerente e più facile da tenere traccia delle dipendenze ed effetti dei cambiamenti proposti, poiché c'era un ) meno codice e b) più riutilizzo e meno ripetizione.

Sono un po 'preoccupato per quell'ultimo collegamento, sembra implicare che potrei avere concorrenza o problemi di temporizzazione se dovessi unirsi a una di queste funzioni del tavolo conduccio e usarla per aggiornare un'altra tabella.

Si prega di condividere le tue esperienze con funzioni da tavolo con pipeline e cosa ho bisogno di cercare? Anche se c'è un'alternativa migliore, fammi sapere anche nella tua risposta?

È stato utile?

Soluzione

Sì, il comportamento point-in-time della interrogazione di una tabella all'interno di una funzione pipelinata è diversa a quella della interrogazione della tabella direttamente o tramite una vista, in modo tale da prendere in considerazione. Detto questo, di solito non è un problema se la funzione pipelinata interroga una tabella raramente aggiornata. Non riesco a pensare a nessuna concorrenza o problemi di temporizzazione però.

Il mio problema principale con la fornitura di funzioni pipeline per gli sviluppatori da utilizzare (al contrario dell'uso di visualizzazioni), è che (come alcune viste) potrebbero essere facilmente utilizzabili facilmente. Gli sviluppatori possono scegliere di aderire ai risultati di una funzione pipelinata a un altro, con conseguenti query molto inefficienti che non riescono a sfruttare cose come indici, predicati predicati e vincoli di tabelle.

Se la manutenibilità è il tuo problema principale, preferirei le viste - possono aiutare a ridurre il codice duplicato definendo trasformazioni comuni in un posto, e forse anche i join comuni; Tuttavia, anche questi sono troppo facilmente utilizzati (ad esempio unione a una vista, anche se si unisce ad un'altra tabella che non è richiesta dalla query originale).

Performance ed efficienza, saranno probabilmente le cose per cui essere presenti. Metti un rigoroso regime di revisione in atto per tutti gli SQL nell'applicazione per cercare query scarsamente scritte o incoerenti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top