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
更新:私はこれが古い質問であり、私が持っている答えが正しいことを知っています。しかし、これに出くわした他の誰もがいくつかのことを知っているはずだと思います。
つまり、結合状況でリンクサーバーに対してクエリを実行すると、結合操作を実行するために、リンクサーバーの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')
価値があることについては、次の構文が最適に機能することがわかりました。
SELECT * FROM [LINKED_SERVER] ... [TABLE]
データベース名を使用して、他の人の推奨を機能させることができませんでした。さらに、このデータソースにはスキーマがありません。
PostgreSQL:
クエリからDBNameを省略する必要があります。
SELECT * FROM OPENQUERY([LinkedServer], 'select * from schema."tablename"')