remove - sql server lock monitor



Visualizzazioni di SQL Server, benedizione o maledizione? (8)

Ci sono alcuni ottimi usi per le visualizzazioni; Li ho usati molto per la messa a punto e per l'esposizione di serie di informazioni meno normalizzate, o per UNION-i risultati di più selezioni in un singolo set di risultati.

Ovviamente qualsiasi strumento di programmazione può essere usato in modo errato, ma non riesco a pensare a volte nella mia esperienza in cui una vista mal sintonizzata ha causato qualsiasi tipo di inconvenienti dal punto di vista delle prestazioni e il valore che possono fornire fornendo selettori esplicitamente sintonizzati ed evitando la duplicazione di codice SQL complesso può essere significativa.

Per inciso, non sono mai stato un fan delle "regole" architettoniche che si basano sul mantenere gli sviluppatori dal farsi del male. Queste regole hanno spesso effetti collaterali indesiderati: l'ultimo posto in cui ho lavorato non consentiva l'utilizzo dei valori NULL nel database, perché gli sviluppatori potrebbero dimenticare di verificare la presenza di null. Questo ha finito per costringerci a lavorare su date "1/1/1900" e interi in default a "0" in tutto il software costruito contro i database, e introducendo una serie di bug causati da sviluppatori che lavoravano in luoghi in cui NULL era il valore appropriato .

https://src-bin.com

Una volta ho lavorato con un architetto che ha vietato l'uso delle viste SQL. La sua ragione principale era che le opinioni rendevano troppo facile per un programmatore spensierato coinvolgere inutilmente le tabelle unite che, se quel programmatore avesse provato più difficile, potevano essere evitate del tutto. Implicitamente, stava incoraggiando il riutilizzo del codice tramite copia e incolla anziché l'incapsulamento nelle viste.

Il database aveva quasi 600 tabelle ed era altamente normalizzato, quindi la maggior parte dell'utile SQL era necessariamente prolissa.

Diversi anni dopo, posso vedere almeno un risultato negativo dal divieto: abbiamo molte centinaia di processi memorizzati e densi e lunghi che rasentano l'irraggiungibile.

Con il senno di poi, direi che è stata una decisione sbagliata, ma quali sono le tue esperienze con le viste SQL? Li hai trovati male per le prestazioni? Qualche altra idea su quando sono o non sono appropriati?


Answer #1

Come tutte le visualizzazioni di potere hanno il suo lato oscuro. Tuttavia, non è possibile incolpare le visualizzazioni quando qualcuno scrive codice errato. Inoltre, le visualizzazioni possono limitare l'esposizione di alcune colonne e fornire ulteriore sicurezza.


Answer #2

