Le viste del database sono solo un mezzo per semplificare l'accesso ai dati o offrono vantaggi in termini di prestazioni quando si accede alle viste anziché eseguire semplicemente la query su cui si basa la vista? Sospetto che le viste funzionino equamente solo aggiungendo la query di visualizzazione memorizzata a ogni query sui dati della vista, è corretto o ci sono altri dettagli e/o ottimizzazioni?Le visualizzazioni del database influiscono sulle prestazioni della query?
risposta
Dipende dall'RDBMS, ma in genere non è in corso l'ottimizzazione, ed è solo un modo conveniente per semplificare le query. Alcuni sistemi di database utilizzano comunque "viste materializzate", che utilizzano un meccanismo di memorizzazione nella cache.
In genere una visualizzazione è solo un modo per creare una comune abbreviazione per definire i set di risultati di cui avete bisogno frequentemente.
Tuttavia, c'è un lato negativo. La tentazione è quella di aggiungere in ogni colonna che pensi che potresti aver bisogno da qualche parte quando potresti voler usare la vista. Quindi YAGNI viene violato. Non solo colonne, ma a volte join esterni aggiuntivi vengono attaccati "nel caso in cui". Pertanto gli indici di copertura potrebbero non coprire più e il piano di query potrebbe aumentare in termini di complessità (e riduzione dell'efficienza).
YAGNI è un concetto critico nella progettazione SQL.
Divertente come ho sempre rispettato i principi YAGNI, ma non sapevo che esistessero realmente fino a quando non ho cercato YAGNI :) – SAMills
Ho sempre considerato Views come una stored procedure di sola lettura. Fornisci al database quante più informazioni possibili in anticipo, in modo da poter effettuare la pre-compilazione nel miglior modo possibile.
È possibile indicizzare anche le viste consentendo di accedere a una vista ottimizzata dei dati che si stanno cercando per il tipo di query che si sta eseguendo.
Qualche esempio reale di questo? Conoscete alcun RDMS che eseguirà una visualizzazione più veloce rispetto a un'istruzione di selezione equivalente? Ovviamente l'indice aiuta, ma quell'indice aiuta anche l'istruzione select. La tua risposta implica che una vista è più veloce, mi stavo chiedendo se hai prove o solo indovinando? –
Nessun server DB di cui sono a conoscenza crea un piano di esecuzione query al momento della visualizzazione o la creazione di stored procedure. I piani di esecuzione richiedono statistiche sugli indici, che non sono disponibili in fase di compilazione. La compilazione trasforma semplicemente SQL/DDL in un formato interno. –
sindre, alcuni server DB supportano "viste indicizzate", che sono più simili a "viste materializzate" - più vicine a una tabella gestita automaticamente rispetto a una vista di per sé. –
In generale, le visualizzazioni devono essere equivalenti a una query scritta direttamente nelle tabelle sottostanti.
Ma: potrebbero esserci casi di margini e sarà necessario testare il codice. Tutti i moderni sistemi RDBMS dispongono di strumenti che consentono di visualizzare i queryplans e monitorare l'esecuzione. Non prendere la mia (o qualcun altro) parola per questo, quando puoi avere i dati definitivi a portata di mano.
Sebbene una determinata query in esecuzione all'interno di una vista e la stessa query in esecuzione all'esterno della vista si comportino in modo equivalente, le cose diventano molto più complicate rapidamente quando è necessario unire due viste insieme. Si può facilmente finire per portare tabelle che non sono necessarie nella query, o portare tabelle in ridondante. L'ottimizzatore del database potrebbe avere più problemi nella creazione di un buon piano di esecuzione delle query. Quindi, anche se le viste possono essere molto buone in termini di sicurezza più fine e simili, non sono necessariamente buone per la modularità.
So che questo è un thread precedente. La discussione è buona, ma voglio aggiungere un altro pensiero. Le prestazioni dipendono anche da ciò che state utilizzando per estrarre i dati. Ad esempio, se si sta terminando il front-end con qualcosa come Microsoft Access, si può sicuramente ottenere prestazioni per alcune query complesse utilizzando una vista. Ciò è dovuto al fatto che Access non preleva sempre dal server SQL come vorremmo: in alcuni casi trascinerebbe intere tabelle e poi tenterà di elaborare localmente da lì! Non così se usi una vista.
Sì, in tutti i piani di query di tutti i moderni RDBMS (MSSQL dopo il 2005? Ecc.) Vengono memorizzati nella cache eliminando il sovraccarico di pianificazione della query e accelerando le prestazioni rispetto allo stesso SQL eseguito in linea. Precedentemente a questo (e si applica anche alle istruzioni SQL/Preparate parametrizzate), le persone ritenevano che le procedure memorizzate funzionassero meglio.
Molti ancora si aggrappano a questo oggi rendendolo un mito DB moderno. Dal momento che Views/PS ha ottenuto la pianificazione delle query memorizzate nella cache degli SP, sono stati praticamente pari.
Non vedo l'ora di leggere le risposte. Dall'esperienza pratica, SE il set di risultati risultante è significativo, abbiamo scoperto che otteniamo prestazioni migliori inserendo la vista all'interno di una procedura per tagliare il set di risultati. – SAMills