5

私はつい最近、SQL Server でビューのインデックスを作成できるようになったことに気付きました ( http://technet.microsoft.com/en-us/library/cc917715.aspxを参照)。実行パスがキャッシュされているストアド プロシージャ内の同じクエリと比較して、インデックス付きビューに対するクエリのパフォーマンスが向上する時期を把握しようとしています。

たとえば、次のようにします。

SELECT colA, colB, sum(colC), sum(colD), colE
FROM myTable
WHERE colFDate < '9/30/2011'
GROUP BY colA, colB, colE

日付は実行されるたびに異なるため、これがビューである場合は、ビューに含めず、WHEREビューに対する選択の一部として使用します。ストアド プロシージャの場合は、日付がパラメーターになります。テーブルには約 300,000 行あることに注意してください。それらの 200,000 は、日付の where 句を満たします。group by の後に 10,000 が返されます。

これがインデックス付きビューである場合、実行パスをキャッシュする機会があったストアド プロシージャよりも優れたパフォーマンスが期待できますか? それとも、プロセスはより高速になりますか?それとも、その差は無視できるものでしょうか? 「両方を試してみてください」と言うことができることは知っていますが、結果に誤った偏りを与えて誤った結論に導く可能性のある要因が多すぎるため、その背後にある理論と予想される結果をもっと知りたいと思います. .

ありがとう!

4

1 に答える 1

8

インデックス付きビューは、通常のテーブルのように見なすことができます。これは、具体された行のコレクションです。

したがって、問題は、「通常の」クエリがストアド プロシージャよりも高速かどうかということになります。

SQL Server がクエリ (ストアド プロシージャ コールまたはアドホック SQL ステートメント) を実行するためにどのような手順を実行するかを見ると、(おおよそ) 次の手順が見つかります。

  1. クエリを構文的にチェックする
  2. 問題がない場合 - プラン キャッシュをチェックして、そのクエリの実行プランが既にあるかどうかを確認します。
  3. 実行計画がある場合 - その計画が (再) 使用され、クエリが実行されます
  4. 計画がまだない場合は、実行計画が決定されます
  5. そのプランは、後で再利用するためにプラン キャッシュに保存されます。
  6. クエリが実行されます

要点: アドホック SQL とストアド プロシージャはまったく同じです。

アドホック SQL クエリがパラメーターを適切に使用している場合 (SQL インジェクション攻撃を防ぐために、いずれにせよそうすべきであるため)、そのパフォーマンス特性は、ストアド プロシージャの実行と変わらず、間違いなく悪くもありません。

ストアド プロシージャには他にも利点があります (たとえば、ユーザーにテーブルへの直接アクセスを許可する必要はありません) が、パフォーマンスに関しては、適切にパラメータ化されたアドホック SQL クエリを使用すると、ストアド プロシージャを使用するのと同じくらい効率的です。

パラメーター化されていないクエリよりもストアド プロシージャを使用する方が、次の 2 つの主な理由で優れています。

  • パラメーター化されていない各クエリは、 SQL Server に対する新しい別のクエリであるため、クエリごとに実行プランを決定するすべての手順を実行する必要があります (実行プランを保存するため、時間を浪費し、プラン キャッシュ スペースも浪費します)。その特定のクエリはおそらく再実行されないため、プランキャッシュに入れても最終的にはあまり役に立ちません)

  • パラメーター化されていないクエリは、SQL インジェクション攻撃のリスクにさらされているため、絶対に避ける必要があります

もちろん、インデックス付きビューGROUP BYの場合、(句を使用して) 行数を大幅に減らすことができます。もちろん、そのインデックス付きビューは、データセット全体に対してストアド プロシージャを実行する場合よりも大幅に高速になります。しかし、これはアプローチが異なるためではありません。単に規模の問題です。どの方法でクエリを実行しても、数十または数百行に対してクエリを実行する方が、200'000 行またはそれ以上の行に対してクエリを実行するよりも高速になります。

于 2013-12-24T15:26:26.743 に答える