ProgrammazioneSviluppatore Backend

Che cos'è una vista indicizzata (Indexed View) in SQL, come viene implementata, a cosa serve e quali sono le insidie nel suo utilizzo?

Supera i colloqui con l'assistente IA Hintsage

Risposta.

Una vista indicizzata (Indexed View, vista materializzata con indice) è una vista (VIEW) per la quale è stato creato un indice unico cluster. Questo consente di memorizzare fisicamente i risultati della query su disco e di utilizzare l'indice per accelerare l'accesso.

Vantaggi:

  • Recupero rapido di dati aggregati o frequentemente utilizzati.
  • Riduce il carico di calcoli in tempo reale.

Limitazioni:

  • Non tutti i tipi di query sono supportati (ad esempio, non è possibile utilizzare i tipi di dati TEXT, NTEXT, IMAGE, alcune funzioni).
  • Costi aggiuntivi per la manutenzione dell'indice durante le modifiche nella tabella di base.
  • Richiede il rispetto di un insieme di regole rigorose nella dichiarazione.

Esempio di codice

CREATE VIEW dbo.SalesSummary WITH SCHEMABINDING AS SELECT SalesPersonID, COUNT_BIG(*) AS SalesCount, SUM(TotalDue) AS TotalDue FROM dbo.Sales GROUP BY SalesPersonID; GO CREATE UNIQUE CLUSTERED INDEX idx_SalesSummary ON dbo.SalesSummary (SalesPersonID);

Domanda trabocchetto.

D: Tutte le viste consentono di creare un indice (cluster)?

R: No, è possibile indicizzare solo quelle VIEW che soddisfano completamente le limitazioni (ad esempio, nessun riferimento esterno, funzioni aggregate concordate, ecc.). In caso contrario, la query di creazione dell'indice restituirà un errore.

Esempi di errori reali a causa della mancanza di conoscenza delle sottigliezze dell'argomento.


Storia

In un progetto reale in un sistema bancario era necessario accelerare le selezioni sui report aggregati. È stata creata una vista indicizzata senza analizzare il carico sulle tabelle di aggiornamento. Durante operazioni di inserimento massivo, le prestazioni della tabella principale sono crollate a causa dei significativi costi di aggiornamento dell'indice della vista.


Storia

Un esperto ha erroneamente pensato che fosse possibile indicizzare una VIEW con un JOIN specificato su una tabella esterna e la funzione GETDATE(). La query di creazione dell'indice è terminata con l'errore "Impossibile creare un indice su una vista con funzioni non deterministiche". È stata spesa una giornata per correggere l'architettura del progetto.


Storia

In un grande progetto di e-commerce, l'aggiornamento dei dati nella tabella di base "Products" ha causato problemi di blocco. La causa è stata una gestione errata delle transazioni in presenza di una grande vista indicizzata, in cui l'aggregazione interessava milioni di righe.