Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Quali sono le differenze tra le trasformazioni Merge Join e Lookup in SSIS?

Screenshot #1 mostra alcuni punti per distinguere tra Merge Join transformation e Lookup transformation .

Riguardo alla ricerca:

Se vuoi trovare le righe corrispondenti nella fonte 2 in base all'input della fonte 1 e se sai che ci sarà solo una corrispondenza per ogni riga di input, ti suggerirei di usare l'operazione di ricerca. Un esempio potresti essere tu OrderDetails tabella e si desidera trovare l'Order Id corrispondente e Customer Number , quindi Cerca è un'opzione migliore.

Per quanto riguarda l'unione di unisci:

Se desideri eseguire unioni come recuperare tutti gli indirizzi (casa, lavoro, altro) da Address tabella per un determinato Cliente nel Customer tabella, quindi devi andare con Unisci unisciti perché il cliente può avere 1 o più indirizzi associati.

Un esempio da confrontare:

Ecco uno scenario per dimostrare le differenze di prestazioni tra Merge Join e Lookup . I dati utilizzati qui sono un join uno a uno, che è l'unico scenario comune tra loro da confrontare.

  1. Ho tre tabelle denominate dbo.ItemPriceInfo , dbo.ItemDiscountInfo e dbo.ItemAmount . Gli script di creazione per queste tabelle sono forniti nella sezione degli script SQL.

  2. Tabelledbo.ItemPriceInfo e dbo.ItemDiscountInfo entrambi hanno 13.349.729 righe. Entrambe le tabelle hanno ItemNumber come colonna comune. ItemPriceInfo ha informazioni sul prezzo e ItemDiscountInfo ha informazioni sugli sconti. Screenshot #2 mostra il conteggio delle righe in ciascuna di queste tabelle. Screenshot n. 3 mostra le prime 6 righe per dare un'idea dei dati presenti nelle tabelle.

  3. Ho creato due pacchetti SSIS per confrontare le prestazioni delle trasformazioni Merge Join e Lookup. Entrambi i pacchetti devono prendere le informazioni dalle tabelle dbo.ItemPriceInfo e dbo.ItemDiscountInfo , calcola l'importo totale e salvalo nella tabella dbo.ItemAmount .

  4. Primo pacchetto utilizzato Merge Join trasformazione e al suo interno ha utilizzato INNER JOIN per combinare i dati. Screenshot #4 e #5 mostra l'esecuzione del pacchetto di esempio e la durata dell'esecuzione. Ci sono voluti 05 minuti 14 secondi 719 millisecondi per eseguire il pacchetto basato sulla trasformazione Merge Join.

  5. Secondo pacchetto utilizzato Lookup trasformazione con cache completa (che è l'impostazione predefinita). creenshots #6 e #7 mostra l'esecuzione del pacchetto di esempio e la durata dell'esecuzione. Ci sono voluti 11 minuti 03 secondi 610 millisecondi per eseguire il pacchetto basato sulla trasformazione Lookup. È possibile che venga visualizzato il messaggio di avviso Informazioni:The buffer manager has allocated nnnnn bytes, even though the memory pressure has been detected and repeated attempts to swap buffers have failed. Ecco un link che parla di come calcolare la dimensione della cache di ricerca. Durante l'esecuzione di questo pacchetto, anche se l'attività Flusso di dati è stata completata più rapidamente, la pulizia della pipeline ha richiesto molto tempo.

  6. Questo non significa che la trasformazione di ricerca è negativa. È solo che deve essere usato con saggezza. Lo uso abbastanza spesso nei miei progetti, ma ancora una volta non mi occupo di oltre 10 milioni di righe per la ricerca ogni giorno. Di solito, i miei lavori gestiscono tra 2 e 3 milioni di righe e per questo le prestazioni sono davvero buone. Fino a 10 milioni di righe, entrambe si sono comportate ugualmente bene. Il più delle volte quello che ho notato è che il collo di bottiglia risulta essere la componente di destinazione piuttosto che le trasformazioni. Puoi superarlo avendo più destinazioni. Qui è un esempio che mostra l'implementazione di più destinazioni.

  7. Screenshot #8 mostra il conteggio dei record in tutte e tre le tabelle. Screenshot #9 mostra i primi 6 record in ciascuna delle tabelle.

Spero di esserti stato d'aiuto.

Script SQL:

CREATE TABLE [dbo].[ItemAmount](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [ItemNumber] [nvarchar](30) NOT NULL,
    [Price] [numeric](18, 2) NOT NULL,
    [Discount] [numeric](18, 2) NOT NULL,
    [CalculatedAmount] [numeric](18, 2) NOT NULL,
CONSTRAINT [PK_ItemAmount] PRIMARY KEY CLUSTERED ([Id] ASC)) ON [PRIMARY]
GO

CREATE TABLE [dbo].[ItemDiscountInfo](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [ItemNumber] [nvarchar](30) NOT NULL,
    [Discount] [numeric](18, 2) NOT NULL,
CONSTRAINT [PK_ItemDiscountInfo] PRIMARY KEY CLUSTERED ([Id] ASC)) ON [PRIMARY]
GO

CREATE TABLE [dbo].[ItemPriceInfo](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [ItemNumber] [nvarchar](30) NOT NULL,
    [Price] [numeric](18, 2) NOT NULL,
CONSTRAINT [PK_ItemPriceInfo] PRIMARY KEY CLUSTERED ([Id] ASC)) ON [PRIMARY]
GO

Schermata n. 1:

Schermata n. 2:

Schermata n. 3:

Schermata n. 4:

Schermata n. 5:

Schermata n. 6:

Schermata n. 7:

Schermata n. 8:

Schermata n. 9: