Management Studio에있는 동안 두 개의 연결된 서버간에 쿼리를 실행 / 조인하려고합니다. 연결된 db 서버를 사용하는 올바른 구문입니까?
select foo.id
from databaseserver1.db1.table1 foo,
databaseserver2.db1.table1 bar
where foo.name=bar.name
기본적으로 db.table 앞에 db 서버 이름을 입력합니까?
답변:
형식은 다음과 같아야합니다.
<server>.<database>.<schema>.<table>
예 : DatabaseServer1.db1.dbo.table1
업데이트 : 나는 이것이 오래된 질문이고 내가 가진 대답이 정확하다는 것을 알고 있습니다. 그러나 나는 이것에 걸려 넘어지는 다른 사람은 몇 가지를 알아야한다고 생각합니다.
즉, 조인 상황에서 연결된 서버에 대해 쿼리 할 때 연결된 서버의 ENTIRE 테이블 이 조인 작업을 수행하기 위해 쿼리가 실행되는 서버로 다운로드 될 가능성 이 높습니다 . OP의 경우, table1
from DB1
과 table1
from DB2
은 모두 쿼리를 실행하는 서버 (아마도 DB3
.
당신이 큰 테이블이있는 경우,이 있습니다 실행하는 데 시간이 오래 걸리는 작업이 발생할. 결국 그것은 이제 메모리 또는 심지어 디스크 전송 속도보다 훨씬 느린 네트워크 트래픽 속도에 의해 제한됩니다.
가능하면 로컬 테이블에 조인하지 않고 원격 서버에 대해 단일 쿼리를 수행하여 필요한 데이터를 임시 테이블로 가져옵니다. 그런 다음 그것을 쿼리하십시오.
이것이 가능하지 않다면 SQL 서버가 전체 테이블을 로컬로로드해야하는 다양한 사항을 살펴 봐야합니다. 예를 들어 GETDATE()
또는 특정 조인을 사용 합니다. 다른 성능 킬러에는 적절한 권리를 제공하지 않는 것이 포함됩니다.
자세한 내용은 http://thomaslarock.com/2013/05/top-3-performance-killers-for-linked-server-queries/ 를 참조하십시오 .
SELECT * FROM OPENQUERY([SERVER_NAME], 'SELECT * FROM DATABASE_NAME..TABLENAME')
이것은 당신을 도울 수 있습니다.
여전히 문제가있는 경우 <server>.<database>.<schema>.<table>
서버 이름을 []
dbo.databaseserver1.db1.dbo.table1
이러한 다른 답변에 문제가있는 사람들을 위해 , 시도OPENQUERY
예:
SELECT * FROM OPENQUERY([LinkedServer], 'select * from [DBName].[schema].[tablename]')
참조의 일부로 스키마 / 소유자 (기본적으로 dbo)를 지정해야합니다. 또한 최신 (ANSI-92) 조인 스타일을 사용하는 것이 좋습니다.
select foo.id
from databaseserver1.db1.dbo.table1 foo
inner join databaseserver2.db1.dbo.table1 bar
on foo.name = bar.name
select * from [Server].[database].[schema].[tablename]
이것이 올바른 전화 방법입니다. 쿼리를 실행하기 전에 서버가 연결되어 있는지 확인하십시오!
연결된 서버 호출을 확인하려면 :
EXEC sys.sp_linkedservers
select name from drsql01.test.dbo.employee
연결된 서버에 대한 쿼리 실행 방법을 이해하는 데 도움이 되었기를 바랍니다.
연결된 서버의 경우 SQL 서버의 임시 데이터베이스를 많이 사용하므로 일반적으로 직접 쿼리를 사용하지 마십시오. 첫 번째 단계에서 데이터는 임시 DB로 검색되고 필터링이 발생합니다. 이것에 대한 많은 스레드가 있습니다. SQL을 소스 연결된 서버로 전달한 다음 필터링 된 결과를 반환하므로 open OPENQUERY를 사용하는 것이 좋습니다.
SELECT *
FROM OPENQUERY(Linked_Server_Name , 'select * from TableName where ID = 500')