1

基本的にSQL 2008で複数のテーブルを結合して、検索の簡略版を投稿しています

select * from t1 
inner join t2 on t1.id = t2.id
inner join t3 on t2.id = t3.id
inner join t4 on t3.id = t4.id 
inner join t5 on t4.id = t5.id

このクエリの一部をオブジェクトとして保存しておく方法があることを知りたいです。結果ではなく、クエリ ロジックです。

再利用したいとしましょう

inner join t3 on t2.id = t3.id 
inner join t4 on t3.id = t4.id
inner join t5 on t4.id = t5.id

さまざまなクエリで、次のようなもの

select * from t1
inner join t2 on t1.id = t2.id
inner join t_stored on t_stored.id = t3.id

t_stored をビュー、関数、またはストアド プロシージャ (どちらもパラメーターが必要) として定義することを考えていましたが、それがパフォーマンスにどのように影響するかはよくわかりません。最終的にどれほど複雑になっても、すべてをメインクエリに保持する方がよいでしょうか。

4

2 に答える 2

1

ご存じのように、MS SQL のパフォーマンスは、クエリ実行プランがどのように生成されるか、および実行コンテキスト スレッドのヒット率を上げるためにどのようにキャッシュされるかに純粋に基づいています。ビューを作成して結合を再利用するオプションは良いオプションですが、キーが一致するまで利点はありません。

再利用の問題はまだ残っています。ビューが最適なオプションですが、必要がなければ結果セットでパフォーマンスが大幅に変化し、再利用クエリによって適切なクラスター化インデックスがヒットします。

私の個人的な経験では、これらすべてのテーブルを必要に応じてクエリに結合することで、最高のパフォーマンスが得られることが示唆されています。JOIN を使用するよりも EXISTS ステートメントを使用するようにクエリを変更するだけで、クエリをより詳細に制御できるため (結果セットでこれらのテーブル フィールドが予期されない場合)。

このhttp://msdn.microsoft.com/en-us/library/ee343986(v=sql.100).aspxを見て、計画がキャッシュされる方法を確認してください

于 2013-02-23T10:48:32.643 に答える
0

あなたの質問に対する決定的な答えはないと思います。データベースが異なれば、最適化も異なります。私の直感は、あなたの例が(うまくいけば)適切にインデックス付けされたFK制約に参加することを表していると仮定すると、違いを生むべきではないか、実質的なものではないということです。
頻繁に使用されるデータのビューを作成すると、DBMSがビューをより適切にキャッシュできるようになるため、パフォーマンスがさらに向上する可能性があります。
ただし、実際に試して両方のオプションの実行プランを確認しないと、確信が持てません。おそらく、これを実行する必要があります。

于 2013-02-23T10:23:28.877 に答える