Caricare dimensioni a modifica lenta

Completato

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 High Street Store Town Central Store

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.