Condividi tramite


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:

Screenshot che mostra come la lunghezza media della coda per l'I/O del disco aumenta oltre 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:

Immagine che mostra come BAM usa due tabelle separate.
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:

Immagine che mostra come le altre attività completate vengono inserite nella nuova tabella, mentre BAM mantiene quella precedente solo per le query.
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.

Vedere anche

Infrastruttura dinamica BAM