원격지 서버의 테이블에 대한 갱신 작업을 위해서 다음과 같이 Linked Server의 테이블을 JOIN 하여 UPDATE 하였습니다.
SET XACT_ABORT ON;
DECLARE @ano VARCHAR(30) = 'S201910250010'
BEGIN DISTRIBUTED TRAN
UPDATE Trgt
SET
AcptYn = 'N',
AcptEmpCode = '',
AcptDeptCode = '',
AcptDateTime = NULL
FROM
RemoteServer.RemoteDB.dbo.FIAccSlipDisappMaster AS Trgt
JOIN RemoteServer.RemoteDB.dbo.FIAccSlipAggreationNo AS A
ON a.SlipNo = Trgt.SlipNo
AND A.AggregationNo = @ano
SET XACT_ABORT OFF;
COMMIT
그러나 동작은 잘 되지만 성능이 너무 나오지 않았습니다.
실행계획을 보니 원격지 테이블을 모두 읽어와서 JOIN 시키다 보니 실제 UPDATE 시킬 행은 1개 인데 수십만 건의 데이터를 읽고 있었습니다.
그래서 OpenQuery로 변경 하려고 했으나, 문제는 OpenQuery의 SQL문이 순수한 문자열만 가능 하도록 되어 있어서 파라미터(변수)를 사용할 수가 없었습니다.
SET XACT_ABORT ON;
DECLARE @ano VARCHAR(30) = 'S201910250010'
BEGIN DISTRIBUTED TRAN
UPDATE x
SET
AcptYn = ''N'',
AcptEmpCode = '''',
AcptDeptCode = '''',
AcptDateTime = NULL
FROM
OpenQuery (RemoteServer,
'
SELECT
Trgt.*
FROM RemoteDB.dbo.FIAccSlipAggreationNo AS A
JOIN RemoteDB.dbo.FIAccSlipDisappMaster AS Trgt
ON a.SlipNo = Trgt.SlipNo
WHERE
A.AggregationNo = ''' + @ano + '''
'
) x
SET XACT_ABORT OFF;
COMMIT
그래서 최종적으로 OpenQuery를 포함한 전체 쿼리 문장을 문자열 변수에 넣고 EXEC()로 처리 하였습니다.
SET XACT_ABORT ON;
DECLARE @ano VARCHAR(30) = 'S201910250010'
DECLARE @sql varchar(max)
BEGIN DISTRIBUTED TRAN
set @sql =
'
UPDATE x
SET
AcptYn = ''N'',
AcptEmpCode = '''',
AcptDeptCode = '''',
AcptDateTime = NULL
FROM
OpenQuery (RemoteServer,
''
SELECT
Trgt.*
FROM RemoteDB.dbo.FIAccSlipAggreationNo AS A
JOIN RemoteDB.dbo.FIAccSlipDisappMaster AS Trgt
ON a.SlipNo = Trgt.SlipNo
WHERE
A.AggregationNo = ''''' + @ano + '''''
''
) x
'
EXEC(@sql)
SET XACT_ABORT OFF;
COMMIT
성능도 좋고, 파라미터(변수)도 처리할 수 있어서 만족할 만한 결과가 나왔습니다. 원격지 서버에 대한 갱신작업이 필요하실 때 참고 하시기 바랍니다.