У меня есть сложный запрос, который я хочу использовать в качестве источника слияния в таблицу. Это будет выполнено через миллионы строк. В настоящее время я пытаюсь применить ограничения к данным, вставив их в таблицу temp перед слиянием.SubQuery vs TempTable перед слиянием
операции являются:
- Фильтр из повторяющихся данных.
- Соедините несколько таблиц, чтобы получить дополнительные данные
- Вставьте в таблицу темп.
Вот запрос.
-- Get all Orders that aren't in the system
WITH Orders AS
(
SELECT *
FROM [Staging].Orders o
WHERE NOT EXISTS
(
SELECT 1
FROM Maps.VendorBOrders vbo
JOIN OrderFact of
ON of.Id = vbo.OrderFactId
AND InternalOrderId = o.InternalOrderId
AND of.DataSetId = o.DataSetId
AND of.IsDelete = 0
)
)
INSERT INTO #VendorBOrders
(
CustomerId
,OrderId
,OrderTypeId
,TypeCode
,LineNumber
,FromDate
,ThruDate
,LineFromDate
,LineThruDate
,PlaceOfService
,RevenueCode
,BillingProviderId
,Cost
,AdjustmentTypeCode
,PaymentDenialCode
,EffectiveDate
,IDRLoadDate
,RelatedOrderId
,DataSetId
)
SELECT
vc.CustomerId
,OrderId
,OrderTypeId
,TypeCode
,LineNumber
,FromDate
,ThruDate
,LineFromDate
,LineThruDate
,PlaceOfService
,RevenueCode
,bp.Id
,Cost
,AdjustmentTypeCode
,PaymentDenialCode
,EffectiveDate
,IDRLoadDate
,ro.Id
,o.DataSetId
FROM
Orders o
-- Join related orders to match orders sharing same instance
JOIN Maps.VendorBRelatedOrder ro
ON ro.OrderControlNumber = o.OrderControlNumber
AND ro.EquitableCustomerId = o.EquitableCustomerId
AND ro.DataSetId = o.DataSetId
JOIN BillingProvider bp
ON bp.ProviderNPI = o.ProviderNPI
-- Join on customers and fail if the customer doesn't exist
LEFT OUTER JOIN [Maps].VendorBCustomer vc
ON vc.ExtenalCustomerId = o.ExtenalCustomerId
AND vc.VendorId = o.VendorId;
Мне интересно, есть ли что-нибудь, что я могу сделать, чтобы оптимизировать его для времени. Я попытался использовать Tuner DB Engine, но этот запрос занимает 100 раз больше времени процессора, чем другие запросы, которые я запускаю. Есть ли что-нибудь еще, что я могу изучить, или может ли запрос не быть улучшен дальше?
попробовать используя вложенный «CTE» для вычисления окончательных данных, которые необходимо вставить, и, наконец, сохранить простой «INSERT» –