Domanda

Genero raramente (mensilmente/trimestralmente) centinaia di report Crystal Reports utilizzando le visualizzazioni del database Microsoft SQL Server 2005.Queste visualizzazioni sprecano cicli di CPU e RAM per tutto il tempo in cui non le leggo?Dovrei invece utilizzare procedure memorizzate, tabelle temporanee o tabelle normali di breve durata poiché leggo raramente dalle mie visualizzazioni?

Non sono un DBA quindi non so cosa succede dietro le quinte all'interno del server del database.

È possibile avere troppe visualizzazioni del database?Cosa è considerata la migliore pratica?

È stato utile?

Soluzione

Per la maggior parte, non importa.Sì, SQL Server avrà più scelte quando analizzerà SELECT * FROM table (dovrà cercare "table" nei cataloghi di sistema) ma è altamente ottimizzato per questo e purché si disponga di RAM sufficiente (la maggior parte dei server al giorno d'oggi lo fa) , non noterai alcuna differenza tra 0 e 1.000 visualizzazioni.

Tuttavia, dal punto di vista delle persone, cercare di gestire e capire cosa stanno facendo "centinaia" di visualizzazioni è probabilmente impossibile, quindi probabilmente hai molto codice duplicato.Cosa succede se cambiano alcune regole aziendali integrate in queste visualizzazioni ridondanti?

Il punto di vista principale è incapsulare la logica aziendale in una pseudo tabella (quindi potresti avere una tabella persona, ma poi una vista chiamata "active_persons" che fa un po' di magia).Creare una visualizzazione per ogni report è un po' sciocco a meno che ogni report non sia così isolato e unico da non poter essere riutilizzato.

Altri suggerimenti

Una vista è una query eseguita spesso con parametri preimpostati.Se sai che guarderai sempre gli stessi dati, puoi creare una vista per facilità d'uso e per l'associazione dei dati.

Detto questo, quando selezioni da una vista, la query di definizione della vista viene eseguita insieme alla query che stai eseguendo.

Ad esempio, se vwCustomersWhoHavePaid è:

Select * from customers where paid = 1

e la query che stai eseguendo restituisce i clienti che hanno pagato dopo il primo agosto è formattata in questo modo:

Select * from vwCustomersWhoHavePaid where datepaid > '08/01/08'

La query che stai effettivamente eseguendo è:

Select * from (Select * from customers where paid = 1) where datepaid > '08/01/08'

Questo è qualcosa che dovresti tenere a mente quando crei le visualizzazioni, sono un modo per archiviare i dati che guardi spesso.È solo un modo di organizzare i dati in modo che sia più facile accedervi.

Le visualizzazioni occuperanno risorse CPU/memoria solo quando vengono chiamate.

In ogni caso, la pratica migliore sarebbe consolidare ciò che può essere consolidato, rimuovere ciò che può essere rimosso e, se viene utilizzato letteralmente solo dai report, scegliere uno standard di denominazione coerente per le visualizzazioni in modo che possano essere facilmente raggruppate insieme quando si cerca una visualizzazione particolare .

Inoltre, a meno che tu non abbia realmente bisogno dell'isolamento transazionale, considera l'utilizzo dell'hint della tabella NOLOCK nelle tue query.

--Kevin Fairchild

Tu chiedi:Cosa succede dietro le quinte?

Una vista è un insieme di testo SQL.Quando una query utilizza una vista, SQL Server inserisce il testo SQL nella query.Ciò avviene PRIMA dell'ottimizzazione.Il risultato è che l'ottimizzatore può considerare il codice combinato invece di due parti di codice separate per il miglior piano di esecuzione.

Dovresti guardare i piani di esecuzione delle tue query!C'è così tanto da imparare lì.

SQL Server ha anche il concetto di a vista raggruppata.UN vista raggruppata è un set di risultati gestito dal sistema (ogni inserimento/aggiornamento/eliminazione nelle tabelle sottostanti può causare inserimento/aggiornamento/eliminazione nelle tabelle sottostanti vista raggruppatai dati).È un errore comune pensare che le opinioni operino in questo modo viste raggruppate operare.

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