web-dev-qa-db-ja.com

2つの異なるサーバー上の2つのSQL Serverデータベースをクエリする

2つのデータベースサーバー(DB-SERVER-1DB-SERVER-2)、各サーバーに単一のデータベース(DB1DB2)。どちらもSQL Serverデータベースです。

同じT-SQLコマンドまたは関数で両方のデータベースをクエリすることはできますか?おそらく、一方に接続してから結果セットを取得し、次にもう一方に接続して、その結果セットを取得することによって。次に、両方の結果セットを使用してユニオンを実行しますか?

これは.NETまたはJavaコード内から実行できますが、データベース側から厳密に実行したいのですが、可能ですか?

6
MacGyver

確かにこれを行うことができますが、お勧めしません。 DB-SERVER-1にリンクサーバーを作成し、DB-SERVER-2に接続できます。

(リンクサーバーの定義はDBAによって設定されます。これには、リモートサーバーへのログイン資格情報が含まれています。毎回自分でログイン資格情報を提供する場合は、openqueryまたはopenrowsetになります。コマンド。)

次に、DB-SERVER-1でこのクエリを実行していると仮定して、次のように4つの部分の命名規則を使用してクエリを記述できます。

select * 
  from DB1.dbo.YourTable a
  join [DB-SERVER-2].DB2.dbo.OtherTable b on b.ID = a.ID

クロスサーバー結合は、パフォーマンスの問題があることで有名です。私はそれを管理目的でのみ行い、大きな結果セットに対しては絶対に行いません。

4
datagod

datagod's answer に賛成しました。なぜなら、技術的には、それを達成する方法は正しいからです。しかし、私は反対の勧告をします。つまり、私はしますリンクサーバーの使用をお勧めします。これは、設計について質問しているように見えるためです 分散パーティションビューの手法を使用するフェデレーションサーバー

設計時に実装する多くのルールと標準があります。複数のサーバーの結果セットを接続するために、リンクサーバーを混在させてはならないのは事実です。適切な理由でオブジェクトとテクニックを使用する理由があります。

適切な例として、複数のサーバーを必要とするVLDBシナリオ内でフェデレーテッドサーバー/分散ビューを正常に使用しました。それがこのテクニックのすべてです。これは高度な機能であるため、事前に注意する必要がありますが、フェデレーションサーバー/分散ビューの目的でリンクサーバーを適切に使用するために必要なことを正確に解決します。

1台のサーバーを現在のデータ出荷年にし、次の2〜7年をアーカイブ用の追加サーバーにしたいと考えました。データ量が多いため複数のサーバーを使用する必要があり、リクエストの年に応じて、クエリ結果セットごとに独立したサーバーリソースを利用しました。

エンジンの分散ビューのテクノロジーは、どのサーバーにアクセスして結果を取得するかを認識していました。チェック制約のため。高いですか:はい。必要に応じて機能しますか:はい。リンクサーバーは安定していますか?はい。ただし、障害点を考慮する必要がありました。したがって、通常は同様の要件で計画することができないものではありません。

分散クエリが適切に構築され、パフォーマンスと障害点についてテストされていることを確認してください。

要約すると、可能です、はい。できる、はい;フェデレーションサーバーと分散クエリに必要であるため、推奨。テクニックの完全な理解とテストなしではなく、強くお勧めします。

4
SnapJag