2017-12-13 7 views
1

SQL Server 2012 데이터베이스에는 레코드를 가져 와서 업데이트해야하는 두 번째 SQL Server 데이터베이스에 연결된 서버 참조가 있습니다.SQL Server에 연결된 서버 업데이트 - 끔찍한 성능

UPDATE 
    Linked_Tbl 
SET 
    Transferred = 1 
FROM 
    MyLinkedServer.dbo.MyTable Linked_Tbl 
JOIN 
    MyTable Local_Tbl ON Local_Tbl.LinkedId = Linked_Tbl.Id 
JOIN 
    MyOtherTable Local_Tbl2 ON Local_Tbl.LocalId = Local_Tbl2.LocalId 

나는 여전히 실행되면서 실행 시간 후 정지했다 :

은 내가 실행하려고 다음 업데이트 문이있다.

저는 온라인을 읽고 최선의 해결책은 링크 된 서버 자체에 저장 프로 시저를 작성하여 와이어를 통해 실행하는 대신 업데이트 명령문을 실행하는 것입니다. 내가 가진

문제는 다음과 같습니다

  1. 내가 다른 서버에있는 모든 절차를 만들 수있는 능력이 없습니다.
  2. 그 프로 시저를 만들 수 있더라도 업데이트를 위해 모든 ID를 저장 프로 시저에 전달해야하며 수천 개의 ID를 사용하여 효율적으로 수행하는 방법을 알지 못합니다. (분명히 더 작습니다. 문제의, 내가 처음부터 그 절차를 만들 수 없기 때문에).

사람들이 다른 서버를 변경할 수있는 권한이없는 경우가 많으므로 사람들이 해결할 수있는 다른 솔루션이 있기를 바랍니다.

어떤 아이디어 ??

+0

이 솔루션은보다 오히려 로컬 서버의 소스를 조회 대상 서버에 프로 시저를 만들 확실히 로컬에서 로컬로 업데이트를 보내는 절차. 이 작업을 수행 할 수 없다면 RBAR 업데이트를 링크 된 서버로 가져올 것입니다 (이 문제를 해결할 방법이 없다고 생각합니다). 해결 방법이 있다고 생각하지 마십시오. # 2 답을 얻으려면 원격 업데이트의 일부로 각 행을 개별적으로 보내는 것보다 연결된 서버에서 ID를 선택하는 것이 훨씬 효율적입니다. –

+2

원격 서버에서 저장 프로 시저를 만들 필요는 없습니다. 업데이트가 들어있는 동적 인 SQL을 사용하면,'EXEC AT'로 코드를 실행하면 원격 서버가 모든 것을 처리합니다. 다음을 참조하십시오. https://social.msdn.microsoft.com/Forums/sqlserver/en-US/ec527f63-d454-4b8a-81e9-23a2ff54c1ca/execute-at-with-dynamic-linked-server-name?forum = transactsql – Alejandro

+0

@Alejandro, 고마워, 이거 진짜 유일한 방법 같아. 난 거대 팬이 아니지만이 상황에서 가장 좋은 대안 인 것 같아. –

답변

-1

나는, 당신에게 시도를 더 높은 성능을 제공 할 수 있는지 여부, 확실하지 않다 :

UPDATE 
    Linked_Tbl 
    SET 
    Transferred = 1 
    FROM OPENDATASOURCE([MyLinkedServer],'select Id, LocalId,Transferred from remotedb.dbo.MyTable') AS Linked_Tbl 
    JOIN MyTable Local_Tbl 
    ON Local_Tbl.LinkedId = Linked_Tbl.Id 
    JOIN MyOtherTable Local_Tbl2 
    ON Local_Tbl.LocalId = Local_Tbl2.LocalId