Vista Indicizzata per l’Aggregazione delle Metriche

Microsoft Azure SQL è una piattaforma database robusta e completamente gestita, progettata per interrogazioni ad alte prestazioni, archiviazione di dati relazionali e analisi. Per un’applicazione web tipica con un backend, è una buona scelta quando vogliamo considerare un database gestito che può scalare sia verticalmente che orizzontalmente.

Un software applicativo genera metriche utente su base giornaliera, che possono essere utilizzate per report o analisi. Azure SQL è una scelta eccellente da considerare per memorizzare e interrogare questi dati a determinate condizioni:

  1. Le query analitiche richiedono join con altre tabelle (applicando filtri sull’interfaccia utente)
  2. Vuoi combinare dati storici e transazionali
  3. Il volume dei dati non è estremamente grande e le prestazioni delle query possono essere gestite tramite ottimizzazione

Consideriamo un esempio di un sito di prenotazione hotel che utilizza Azure SQL nel backend. Vogliamo vedere un dashboard dell’interfaccia utente per monitorare l’attività degli utenti, come i clic sul sito, le visite alla pagina di descrizione dell’hotel, le prenotazioni effettuate, ecc.

Supponiamo che tutti questi dati di telemetria siano raccolti per ogni utente su una base giornalierain uno storage non strutturato, e stiamo estraendo questi dati nel nostro database utilizzando lavori in background, come Apache Airflow.

Di seguito è riportato lo schema per la tabella utenti e una tabella per memorizzare le metriche giornaliere.

MS SQL

 

Puoi trarre molte informazioni utili dalle tabelle sopra.

Consideriamo un esempio specifico. Abbiamo bisogno di aggregare le metriche di attività giornaliera raggruppate per data in ordine decrescente per i clienti tra i 30 e i 40 anni situati a New York City. Di seguito è riportata la query:

MS SQL

 

Ora possiamo analizzare le tendenze giornaliere di questo gruppo di utenti che si trovano a New York e hanno tra i 30 e i 40 anni. La tabella è per lo più performante e siamo in grado di eseguire facilmente query di intervallo distribuite su più mesi. Con il tempo, i nostri requisiti crescono. Ora vogliamo tracciare il comportamento dell’utente in un intervallo settimanale o mensile. Ma la nostra tabella memorizza i dati su base giornaliera. Ora abbiamo due opzioni:

  • Eseguire la query sulla tabella e raggruppare la date_created settimanalmente o mensilmente, a seconda della richiesta.
  •  Creare un paio di viste che aggregano i dati su base settimanale o mensile per utente. Vedere la query qui sotto:
MS SQL

 

Tuttavia, una cosa importante da considerare è che le viste forniscono solo un’astrazione della query di base che interroga semplicemente la tabella sottostante. Le viste materializzate sono il prossimo pensiero che viene in mente. Tuttavia, devono essere aggiornate manualmente o su base programmata, a causa della quale i dati in tempo reale non sono disponibili.

Per affrontare queste problematiche, Azure SQL Server offre una grande funzionalità nota come Vista Indicizzata. Una Vista Indicizzata è una rappresentazione fisica di una vista memorizzata nel database con un indice cluster unico. Le modifiche alle tabelle sottostanti aggiornano automaticamente la vista indicizzata per mantenerla sincronizzata. Utilizza un indice cluster che organizza i dati nella vista in base all’ordine delle chiavi dell’indice.

La vista indicizzata è ideale per scenari in cui abbiamo bisogno di dati in tempo reale e la nostra query coinvolge join complessi tra più tabelle. È anche adatta per il nostro caso d’uso in cui i dati esistenti vengono raramente aggiornati ma interrogati spesso, e abbiamo query basate su intervallo e vogliamo effettuare un recupero ordinato.

C’è da considerare alcune cose prima di decidere se optare per le viste indicizzate. Le viste indicizzate non possono avere funzioni non deterministiche. Una nondeterministica è una funzione che non restituisce sempre lo stesso risultato per lo stesso input, anche quando eseguita con argomenti identici e nelle stesse condizioni di database. Inoltre, una vista indicizzata è una struttura reale che richiede spazio di archiviazione, simile a una Vista Materializzata.

La sintassi per creare una Vista Indicizzata è simile alla query di creazione della Vista sopra. Tuttavia, non possiamo avere funzioni non deterministiche durante la creazione di una vista indicizzata. La riga DATEADD(DAY, -(DATEPART(WEEKDAY, date) - 1), date) AS week_start nella query della vista sopra dipende dall’impostazione specifica della sessione SET DATEFIRST, che determina il primo giorno della settimana. Questo è considerato non deterministico poiché produrrà risultati diversi in base a diverse condizioni.

Tenendo presente quanto detto sopra, possiamo procedere all’eliminazione del calcolo non deterministico rendendo la colonna deterministica. Aggiungiamo una colonna week_start alla tabella sottostante e precomputiamo e riempiamo il valore week_start nella tabella per i recupero dati giornalieri. Quindi, le righe con date D1 a D7 appartengono a W1, le date D8 a D14 appartengono a W2, e così via.

Ora, possiamo procedere a creare una vista indicizzata con il seguente SQL.

MS SQL

 

Dopo la creazione di questa vista indicizzata, possiamo interrogarla come segue:

MS SQL

 

Conclusione

Una vista indicizzata avrà un tempo di interrogazione significativamente più veloce rispetto a una vista di base o all’interrogazione diretta della tabella per grandi set di dati in cui i dati sono cresciuti fino a un milione di righe o più. L’utente finale avrà un’esperienza a bassa latenza e le interrogazioni al database saranno ottimizzate. Poiché abbiamo aggregato una settimana di dati in 1 riga, abbiamo ridotto il tempo di aggregazione di 1/7.

Source:
https://dzone.com/articles/indexed-view-for-aggregating-metrics