Domanda

Ho generato vista indicizzata (cluster indice univoco Table1_ID) con i quali T-SQL:

Select Table1_ID, Count_BIG(*) as Table2TotalCount from Table2 inner join
Table1 inner join... where Table2_DeletedMark=0 AND ... Group BY Table1_ID

indice univoco anche dopo aver creato la vista, abbiamo impostato cluster colonna Table1_ID.
Così View è composta da due colonne:

Table1_ID
Table2TotalCount

T-SQL per la creazione di View è un pesante a causa di gruppo da e diversi milioni di righe in Table2.

Ma quando si esegue una query per una vista come

Select Total2TotalCount from MyView where Table1_ID = k

-. Esegue velocemente e senza spese generali per il server

Anche in T-SQL per la creazione di immagine molte condizioni in cui clausola colonne Table2. E Se ho cambiato Table2_DeletedMark a 1 ed eseguire una query

Select Total2TotalCount from MyView where Table1_ID = k

ancora una volta - Prendo risultati corretti. (Table2TotalCount diminuito di 1).

Così le nostre domande sono:
1. Perché il tempo di esecuzione di query è diminuita così tanto quando abbiamo usato vista indicizzata (confrontare senza vista uso (anche corriamo DBCC DROPCLEANBUFFERS() prima di eseguire query per VIEW))
2. Dopo aver modificato

Table2_DeletedMark 

Visualizza immediatamente ricalcolato e otteniamo risultati corretti, ma qual è il dietro processo? non possiamo immaginare che esegue SQL T-SQL da quello di vista è stato generato ogni volta che cambia qualsiasi valore di 10+ colonne contenenti una t-sql vista generatrice, perché è troppo pesante.
Ci rendiamo conto che è sufficiente eseguire una semplice query per valori Ricalcola, dipende dai valori delle colonne che cambiano.
Ma come fa SQL capirlo?

È stato utile?

Soluzione

Una vista indicizzata è materializzato esempio le righe che contiene (dalle tabelle da cui dipende) sono fisicamente memorizzato sul disco - proprio come una tabella "sistema computerizzata" che è sempre mantenuto aggiornato ogni volta che la sua tabelle sottostanti cambiamento. Questo viene fatto aggiungendo l'indice cluster -. Le pagine foglia dell'indice cluster su una tabella di SQL Server (o vista) sono le pagine di dati, in realtà

Colonne in una vista indicizzata può essere indicizzato con indici non cluster, troppo, e in tal modo è possibile migliorare le prestazioni di query ancora di più. Il lato negativo è:. Dal momento che le file sono memorizzati, avete bisogno di spazio su disco (e alcuni dati vengano duplicati, ovviamente)

Una vista normale d'altra parte è solo un frammento di SQL che sarà eseguito per calcolare i risultati - in base a ciò che si seleziona da questo punto di vista. Non c'è rappresentazione fisica di questa tesi, non ci sono righe memorizzate per una vista normale - hanno bisogno di essere uniti dalle tabelle di base come necessario

.

Altri suggerimenti

Perché pensi che ci sono così tante regole bizzarre su ciò che è consentito in viste indicizzate, e quali sono le tabelle di base è permesso di fare? E 'così che il motore SQL può subito sapere "Se io sto toccando questa riga, colpisce potenzialmente il risultato di questa visione - Vediamo, questa riga non è più adatta ai criteri di vista, ma ho insistito per avere un COUNT_BIG (*), quindi posso solo diminuire il valore di un "

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