Il mio attuale database era completamente inondato da innumerevoli piccoli tavoli di non più di 5 file ciascuno. Beh, potevo contarli ma era disordinato. Queste tabelle contenevano semplicemente valori di tipo costante (si pensi all'enum) e potevano essere facilmente combinati in un'unica tabella. Ho quindi creato delle viste che simulavano ciascuna delle tabelle che ho cancellato per garantire la retrocompatibilità all'indietro. Ha funzionato alla grande


Answer #3

Le viste ci sono state utili nel loro ruolo per l'uso da parte di applicazioni pubbliche basate sul web che si tuffano da un database di produzione. La sicurezza semplificata è il vantaggio principale che vediamo dal momento che la progettazione della tabella nel database può combinare dati sensibili e non sensibili all'interno della stessa tabella. Una procedura memorizzata condivide gran parte di questo vantaggio, ma la vista è di sola lettura, presenta potenziali vantaggi di interoperabilità ed è una cosa meno complessa da implementare per i giovani.

Questo vantaggio di astrazione della sicurezza si applica anche quando le viste vengono utilizzate per query ad hoc dell'utente finale; questo sarebbe meno vantaggioso se avessimo una rappresentazione adeguata e piatta dei dati dei nostri data warehouse.


Answer #4

Le visualizzazioni sono utili per le query ad hoc, il tipo che un DBA esegue dietro le quinte quando lui / lei ha bisogno di un accesso rapido ai dati per vedere cosa sta succedendo con il sistema.

Ma possono essere dannosi per il codice di produzione. In parte il motivo è che è imprevedibile quali sono gli indici di cui avrai bisogno in una vista, poiché la clausola where può essere diversa e quindi difficile da sintonizzare. Inoltre, in genere si restituiscono molti più dati di quanto sia effettivamente necessario per le singole query che utilizzano la visualizzazione. Ognuna di queste query potrebbe essere rafforzata e messa a punto individualmente.

Vi sono usi specifici delle visualizzazioni nei casi di partizionamento dei dati che possono essere estremamente utili, quindi non sto dicendo che dovrebbero essere evitati del tutto. Sto solo dicendo che se una vista può essere sostituita da alcune stored procedure, starai meglio senza la vista.


Answer #5

Non è un grande fan dei punti di vista (non ricordo l'ultima volta che ne ho scritto uno), ma non li vieterei del tutto. Se il tuo database ti consente di inserire indici nelle viste e non solo sul tavolo, puoi spesso migliorare le prestazioni un po ', il che le rende migliori. Se stai usando le viste, assicurati di indicizzarle.

Vedo solo la necessità di viste per il partizionamento dei dati e per i join estremamente complessi che sono davvero critici per l'applicazione (pensare ai report finanziari qui dove partire dallo stesso set di dati per tutto ciò potrebbe essere fondamentale). So che alcuni strumenti di segnalazione sembrano preferire le visualizzazioni rispetto ai proc memorizzati.

Sono un grande sostenitore di non restituire mai più record o campi di quelli necessari in un'istanza specifica e l'uso eccessivo delle visualizzazioni tende a rendere le persone restituire più campi (e in troppi casi, troppi join) rispetto a quelli necessari che sprecano risorse di sistema .

Tendo anche a vedere che le persone che si affidano alle visualizzazioni (non lo sviluppatore della vista - le persone che le usano solo) spesso non capiscono molto bene il database (quindi potrebbero sbagliare se non utilizzano la vista) e questo per me è fondamentale per scrivere un buon codice contro il database. Voglio che le persone capiscano quello che stanno chiedendo al db di fare, non fare affidamento su una scatola magica nera di una vista. Questa è tutta un'opinione personale, naturalmente, il tuo chilometraggio può variare.

Come BlaM personalmente non li ho trovati più facili da gestire dei proc memorizzati.

Modificato nell'ottobre 2010 per aggiungere: Da quando ho scritto originariamente questo, ho avuto l'occasione di lavorare con un paio di database progettati da persone che erano dipendenti dall'utilizzo di viste. Ancor peggio, hanno utilizzato viste che hanno chiamato viste che hanno chiamato view (al punto in cui alla fine raggiungiamo il limite del numero di tabelle che possono essere chiamate). Questo era un incubo da prestazione. Sono occorsi 8 minuti per ottenere un conteggio semplice (*) dei record in un'unica visualizzazione e molto più tempo per ottenere i dati. Se si utilizzano le viste, prestare molta attenzione all'utilizzo di viste che chiamano altre visualizzazioni. Costruirai un sistema che molto probabilmente non funzionerà con il normale carico di prestazioni in produzione. In SQL Server puoi solo indicizzare le viste che non chiamano altre visualizzazioni, quindi cosa succede quando usi le viste in una catena, è che l'intero set di record deve essere costruito per ogni vista e non è fino a quando non arrivi al l'ultimo in cui vengono applicati i criteri della clausola where. Potrebbe essere necessario generare milioni di record solo per vedere tre. Puoi iscriverti alla stessa tabella 6 volte quando devi solo unirti ad esso una volta, puoi restituire molte molte più colonne di quelle necessarie nel set di risultati finali.


Answer #6

Una cosa che non è stata menzionata finora è l'uso delle viste per fornire un'immagine logica dei dati agli utenti finali per la creazione di report ad hoc o simili.

Questo ha due pregi:

  1. Per consentire all'utente di selezionare singole "tabelle" contenenti i dati che si aspettano, piuttosto che richiedere agli utenti relativamente non tecnici di elaborare join potenzialmente complessi (poiché il database è normalizzato)
  2. Fornisce un mezzo per consentire un certo grado di accesso ah hoc senza esporre i dati o la struttura agli utenti finali.

Anche con report non ad hoc, a volte è significativamente più semplice fornire una vista al sistema di reporting che contiene i dati relidivi, separando nettamente la produzione di dati dalla presentazione degli stessi.


Answer #7

Utilizziamo le viste per tutte le nostre semplici esportazioni di dati in file CSV. Questo semplifica il processo di scrittura di un pacchetto e l'incorporamento di sql all'interno del pacchetto che diventa ingombrante e difficile da debugare.

Usando le viste, possiamo eseguire una vista e vedere esattamente ciò che è stato esportato, senza cruft o incognite. Aiuta molto nella risoluzione dei problemi con esportazioni di dati improprie e nasconde tutti i join complessi dietro la vista. Certo, utilizziamo un sistema legacy molto vecchio da un sistema basato TERMS che esporta in SQL, quindi i join sono un po 'più complessi del solito.





sql