2

SQL Serverに、ERPシステムからのデータウェアハウス抽出を「ステージング」するテーブルがあります。

このステージングテーブル(テーブル名:DBO.DWUSD_LIVE)から、ディメンションを作成し、ファクトデータをロードします。

DIMENSIONテーブルの例は「SHIPTO」と呼ばれ、このディメンションには次の列があります。

"shipto_id
"shipto"
"salpha"
"ssalpha"
"shipto address"
"shipto name"
"shipto city"

現在、上記の列全体でSELECT DISTINCTを実行して「一意の」データを取得するSSISパッケージがあり、SSISパッケージを介して「shipto_id」代理キーを割り当てています。

現在のTSQLクエリの例は次のとおりです。

SELECT DISTINCT
"shipto", "salpha", "ssalpha", "shipto address", "shipto name", "shipto city"
FROM DBO.DWUSD_LIVE

これはうまく機能しますが、「高速」ではありません。一部のディメンションには10列があり、それらに対して個別の選択を行うことは理想的ではありません。

このディメンションでは、「ビジネスキー」列は「SHIPTO」、「SALPHA」、および「SSALPHA」です。

だから私がそうするなら:

SELECT DISTINCT
"shipto", "salpha", "ssalpha"
FROM DBO.DWUSD_LIVE

次と同じ結果が得られます。

SELECT DISTINCT
"shipto", "salpha", "ssalpha", "shipto address", "shipto name", "shipto city"
FROM DBO.DWUSD_LIVE

このTSQLクエリを実行するためのより良い方法はありますか?すべての列が必要ですが、ビジネスキー列にはDISTINCTのみが必要です。

あなたの助けに感謝します。

以下は、私のプロジェクトがSSISでどのように設定されているかの画像です。ディメンションは、SCD1です。

4

1 に答える 1

1

これを 2 つの操作に分割することから始めます。代理キーの生成とディメンション テーブルへの入力です。最初のステップはDISTINCT3 列のみで、2 番目のステップは になりますJOIN。両方の操作で使用される列にインデックスを付けると、改善が得られる場合があります。

DISTINCT次のように、を組み合わせて、NOT EXISTS既にマップされている行の処理を避けることができます。

insert into dbo.KeyMappingTable (shipto, salpha, ssalpha)
select distinct shipto, salpha, ssalpha
from dbo.Source
where not exists (
    select *
    from dbo.KeyMappingTable
    where shipto = dbo.Source.shipto and salpha = dbo.Source.salpha and ssalpha = dbo.Source.ssalpha
 )

次に、マッピングがあるので、これを行うことができます:

insert into dbo.DimShipTo (shipto_id, shipto /*, etc. */)
select
    m.shipto_id,
    s.shipto -- etc.
from
    dbo.KeyMappingTable m
    join dbo.Source s
    on m.shipto = s.shipto and m.salpha = s.salpha and m.ssalpha = s.ssalpha
where
    not exists (
        select *
        from dbo.DimShipTo
        where shipto_id = m.shipto_id
    )

も参照してMERGEください。これは、タイプ 1 ディメンションを使用していて、住所やその他の属性が変更されたときに更新したい場合に便利です (一般的に便利なコマンドです)。ただし、SQL Server 2008 からのみ利用できます。使用している SQL Server のバージョンまたはエディションについては言及していません。

于 2012-10-01T16:45:35.583 に答える