Снимок экрана # 1 показывает несколько точек, чтобы различать Merge Join transformation
и Lookup transformation
.
Относительно поиска:
Если вы хотите найти совпадающие строки в источнике 2 на основе входных данных источника 1 и если вы знаете, что для каждой входной строки будет только одно совпадение, то я бы предложил использовать операцию поиска. В качестве примера можно привести таблицу OrderDetails
, в которой вы хотите найти совпадающие Order Id
и Customer Number
, тогда лучшим вариантом будет поиск.
Относительно объединения Регистрация:
Если вы хотите выполнить объединения, такие как выборка всех адресов (дома, на работе, в другом месте) из таблицы Address
для данного клиента в таблице Customer
, то вам нужно использовать Merge Join, потому что клиент может иметь 1 или более адресов, связанных с ними.
Пример для сравнения:
Вот сценарий, демонстрирующий разницу в производительности между Merge Join
и Lookup
. Используемые здесь данные представляют собой соединение один-к-одному, что является единственным общим сценарием для сравнения.
У меня есть три таблицы с именами dbo.ItemPriceInfo
, dbo.ItemDiscountInfo
и dbo.ItemAmount
. Создание сценариев для этих таблиц предоставляется в разделе сценариев SQL.
Таблицы dbo.ItemPriceInfo
и dbo.ItemDiscountInfo
имеют по 13 349 729 строк. Обе таблицы имеют ItemNumber в качестве общего столбца. ItemPriceInfo содержит информацию о ценах, а ItemDiscountInfo - информацию о скидках. Снимок экрана # 2 показывает количество строк в каждой из этих таблиц. Снимок экрана # 3 показывает 6 верхних строк, чтобы дать представление о данных, представленных в таблицах.
Я создал два пакета служб SSIS для сравнения производительности преобразований Merge Join и Lookup. Оба пакета должны взять информацию из таблиц dbo.ItemPriceInfo
и dbo.ItemDiscountInfo
, рассчитать общую сумму и сохранить ее в таблице dbo.ItemAmount
.
Первый пакет использовал преобразование Merge Join
и внутри него он использовал INNER JOIN для объединения данных. Снимки экрана # 4 и # 5 показывают пример выполнения пакета и продолжительность выполнения. * Выполнение пакета на основе преобразования слиянием 05
минут 14
секунд 719
миллисекунд.
Второй использованный пакет Lookup
преобразование с полным кэшем (настройка по умолчанию). скриншоты # 6 и # 7 показывают пример выполнения пакета и продолжительность выполнения. Для выполнения пакета на основе преобразования «Уточняющий запрос» потребовалось 11
минут 03
секунд 610
миллисекунд. Может появиться предупреждающее сообщение Информация: The buffer manager has allocated nnnnn bytes, even though the memory pressure has been detected and repeated attempts to swap buffers have failed.
Вот ссылка , в которой рассказывается, как рассчитать размер кэша поиска. Во время выполнения этого пакета, хотя задача «Поток данных» выполнялась быстрее, очистка конвейера заняла много времени.
Это не означает, что преобразование «Уточняющий запрос» неверно. Просто его нужно использовать с умом. Я использую это довольно часто в своих проектах, но опять же, я не имею дело с 10+ миллионами строк для поиска каждый день. Обычно мои задания обрабатывают от 2 до 3 миллионов строк, и производительность у них действительно хорошая. До 10 миллионов строк, оба показали одинаково хорошие результаты. В большинстве случаев я замечал, что узким местом оказывается компонент назначения, а не преобразования. Вы можете преодолеть это, имея несколько направлений. Здесь - пример, демонстрирующий реализацию нескольких адресатов.
Снимок экрана # 8 показывает количество записей во всех трех таблицах. Снимок экрана # 9 показывает 6 лучших записей в каждой из таблиц.
Надеюсь, это поможет.
Сценарии 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
Скриншот № 1:

Скриншот № 2:

Снимок экрана № 3:

Снимок экрана № 4:

Снимок экрана № 5:

Снимок экрана № 6:

Снимок экрана № 7:

Снимок экрана № 8:

Снимок экрана № 9:
