2

次の形のクエリがあります。

A
UNION ALL
B
UNION ALL
C
UNION ALL
D

そして、A、B、C、および D を並列に呼び出して並列化し、それらを .Net で結合したいと考えています。これら 4 つのクエリはすべて、同じテーブル プール内のデータを読み取ります。

私が試した最初のステップは、SSMS の 1 つのタブで A を実行し、2 番目のタブで B を実行することです。A と B はそれぞれ約 1 分続くので、A を起動してからタブ B に移動して起動する時間があります。

しかし、CPU 使用率を見ると、13% (私は 8 コアの CPU @ Windows を使用しています) で停止します。これは、1 つのコアの 100% に相当します。

私の質問: - 「ロック」メカニズムにより、特定のテーブル セットに対して 2 つのクエリを並行して実行できますか? - 並列処理が可能である場合、2 つの SSMS タブで A と B を並列に実行しようとすると、それに気付くでしょうか、それともテストに欠陥がありますか? - 最終的にそのUNION ALLシリーズのパフォーマンスをどのように改善できるでしょうか?

4

1 に答える 1

3

並列処理をまったく強制しません。クエリのコストに基づいてエンジンが決定します。

SQL Server 2008 で並列クエリを実行する方法を参照してください。

この場合、データベースへの 4 つの接続を開き、4 つのクエリを実行して結果を追加できます。.net 並列処理を使用して、結果セットを結合します。

ただし、ほとんどの場合、データベースでは UNION の方が効率的で簡単です。

テーブルの同じプールからの読み取りは、並列処理を促進または防止しません。他のリーダーをブロックしない共有ロックが発行されます。また、データはキャッシュされるため、使用される IO が少なくなります。

各 UNION 句に時間がかかりすぎる場合は、不適切なインデックス、古い/統計がない、RAM が少なすぎる、不適切な構造のクエリ、tempdb の問題など、他の問題が発生する可能性があります。

tl;dr

クエリを修正します。それらを回避しないでください。

于 2012-10-31T09:42:40.477 に答える