Заполните таблицу фактов с помощью поиска бизнес-ключа в нескольких столбцах

Я занимался поиском в Stack Overflow, а также в Google, и не нашел ответа на свой вопрос, так что мы здесь:

Прошло уже не так много времени с тех пор, как я реализовал проект хранилища данных "с нуля", поэтому я собираю некоторые из моих прошлых знаний, но не могу найти решение для одного из моих сценариев загрузки данных.

Я создаю таблицу фактов (factOrderLines), к которой, конечно, присоединяются многие измерения. Одним из измерений, которое я хотел бы связать с factOrderLines, является dimItem. Проблема в том, что Элемент уникален на основе либо номера элемента поставщика и поставщика, номера компонента производителя и производителя, либо идентификатора из подмножества элементов, называемого ManagedItems (MngItemID).

источник ex:

Vendor VendorPartNo Производитель Производитель PartNo MngItemID 
100      3456          NULL           NULL               67
100      3254          03             1234               23
NULL     NULL          03             1235               24
NULL     NULL          15             5120               NULL

Проблема в том, что когда я выполняю соединение с таблицей dimItem из исходной таблицы, чтобы заполнить таблицу factOrderLines, у меня есть три сценария поиска. Это приводит к тому, что цифры увеличиваются, а производительность ужасна.

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)

0 ответов

Другие вопросы по тегам