Memorizzazione dei dati di attività
In questo argomento viene fornita la descrizione della memorizzazione dei dati di attività, dei problemi a livello di prestazioni provocati dall'ingrandimento delle tabelle di attività nel corso del tempo e del modo in cui BAM consente di risolvere questi problemi di prestazione con tabelle separate per le attività in corso e per le attività completate. In questo argomento viene inoltre fornita la descrizione della finestra in linea per l'esecuzione di query e del modo in cui il partizionamento in BAM consente di migliorare le prestazioni.
L'idea alla base della memorizzazione dei dati delle attività consiste nel dedicare una tabella separata a ogni tipo di attività in cui ciascun record rappresenti una diversa istanza di un'attività (ad esempio in corso o completata).
In questo esempio, se l'attività fosse relativa a ordini di acquisto, la tabella si presenterebbe come segue:
N. ordine acquisto | Ora ricezione | City | Quantity | Ora spedizione | Ora consegna |
---|---|---|---|---|---|
123 | 8:00 | Seattle | 150 | 24:00 | 12.45 |
124 | 8:30 | Seattle | 234 | 8:45 | 13:20 |
125 | 8:35 | Redmond | 87 | 9:05 | 2:30 |
126 | 8:45 | Seattle | 450 | 20:00 | 13:10 |
127 | 8:55 | Redmond | 200 | 9:30 | <NULL> |
128 | 8:57 | Seattle | 340 | 20:00 | 13:05 |
129 | 9:12 | Seattle | 120 | 9:45am | <NULL> |
130 | 9:30 | Redmond | 25 | 10:15 | <NULL> |
131 | 9:45 | Seattle | 250 | 10:35 | <NULL> |
132 | 10:00 | Redmond | 100 | <NULL> | <NULL> |
133 | 10:15 | Seattle | 230 | <NULL> | <NULL> |
134 | 10:25 | Redmond | 45 | <NULL> | <NULL> |
Quando in BAM viene ricevuto un nuovo ordine di acquisto, viene inserita una nuova riga nella tabella e in alcune colonne vengono impostati valori non null (Ora ricezione, Città, Quantità e così via). In seguito, quando l'ordine di acquisto viene approvato e si dà avvio alla spedizione, l'Ora spedizione viene impostata su un valore non null. Infine, quando si riceve e si conferma la spedizione, l'Ora consegna viene impostata su un valore non null.
L'efficacia di questa implementazione semplicistica diminuisce rapidamente nel corso del tempo. All'inizio le prestazioni sono limitate dal numero delle transazioni gestibili nel server con SQL Server, praticamente legate alla CPU, ma in seguito peggiorano drasticamente. Contemporaneamente la lunghezza media della coda per l'I/O su disco supera i limiti accettabili:
Confronto tra prestazioni di scrittura BAM e coda del disco
Il motivo di tale situazione risiede nelle dimensioni della tabella, che aumentano proporzionalmente alla quantità di istanze del processo di business completate. Ad esempio, la prima volta l'istruzione UPDATE della stored procedure avvia una ricerca del numero di ordine di acquisto nell'indice cluster e legge alcune pagine in memoria. Poiché le istanze del processo dell'ordine di acquisto sono indipendenti (per alcune è necessario molto tempo mentre per altre poco) la chiamata successiva alla stored procedure può interessare un'istanza diversa dell'ordine di acquisto e di conseguenza può richiedere la lettura di pagine di dati diverse in memoria. Finché il numero totale dei record dell'ordine di acquisto rimane piccolo, SQL Server consentirà la memorizzazione nella cache di tutte le pagine di dati. Quando il numero dei record aumenta sensibilmente, la percentuale dei riscontri nella cache diminuisce e per ogni operazione sarà necessaria una lettura del disco fisico. È evidente che in questa situazione non è possibile alcuna attività di query nella tabella.
Tabelle BAM
Per evitare questo problema in BAM vengono utilizzate due tabelle distinte: una per le attività ancora in corso e l'altra per le attività completate, come nella seguente figura:
Tabelle BAM
L'idea illustrata in questa figura è di disporre di una tabella relativamente piccola in cui si verificano gli aggiornamenti e di un'altra le cui dimensioni aumentano ma alla quale l'accesso avviene in modo incrementale (solo istruzioni INSERT). Nell'esempio solo gli ordini in corso di elaborazione vengono inseriti nella tabella attiva mentre tutti gli ordini già evasi vengono inseriti nella tabella completata.
A causa del trigger, questa struttura di tabelle è inizialmente più lenta rispetto all'esecuzione di INSERT/UPDATE in una tabella singola ma nel corso del tempo le prestazioni della scrittura si mantengono stabili.
Finestra in linea per dati di attività
La memorizzazione delle attività consente di risolvere principalmente le query relative ad attività correnti o completate di recente. In BAM viene eseguita l'archiviazione e la successiva eliminazione di attività completate molto vecchie dal database di importazione primaria BAM. Pertanto, i dati di attività attraversano BAM e sono disponibili per le query in una finestra in linea configurabile.
Partizionamento BAM
Per consentire prestazioni migliori ed evitare tempi di inattività, per la memorizzazione delle attività viene utilizzato il partizionamento basato su data e ora di completamento dell'attività. Per questo scopo, le tabelle complete vengono sostituite regolarmente da tabelle vuote di formato esattamente identico. Terminata questa sostituzione, le ulteriori attività completate vengono inserite nella nuova tabella mentre la tabella precedente viene conservata in BAM per le query, come illustrato nella figura seguente:
Scambio di partizioni in BAM
Quando una partizione è del tutto esterna alla finestra in linea, viene archiviata ed eliminata. Per ridurre questa complessità per l'utente, in BAM è disponibile anche una visualizzazione partizionata del form:
SELECT * FROM Active
UNION ALL
SELECT * FROM Completed
UNION ALL
Questa visualizzazione viene ricreata automaticamente ogni volta che una partizione viene creata o eliminata.
Tenere presente la seguente considerazione sul partizionamento BAM:
Il nome della vista partizionata è bam_<ActivityName>_AllInstances. Questa visualizzazione non è destinata a query dirette ma è utile nella risoluzione dei problemi relativi alla strumentazione BAM. Le query devono essere eseguite sui dati contenuti nelle visualizzazioni specifiche di ogni categoria di utenti di business, visualizzazioni che vengono create sulla base di questa visualizzazione. Per altre informazioni, vedere Esecuzione di query sui dati dell'istanza.
Per impostare la finestra online, modificare i valori per OnlineWindowTimeUnit e OnlineWindowLength nel record per l'attività corrente nella tabella bam_Metadata_Activities nel database di importazione primaria.
Il pacchetto DTS , BAM_DM_<ActivityName>, esegue il partizionamento e l'archiviazione/eliminazione. Ogni volta che si esegue il pacchetto, un'altra partizione viene troncata e vengono archiviate/eliminate tutte le partizioni esterne alla finestra in linea.
Se il database di archiviazione non è configurato, i dati di attività vengono eliminati senza archiviazione.