Когда речь идет о обработке больших многомерных наборов данных в SQL Server, производительность является важным фактором, который следует учитывать. В то время как SQL Server Integration Services (SSIS) предоставляет преобразование SCD (Slowly Changing Dimension), оно может быть не самым эффективным вариантом для работы с большими наборами данных. Фактически, преобразование SCD в SSIS может быть медленным и затратным.
К счастью, существует альтернативное решение, которое может значительно улучшить производительность: использование T-SQL. В этой статье мы рассмотрим пример использования T-SQL для обработки медленно изменяющейся размерности типа 1 и 2, которая работает в 20 раз быстрее, чем преобразование SCD в SSIS.
Давайте посмотрим на код T-SQL:
USE [SomeDB]
GO
/****** Объект: Хранимая процедура [dbo].[sp_UpsertDimGuest] Дата скрипта: 11.09.2013 18:09:04 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[sp_UpsertDimGuest]
AS
BEGIN
--Удаление ограничений
--SCD 2 Историческое отслеживание атрибутов через Upsert
INSERT INTO [dbo].[DimGuest] (
[GuestContactSrgKey],
[SourceSystem],
[GuestIDAlternateKey],
[GuestAcct],
[GuestFirstName],
[GuestLastName],
[ETLLoadID],
[EffStartDt],
[EffEndDt],
[IsCurrent]
)
SELECT
[GuestContactSrgKey],
[SourceSystem],
[GuestIDAlternateKey],
[GuestAcct],
[GuestFirstName],
[GuestLastName],
[ETLLoadID],
GETDATE(),
'1/1/3000',
'true'
FROM (
MERGE GTDW.dbo.DimGuest AS [Target]
USING GTDW_Staging.dbo.DimGuestStagingFinal AS [Source]
ON Target.GuestIDAlternateKey = Source.GuestIDAlternateKey
AND Target.IsCurrent = 1
WHEN MATCHED AND (Target.[GuestFirstName] <> Source.[GuestFirstName] OR Target.[GuestLastName] <> Source.[GuestLastName])
THEN UPDATE
SET IsCurrent = 0,
EffEndDt = GETDATE()
WHEN NOT MATCHED BY TARGET
THEN INSERT (
[GuestContactSrgKey],
[SourceSystem],
[GuestIDAlternateKey],
[GuestAcct],
[GuestFirstName],
[GuestLastName],
[ETLLoadID],
[EffStartDt],
[EffEndDt],
[IsCurrent]
)
VALUES (
Source.[GuestContactSrgKey],
Source.[SourceSystem],
Source.[GuestIDAlternateKey],
Source.[GuestAcct],
Source.[GuestFirstName],
Source.[GuestLastName],
Source.[ETLLoadID],
GETDATE(),
'1/1/3000',
'true'
)
WHEN NOT MATCHED BY SOURCE AND Target.IsCurrent = 1
THEN UPDATE
SET IsCurrent = 0,
EffEndDt = GETDATE()
OUTPUT $action AS Action,
[Source].*
) AS MergeOutput
WHERE MergeOutput.Action = 'UPDATE'
AND GuestIDAlternateKey IS NOT NULL;
--Изменение атрибутов - история не записывается
UPDATE DimG
SET [GuestContactSrgKey] = DSF.[GuestContactSrgKey],
[GuestAcct] = DSF.[GuestAcct],
[ETLLoadID] = DSF.[ETLLoadID]
FROM DimGuest DimG
INNER JOIN [GTDW_Staging].[dbo].[DimGuestStagingFinal] DSF
ON DimG.GuestIDAlternateKey = DSF.GuestIDAlternateKey
AND DimG.IsCurrent = 1
--Опционально AND ( DimG.[GuestAcct] <> DSF.[GuestAcct] )
END
Этот код T-SQL демонстрирует процесс вставки и обновления медленно изменяющейся размерности типа 1 и 2 в SQL Server. Код эффективно обрабатывает историческое отслеживание атрибутов и изменение атрибутов.
Используя T-SQL вместо преобразования SCD в SSIS, вы можете заметно улучшить производительность. Это особенно полезно при работе с большими многомерными наборами данных.
Помните, что важно учитывать производительность при работе с SQL Server. Исследование альтернативных решений, таких как использование T-SQL, может помочь оптимизировать операции с базой данных.
Спасибо за прочтение этой статьи. Мы надеемся, что вы нашли ее информативной и полезной для улучшения производительности вашего SQL Server.