Qual è un buon motivo per utilizzare le viste SQL?


100

Sto leggendo la Bibbia di SQL Server 2008 e sto trattando la sezione delle visualizzazioni. Ma l'autore in realtà non spiega lo scopo delle visualizzazioni. Qual è un buon uso per le visualizzazioni? Dovrei usarli nel mio sito web e quali sono i vantaggi di essi?


Potresti fornirmi i file del database di quel libro "Bibbia di SQL Server 2008"? Il sito web dell'autore è morto e non riesco a contattarlo.

Risposte:


94

Un altro uso che nessuna delle risposte precedenti sembra aver menzionato è la distribuzione più semplice delle modifiche alla struttura della tabella.

Supponiamo che desideri ritirare una tabella ( T_OLD) contenente dati per utenti attivi e utilizzare invece una nuova tabella con dati simili (denominati T_NEW) ma che contenga dati sia per gli utenti attivi che per quelli inattivi, con una colonna in piùactive .

Se i tuoi sistemi hanno miliardi di query che lo fanno SELECT whatever FROM T_OLD WHERE whatever , hai due scelte per il lancio:

1) Tacchino freddo - Cambia il DB e, allo stesso tempo, cambia, testa e rilascia numerosi pezzi di codice che contenevano detta query. MOLTO difficile da fare (o anche da coordinare), molto rischioso. Male.

2) Graduale : cambia il DB creando la T_NEWtabella, rilasciando la T_OLDtabella e creando invece una VIEW chiamata T_OLDche imita la T_OLDtabella al 100% (ad esempio, la query di visualizzazione èSELECT all_fields_except_active FROM T_NEW WHERE active=1 ).

Ciò consentirebbe di evitare di rilasciare QUALSIASI codice che attualmente seleziona da T_OLDe di apportare le modifiche per migrare il codice da T_OLDa T_NEWa piacimento.

Questo è un semplice esempio, ce ne sono altri molto più coinvolti.

PS D'altra parte, probabilmente avresti dovuto avere un'API di stored procedure invece di query dirette da T_OLD, ma non è sempre così.


3
Ignoravo il termine "API della procedura memorizzata" e i pro / contro associati e ho trovato utile questo articolo: codinghorror.com/blog/2005/05/…
Jeff Widman

Scusa il ritardo alla festa, ma per quanto riguarda la performance. Se avessi bisogno di join sulla tabella originale e invece mi unirò alla vista, utilizzerà il miglior piano di esecuzione?
Zikato

@Zikato sì, se è una vista indicizzata
LinkBerest

V Buona indicazione
Afnan Ahmad

47

(Copiato dal primo tutorial che è apparso in una ricerca su Google (link ora morto), ma ha tutti i vantaggi che avrei digitato manualmente io stesso.)

Le visualizzazioni hanno i seguenti vantaggi:

  • Sicurezza: le viste possono essere rese accessibili agli utenti mentre le tabelle sottostanti non sono direttamente accessibili. Ciò consente al DBA di fornire agli utenti solo i dati di cui hanno bisogno, proteggendo allo stesso tempo altri dati nella stessa tabella.
  • Semplicità: le viste possono essere utilizzate per nascondere e riutilizzare query complesse.
  • Semplificazione o chiarimento del nome della colonna: le viste possono essere utilizzate per fornire alias sui nomi delle colonne per renderli più facili da ricordare e / o significativi.
  • Trampolino di lancio: le viste possono fornire un trampolino di lancio in una query "multilivello". Ad esempio, è possibile creare una visualizzazione di una query che ha contato il numero di vendite effettuate da ciascun venditore. È quindi possibile eseguire una query sulla visualizzazione per raggruppare gli addetti alle vendite in base al numero di vendite effettuate.

Poiché mi piace la tua risposta e non vedo molto utile aggiungerne un'altra, posso suggerire due aggiunte alla tua lista? Le viste indicizzate possono aumentare le prestazioni. L'esecuzione di aggiornamenti rispetto alle visualizzazioni piuttosto che direttamente alle tabelle può dare maggiore sicurezza che non aggiorni erroneamente quella tabella di produzione chiave :)
David Hall

Un altro punto nel tuo elenco, la maggior parte dei DBA vorrebbe l'uso della vista perché possono ottimizzare una vista e per lo più (non sempre) tutte le query che utilizzano quella vista verranno ottimizzate.
Nitin Midha

Questa è la risposta del 99% nel mio libro.
John Steedman

BTW @David link interrotto
Manuel Jordan

L'ultimo punto, non possiamo usare una tabella temporanea per questo?
Jiechao Wang,

16

Alcuni motivi da Wikipedia :

Le viste possono fornire vantaggi rispetto alle tabelle:

  1. Le viste possono rappresentare un sottoinsieme dei dati contenuti in una tabella
  2. Le viste possono unire e semplificare più tabelle in una singola tabella virtuale
  3. Le viste possono agire come tabelle aggregate , in cui il motore di database aggrega i dati (somma, media, ecc.) E presenta i risultati calcolati come parte dei dati
  4. Le visualizzazioni possono nascondere la complessità dei dati ; ad esempio una vista potrebbe apparire come Sales2000 o Sales2001, partizionando in modo trasparente la tabella sottostante effettiva
  5. Le viste occupano pochissimo spazio per essere archiviate ; il database contiene solo la definizione di una vista, non una copia di tutti i dati che presenta
  6. A seconda del motore SQL utilizzato, le viste possono fornire una protezione aggiuntiva
  7. Le visualizzazioni possono limitare il grado di esposizione di una o più tabelle al mondo esterno

14

