表A(表合併成)擁有九萬行 表B(源表)有3,677行 我希望這個合併非常快,但它採取30分鐘(和計數)。 如何優化運行速度?SQL合併 - 我該如何優化?
ALTER PROCEDURE [dbo].[MergeAddressFromGraph]
-- no params
AS BEGIN - SET NOCOUNT ON加入是爲了避免額外的結果集 - 用SELECT語句的干擾。 SET 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
END
UPDATE 我能夠改善現在運行在短短的幾秒鐘的存儲過程。我加入了臨時表而不是bb02_fundraiser表,並刪除了ON子句中的子查詢。
我現在認識到合併是沒有必要,我可以用一個更新替代,但我現在很確定這個正確的,因爲可能很快在重構需要一個INSERT。
更新的存儲過程下 IF OBJECT_ID( 'tempdb中..#FIDS')IS NOT 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
請發佈執行計劃。你是對的 - 我們可以很快就做到這一點。 – usr
你爲什麼要使用合併,如果唯一可能的結果是更新? ([這是爲什麼你可能想要謹慎使用MERGE](http://www.mssqltips.com/sqlservertip/3074/use-caution-with-sql-servers-merge-statement/)。) –
此外,也許它正在被阻止。當它運行30分鐘時,sys.dm_exec_requests會說什麼?此DMV可以向您顯示blocking_session_id以及嘗試運行MERGE的session_id的等待類型。 –