Таблица A (таблица для слияния) имеет 90000 строк. Таблица B (исходная таблица) содержит 3677 строк, я ожидал бы, что это слияние произойдет очень быстро, но это займет 30 минут (и продолжает подсчет). Как его можно оптимизировать, чтобы он работал быстрее?
ALTER PROCEDURE [dbo].[MergeAddressFromGraph]
-- no params
AS BEGIN - добавлен SET NOCOUNT ON, чтобы дополнительные наборы результатов - не мешали операторам SELECT. УСТАНОВИТЬ NOCOUNT ON;
-- first add fids to the MergeFundraiserNameAddress table instead of the temp table?
SELECT fundraiserid, ein
INTO #fids
FROM bb02_fundraiser
BEGIN TRAN;
MERGE BB02_FundraiserNameAddress AS T
USING
(
select f.fundraiserid,
n.addresslines,
n.town,
n.county,
n.postcode,
n.country,
n.fulladdress,
n.ein
from MergeFundraiserNameAddress n
join bb02_fundraiser f
on f.ein = n.ein and f.isdefault = 1
group by n.ein,
f.fundraiserid,
n.addresslines,
n.town,
n.county,
n.postcode,
n.country,
n.fulladdress
) AS S
ON (T.fundraiserid in( (select fundraiserid from #fids where ein = S.ein)) )
WHEN MATCHED
THEN UPDATE
SET
-- ADDRESS
T.addresslines = S.addresslines
,T.town = S.town
,T.county = S.county
,T.postcode = S.postcode
,T.country = S.country
,T.fulladdress = S.fulladdress
;
DELETE FROM MergeFundraiserNameAddress
COMMIT TRAN;
drop table #fids
КОНЕЦ
ОБНОВЛЕНИЕ. Мне удалось улучшить хранимую процедуру, которая теперь выполняется всего за несколько секунд. Я присоединился к таблице temp вместо таблицы bb02_fundraiser и удалил подзапрос в предложении ON.
Теперь я понимаю, что в слиянии нет необходимости, и я мог бы использовать вместо него Update, но сейчас меня это устраивает, потому что вскоре может потребоваться INSERT при рефакторинге.
ОБНОВЛЕННАЯ СОХРАНЕННАЯ ПРОЦЕДУРА НИЖЕ ЕСЛИ OBJECT_ID ('tempdb .. # fids') НЕ ЯВЛЯЕТСЯ NULL DROP TABLE #fids
SELECT fundraiserid, ein
INTO #fids
FROM bb02_fundraiser
where isdefault = 1
BEGIN TRAN;
MERGE BB02_FundraiserNameAddress AS T
USING
(
select f.fundraiserid,
n.addresslines,
n.town,
n.county,
n.postcode,
n.country,
n.fulladdress,
n.ein
from MergeFundraiserNameAddress n
join #fids f
on f.ein = n.ein
group by n.ein,
f.fundraiserid,
n.addresslines,
n.town,
n.county,
n.postcode,
n.country,
n.fulladdress
) AS S
ON (T.fundraiserid = S.fundraiserid)
WHEN MATCHED
THEN UPDATE
SET
-- ADDRESS
T.addresslines = S.addresslines
,T.town = S.town
,T.county = S.county
,T.postcode = S.postcode
,T.country = S.country
,T.fulladdress = S.fulladdress
;
DELETE FROM MergeFundraiserNameAddress
COMMIT TRAN;
IF OBJECT_ID('tempdb..#fids') IS NOT NULL
DROP TABLE #fids