Caricare dimensioni a modifica lenta
Nella maggior parte dei data warehouse relazionali, tuttavia, è necessario gestire gli aggiornamenti ai dati delle dimensioni e supportare quelle che sono comunemente definite dimensioni a modifica lenta.
Tipi di dimensione a modifica lenta
Esistono più tipi di dimensione a modifica lenta, tre dei quali vengono comunemente implementati:
Tipo 0
Non è possibile modificare i dati delle dimensioni di tipo 0. Qualsiasi tentativo di modifica ha esito negativo.
DateKey | DateAltKey | Day | Month | Year |
---|---|---|---|---|
20230101 | 01-01-2023 | Domenica | Gennaio | 2023 |
Tipo 1
Nelle dimensioni di tipo 1, il record della dimensione viene aggiornato sul posto. Le modifiche apportate a una riga di dimensione esistente vengono applicate a tutti i fatti correlati alla dimensione caricati in precedenza.
StoreKey | StoreAltKey | StoreName |
---|---|---|
123 | EH199J |
Tipo 2
In una dimensione di tipo 2, una modifica a una dimensione comporta una nuova riga della dimensione. Le righe esistenti per le versioni precedenti della dimensione vengono mantenute per l'analisi cronologica dei fatti e la nuova riga viene applicata alle voci successive della tabella dei fatti.
CustomerKey | CustomerAltKey | Nome | Indirizzo | Città | DateFrom | DateTo | IsCurrent |
---|---|---|---|---|---|---|---|
1211 | jo@contoso.com | Jo Smith | 999 Main St | Seattle | 20190101 | 20230105 | Falso |
2996 | jo@contoso.com | Jo Smith | 1234 9th Ave | Boston | 20230106 | Vero |
Nota
Le dimensioni di tipo 2 includono spesso colonne per tenere traccia dei periodi di tempo effettivi per ogni versione di un'entità e/o un flag per indicare quale riga rappresenta la versione corrente dell'entità. Se si usa una chiave sostitutiva incrementale ed è sufficiente tenere traccia della versione aggiunta più di recente di un'entità, potrebbe non essere necessario usare queste colonne. Pima di prendere tale decisione, tuttavia, considerare come si cercherà la versione appropriata di un'entità quando viene immesso un nuovo fatto in base al momento in cui si verifica l'evento a cui si riferisce il fatto.
Combinazione di istruzioni INSERT e UPDATE
La logica per implementare gli aggiornamenti di tipo 1 e 2 può essere complessa ed è possibile adottare varie tecniche a tale scopo. Ad esempio, è possibile usare una combinazione di istruzioni UPDATE
e INSERT
.
-- New Customers
INSERT INTO dbo.DimCustomer
SELECT stg.*
FROM dbo.StageCustomers AS stg
WHERE NOT EXISTS
(SELECT * FROM dbo.DimCustomer AS dim
WHERE dim.CustomerAltKey = stg.CustNo)
-- Type 1 updates (name)
UPDATE dbo.DimCustomer
SET CustomerName = stg.CustomerName
FROM dbo.StageCustomers AS stg
WHERE dbo.DimCustomer.CustomerAltKey = stg.CustomerNo;
-- Type 2 updates (StreetAddress)
INSERT INTO dbo.DimCustomer
SELECT stg.*
FROM dbo.StageCustomers AS stg
JOIN dbo.DimCustomer AS dim
ON stg.CustNo = dim.CustomerAltKey
AND stg.StreetAddress <> dim.StreetAddress;
Nell'esempio precedente si presuppone che una chiave sostitutiva incrementale basata su una colonna IDENTITY
identifichi ogni riga e che la chiave sostitutiva di valore più alto per una determinata chiave alternativa indichi l'istanza più recente o "corrente" dell'entità della dimensione associata a tale chiave alternativa. Nella pratica, molti progettisti di data warehouse includono una colonna di tipo booleano per indicare l'istanza attiva corrente di una dimensione modificabile oppure usano campi di tipo data e ora per indicare i periodi di tempo attivi per ogni versione dell'istanza della dimensione. Con questi approcci, la logica per una modifica di tipo 2 deve includere un'istruzione INSERT
per la nuova riga della dimensione e un'istruzione UPDATE
per contrassegnare la riga corrente come inattiva.
Utilizzo di un'istruzione MERGE
In alternativa all'uso di più istruzioni INSERT
e UPDATE
, è possibile usare una singola istruzione MERGE
per eseguire un'operazione "upsert" per inserire nuovi record e aggiornare quelli esistenti.
MERGE dbo.DimProduct AS tgt
USING (SELECT * FROM dbo.StageProducts) AS src
ON src.ProductID = tgt.ProductBusinessKey
WHEN MATCHED THEN
-- Type 1 updates
UPDATE SET
tgt.ProductName = src.ProductName,
tgt.ProductCategory = src.ProductCategory,
tgt.Color = src.Color,
tgt.Size = src.Size,
tgt.ListPrice = src.ListPrice,
tgt.Discontinued = src.Discontinued
WHEN NOT MATCHED THEN
-- New products
INSERT VALUES
(src.ProductID,
src.ProductName,
src.ProductCategory,
src.Color,
src.Size,
src.ListPrice,
src.Discontinued);
Nota
Per altre informazioni sull'istruzione MERGE, vedere la documentazione di MERGE per Azure Synapse Analytics.