0

Stack Overflow と Google で検索を行ってきましたが、私の質問に対する答えが見つかりませんでした。

「ゼロから」のデータ ウェアハウス プロジェクトを行ってから 1 分が経過したので、過去の知識の一部を払いのけつつ、データ ロード シナリオの 1 つに対する解決策を検討中です。

もちろん、多くのディメンションが結合されたファクト テーブル (factOrderLines) を作成しています。factOrderLines にリンクしたいディメンションの 1 つは、dimItem です。問題は、アイテムのベンダーとベンダーの部品番号、製造元と製造元の部品番号、または ManagedItems (MngItemID) と呼ばれるアイテムのサブセットからの識別子のいずれかに基づいてアイテムが一意であることです。

ソース例:

ベンダー VendorPartNo メーカー ManufacturerPartNo MngItemID
100 3456 NULL NULL 67
100 3254 03 1234 23
NULL NULL 03 1235 24
NULL NULL 15 5120 NULL

問題は、ソース テーブルから dimItem テーブルに結合して、factOrderLines テーブルにデータを入力するときに、3 つのルックアップ シナリオがあることです。これにより、数値が膨らみ、パフォーマンスが低下しています。

LEFT OUTER JOIN dimItem AS i ON  
    (i.Vendor = src.Vendor AND i.VendorPartNo = src.VndrItemID) OR  
    (i.Manufacturer = src.Manufacturer AND
    (i.ManufacturerPartNo = src.MfgItemID) OR (i.MngItemID = src.MngItemID)

このシナリオに対して、私が実装し始めたものよりも効率的で優れたアプローチはありますか?

編集: 完全な INSERT クエリ (理解を深めるため)

INSERT INTO fctOrderLine
           (PurchaseOrderKey
           ,DateKey
           ,PurchaseOrderLineNo
           ,VendorKey
           ,ManufacturerKey
           ,ItemKey
           ,UnitPrice
           ,Qty
           ,UnitOfMeasure
           ,LineTotal)
SELECT      PurchaseOrderKey    =   po.PurchaseOrderKey
           ,DateKey             =   ISNULL(c.DateKey, 19000101)
           ,PurchaseOrderLineNo =   ISNULL(p.POLineNbr, -1)
           ,VendorKey           =   ISNULL(v.VendorKey, -1)
           ,ManufacturerKey     =   ISNULL(m.ManufacturerKey, -1)
           ,ItemKey             =   ISNULL(i.ItemKey, -1)
           ,UnitPrice           =   ISNULL(p.UnitPrice, -1.00)
           ,Qty                 =   ISNULL(p.POQty, -1.00)
           ,UnitOfMeasure       =   ISNULL(p.ANSI_UOM, N'UNKNOWN')
           ,LineTotal           =   ISNULL(p.LineTotalCost, -1)
FROM        stgOrders AS p
INNER JOIN      dimPurchaseOrder AS po ON po.OrderNo = p.PONumber   
LEFT OUTER JOIN dimCalendar AS c ON c.Date = (CASE WHEN p.DT_PO IS NULL OR ISDATE(REPLACE(p.DT_PO, '''', '')) = 0 THEN CAST('19000101' AS DATETIME) ELSE REPLACE(p.DT_PO, '''', '') END)
LEFT OUTER JOIN dimVendor AS v ON v.VendorID = p.VendorID
LEFT OUTER JOIN dimManufacturer AS m ON m.ManufacturerID = p.MfgID
LEFT OUTER JOIN dimItem AS i ON (i.VendorKey = v.VendorKey AND i.VendorPartNo = p.VndrItemID) OR (i.ManufacturerKey = m.ManufacturerKey AND i.ManufacturerPartNo = p.MfgItemID) OR (i.MngItemID = p.MngItemID)
4

0 に答える 0