2012-02-26 32 views
0

私はSQL Server 2008r2を使用しています。大規模な結合のためにデータを返す問題があります(たとえば、1つのクエリ(通常はtvfs、場合によってはテーブル)内に5つの内部+ 6の左結合を作成する必要があります)。この問題の回避策はありますか? 私はデータベースを壊さないといいですか? 膨大な数の結合を避けるためのベストプラクティスは何ですか?結合を高速化する方法

+1

ここでお手伝いする情報はありませんでした。真実を伝えて、あなたは*できないかもしれません*。しかし、少なくともあなたのスキーマと問題のクエリから始めることができます。 –

+0

複数行関数を使用している場合は、オプティマイザが関数内で照会されたテーブルの統計を使用できないため、重大なパフォーマンスの問題が発生する可能性があるため、ジョインでテーブル値関数を使用する場合は注意が必要です。http:// stackoverflow .com/questions/2554333/multi-statement-table-valued-function-vs-inline-table-valued-function –

+0

結合されている列のインデックスを作成しましたか?それはパフォーマンスにとって重要です。 – StilesCrisis

答えて

1

私は詳細をトラブルシューティングするためにSQLを確認する必要があると思いますが、ここでは非常に高い需要があり、結果を引っ張ったときに私はいくつかのことです:

  1. はあなたのツールを使用してください。見積もり実行計画を表示すると、ロジックに明らかな変化が生じる可能性があります。

  2. 「存在する」と「持っている」が大好きです。 HARD IOを必要としない創造的な方法で適格性を評価することによって、フォーカスとスコープを最小限に抑えることができます。これはサブクエリの方がジョインよりも真実ですが、必要なすべての外部ジョインに句を追加します。

  3. 最も重要なのは、IMOは、結果をステージングすることを恐れないでください。数十億件のトランザクションを何百万件ものレコードと処理する必要がある場合があり、ステージングによって何分もの時間がかかることがあります。トップ2または3テーブルのx%だけが必要な場合は、すべてのレコードを上から下へと結合するのはなぜですか?時にはそれはあまりにも多くのオーバーヘッドです。 最も簡単な結果セットをステージテーブル(または必要に応じてtemp)にプルダウンし、インデックスを作成してから次のチャンクを実行します。それは通常私に記憶の幸運を節約します。

  4. 可能であれば、CTEを使用してください。しかし、私の経験はある点を超えて劣化しています。補助テーブルのためのニースしかし、深刻なボリュームのためではない。

あなたの組み合わせで創造してください。ステージ1(テーブルa、b、cを読む)のこれらの存在する句を使用して、テーブルd、e、およびfにも存在するレコードだけを返します。

専門家によるSQLアドバイスの多くは、顧客、注文、人口統計タイプのスキーマに基づいたVLDBに基づいていません。

これらのストアドプロシージャはネイティブで実行されますか?ここで

+0

#3について - 結合は、データベースが実際に両方のテーブルのすべてのレコードと一致することを意味しません。実行計画によって異なります。何百万ものレコードを持つ2つのテーブルを結合するクエリは、10個程度の安価な論理読み込みが可能です。 –

+0

CTEを使用してもパフォーマンスには影響しません。 SQLサーバーは、クエリを処理するときにCTEを展開します。 –

+0

これは、すべての結合でインデックスが正確で、プライマリテーブルがどのように修飾されているか、条件に合わない基準やフィールド、外部結合などがあるかどうかによって異なります。すべてのベットはオフです話すとあなたはあなたの計画の慈悲を受けています...それは動的ではありません。 VLDBでは、一度に複数の「照会」を行うことは絶対に避けることをお勧めします。つまり、条件を満たすかどうかを確認するためにレコードを読まなければならない場合は、後続の「照会」がオーバーヘッドになります。 – user1222760

0

は、ステージングの(オーバー簡体字)良い例です:

は、あなたが(同様にそれについてのも面白いかもしれません)あなたの街のハイリスクの個人をすべて検索したいとしましょう。あなたは、州、市、姓、名、住所、姓、名、国、地域、住所で索引付けされたFBI dB(グローバル)で索引付けされた電話会社dB(全国)を持っています。過去の複数のアドレスのために、FBIのdBに各個人の複数のレコードがあるとしましょう。

共通要素の2つのdBを結合して、条件を満たすことができます。または、 電話番号からP1 を選択します。State = 'MyState'およびCity = 'MyCity'で、 が存在します( を選択します)。としてTheManからM1.Last = P1.LastおよびM1.First = P1 .FirstとM1.Risk> 80)

今私は、適格となる小さなレコードセットと、動作する小さな結果セットを持っています。そこから私は詳細を得ることができます。これはCTEの良い候補です。ロジックには十数個の穴を開けることができますが、その概念を説明しています。 M1を持ってきたら。完全な結合でリスク(インデックスされていないフィールド)を方程式に追加すると、特定の状況でSQL Serverを強制的に計画することになります。必ずしもそうではありませんが、あなたのロジックがより複雑になり、その後の索引付けされていない基準が作用するようになります。

関連する問題