Published on

August 26, 2013

Улучшение производительности с помощью T-SQL в SQL Server

Когда речь идет о обработке больших многомерных наборов данных в 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.

Click to rate this post!
[Total: 0 Average: 0]

Let's work together

Send us a message or book free introductory meeting with us using button below.