Management Studioで、2つのリンクサーバー間でクエリを実行/結合しようとしています。これは、リンクされたdbサーバーを使用した正しい構文ですか?
select foo.id
from databaseserver1.db1.table1 foo,
databaseserver2.db1.table1 bar
where foo.name=bar.name
基本的に、dbサーバー名をdb.tableの前に付けるだけですか?
形式はおそらく次のとおりです。
<server>.<database>.<schema>.<table>
例:DatabaseServer1.db1.dbo.table1
Update:これは古い質問であり、私が持っている答えは正しいことを知っています。ただし、これにつまずいた人は、いくつかのことを知っているはずです。
つまり、結合状況でリンクサーバーに対してクエリを実行すると、リンクサーバーからの全体テーブルがにダウンロードされる可能性があります結合操作を行うためにクエリが実行されるサーバー。 OPの場合、table1
のDB1
とtable1
のDB2
の両方が、おそらくDB3
という名前のクエリを実行するサーバーに転送されます。
大きなテーブルがある場合、これはmayの結果、実行に時間がかかる操作になります。結局のところ、メモリやディスクの転送速度よりも桁違いに遅いネットワークトラフィックの速度に制約されています。
可能であれば、ローカルテーブルに参加せずにリモートサーバーに対して単一のクエリを実行し、必要なデータを一時テーブルにプルします。次に、そのクエリを実行します。
それが不可能な場合は、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)を参照の一部として指定する必要があります。また、新しい(ANSI-92)結合スタイルを使用することをお勧めします。
select foo.id
from databaseserver1.db1.dbo.table1 foo
inner join databaseserver2.db1.dbo.table1 bar
on foo.name = bar.name
これらの他の回答で問題がある場合は、 OPENQUERY
を試してください
例:
SELECT * FROM OPENQUERY([LinkedServer], 'select * from [DBName].[schema].[tablename]')
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')
それが価値があるものについては、私は次の構文が最適に機能することを発見しました:
SELECT * FROM [LINKED_SERVER] ... [TABLE]
データベース名を使用して、他のユーザーの推奨事項を得ることができませんでした。また、このデータソースにはスキーマがありません。
次のクエリが最適です。
このクエリを試してください:
SELECT * FROM OPENQUERY([LINKED_SERVER_NAME], 'SELECT * FROM [DATABASE_NAME].[SCHEMA].[TABLE_NAME]')
MySQLをMS SQLにリンクすると非常に役立ちます