Le VISUALIZZAZIONI possono essere utilizzate come sezioni riutilizzabili di SELECT / CODE, che possono essere incluse in altre selezioni / query a cui unirsi, e utilizzare vari filtri diversi, senza dover ricreare l'intero SELECT ogni volta.

Questo pone anche la logica in un'unica posizione, in modo da non doverla modificare in tutto il codice.

Dai un'occhiata a

Scelta tra stored procedure, funzioni, visualizzazioni, trigger, SQL in linea

La principale bellezza di una vista è che può essere utilizzata come una tabella nella maggior parte delle situazioni, ma a differenza di una tabella, può incapsulare calcoli molto complessi e join comunemente usati. Può anche utilizzare praticamente qualsiasi oggetto nel database ad eccezione delle procedure memorizzate. Le visualizzazioni sono più utili quando è sempre necessario unire lo stesso insieme di tabelle, ad esempio un ordine con un dettaglio dell'ordine per ottenere campi di calcolo di riepilogo, ecc.


6
Stai molto attento a farlo. Se utilizzi visualizzazioni che richiamano altre visualizzazioni, puoi creare un enorme pasticcio di prestazioni.
HLGEM

puoi farlo creando un metodo e inserendo la query SQL all'interno del metodo. Questo metodo può essere riutilizzato ogni volta. Allora perché visualizzare ???
ASharma7

10

Una vista è un livello di astrazione e fa ciò che fa qualsiasi buon livello di astrazione, incluso l'incapsulamento dello schema del database e la protezione dalle conseguenze della modifica dei dettagli di implementazione interna.

È un'interfaccia.


1
Finché non impili le visualizzazioni sulle visualizzazioni per un'ulteriore astrazione.
HLGEM

Penso di aver effettivamente ripudiato qualsiasi tipo di astrazione multilivello nei database relazionali. E non chiamo nemmeno le stored procedure dalle stored procedure. :)
dkretz

3

Ecco un utilizzo molto comune dell'utilizzo delle viste per vincolare un'entità in base a determinati criteri.

Tabella: USERS contiene tutti gli utenti

Vista: ACTIVE_USERS contiene tutti gli utenti esclusi quelli sospesi, bannati, in attesa di essere attivati ​​e che non soddisfano alcun criterio che potresti scegliere di definire in futuro come parte dei requisiti attivi. Ciò rende non necessario eliminare alcuna riga dalla tabella USERS se si sceglie di non farlo perché ACTIVE_USERS può sempre nascondere le righe indesiderate.

In questo modo, puoi utilizzare la tabella nelle pagine di gestione degli utenti ma il resto dell'applicazione può utilizzare ACTIVE_USERS poiché potrebbero essere gli unici utenti che dovrebbero essere in grado di eseguire processi e accedere / modificare i dati.


2

Le viste possono consentire di combinare i dati di diverse tabelle e formattarli (combinare campi, fornire nomi di campo più significativi, ecc.) In modo che sia più facile per gli utenti finali. Sono un'astrazione del modello di database. Possono anche essere utilizzati per consentire agli utenti di accedere ai dati nella tabella senza fornire loro l'accesso diretto alla tabella stessa.


2

Ecco alcuni dei molti motivi per utilizzare direttamente la visualizzazione anziché la tabella

  • Semplicità: le viste possono essere utilizzate per nascondere query complesse.
  • Sicurezza: la vista può nascondere alcune informazioni importanti all'utente finale creando una vista su alcune colonne selezionate
  • Sicurezza - Proteggi la tabella per modificarne la struttura utilizzando VIEW.
  • Ridondanza: riduce il codice ridondante in ogni procedura / query utilizzando una vista comune.
  • Calcolo: tutti i calcoli possono essere eseguiti una volta nella query di visualizzazione.
  • Nome significativo - La tabella può avere un nome per l'ID come tbl_org_emp_id che può alias come [Employee No] o un nome significativo.

Da imexploring.com


1

Un piccolo elenco di motivi / usi comuni:

  • usali per cambiare il formato o "l'aspetto" dei dati (ad esempio potresti unire un nome e un cognome insieme)

    eseguire calcoli o altre ricerche sui dati

    denormalizza i dati (estrae i dati da più tabelle in un unico punto)


-6

Le viste sono cattive! Evitarli se possibile e utilizzarli solo per il motivo menzionato da DVK: migrazione temporanea dei dati.

Dovresti capire che in un database con 100 tabelle è difficile ricordare lo scopo di ogni tabella. Ora, se aggiungi qui altre 300 visualizzazioni diventerà un disastro completo. Di conseguenza, gli "amanti della vista" tendono a utilizzare le viste nidificate e quindi le viste nidificate nelle procedure memorizzate. Personalmente lavoro ora con un database in cui ci sono viste annidate in profondità 4 volte! Quindi, per comprendere una logica più semplice di una stored procedure, devo prima passare attraverso tutte le viste.


8
-1 Le viste sono buone. Essi possono diventare il male se li usate in modo inappropriato - ma questo è vero per qualsiasi cosa.
NullUserException

1
Le viste possono essere cattive se usate male. Le persone che le usano male più frequentemente sembrano essere quelle che le usano per astrarre cose e poi fanno come dici tu, chiamano viste che chiamano viste che chiamano viste al punto in cui potresti dover materializzare 10 milioni di riproduzioni prima di restituire un risultato set di 3. Le viste che richiamano direttamente le tabelle possono essere molto utili.
HLGEM

@HGLEM c'è un modo per limitare le chiamate di visualizzazione da altre visualizzazioni?
Igor Soloydenko
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.