ストアドプロシージャと生のクエリの効率


23

私はこの議論の両側で多くを読みました:生のクエリではなくストアドプロシージャのみを使用することで得られるパフォーマンスの大幅な向上はありますか?私は特にSQL Serverに興味がありますが、ありとあらゆるデータベースに興味があります。


2
読んだものへのリンクを投稿できますか?ここでパフォーマンスが問題になるとは思わない(少なくとも直接ではない)
ジャックダグラス

1
@ JackDouglas、mrdennyの答えをチェックしてください。パフォーマンスは、この質問/回答の大部分です。
トーマスストリンガー

回答:


31

SQL Server 2008以降ではそれほどではありませんが、まだ存在しています。実行計画キャッシュとSQL Serverは、送信されるクエリを自動パラメーター化できます。ストアドプロシージャ(動的SQLが含まれていない)を使用する場合、クエリは既にパラメーター化されているため、SQL Serverはプランが既にプランキャッシュに格納されているため、実行時に各クエリのプランを生成する必要があります。

また、ストアドプロシージャを使用するとなくなるセキュリティの問題(動的SQL、最小権限など)を忘れないでください。

アプリがベーステーブルに対して動的SQLを使用してテーブル内のデータを選択、挿入、更新、および削除する場合、アプリケーションはこれらすべてのオブジェクトに対する権限を直接持っている必要があります。そのため、誰かがSQLインジェクションを使用してサーバーにアクセスした場合、それらのテーブルのすべてのデータを照会、変更、または削除する権限があります。

ストアドプロシージャを使用している場合、ストアドプロシージャを実行する権利のみがあり、ストアドプロシージャが返す情報のみを取得します。簡単な削除ステートメントを発行してすべてを吹き飛ばす代わりに、データを削除するために使用できる手順を把握し、その手順を使用する方法を把握する必要があります。

SQLインジェクションがデータベースに侵入する最も簡単な方法であることを考えると、これはちょっと重要です。


@mrdenny-パラメータ化されている場合、「生のクエリ」でも同じ効果を得ることができますか?
ジャックダグラス

はい、それらが完全にパラメータ化されている場合。ただし、それはストアドプロシージャで解決されるセキュリティ問題に対処していません。
mrdenny

10

Dennyの回答の補遺として、procで使用されているクエリの結果として作成された、単一または低使用のアドホック実行プランでかなりのバッファプールメモリが浪費されるシステムを見つけることは珍しくありません。

最近の最悪のケースは、インスタンスに8GBが割り当てられ、3GBのプランキャッシュ、2.5GBのシングルユースプランです。これらの大部分はSQL2005であったため、アドホックワークロードの最適化設定を試すオプションではありませんでした。

生のクエリに対する手順の正当性にパフォーマンスを含めることは確かに難しくなっています。私にとっての最も強力な議論の1つは、「プロシージャを使用すると、パフォーマンスの問題が発生したときに支援するのがはるかに簡単になります」です。動的/ linq / ormインターフェースはチューニングを妨げませんが、オプションを大幅に制限する可能性があります。


これらの使い捨てプランを削除するためのスクリプトなど、すばらしい関連記事がここにあります。 sqlskills.com/blogs/kimberly/...
SomeGuy

7

SQL Serverは、同じ方法でストアドプロシージャとアドホックSQLをキャッシュして最適化します。たとえば、次の手順:

create procedure dbo.TestSB(@id int) as select * from Orders where id = @id

以下と同じように最適化およびキャッシュされます。

select * from Orders where id = @id

ただし、次のアドホックSQLは、値がハードコードされているため、効果的にキャッシュできません。

select * from Orders where id = 42

パフォーマンスは同じですが、ストアドプロシージャを使用する正当な理由があります。ストアドプロシージャは、DBAとアプリケーション開発者を明確に分離します。貴重なデータと絶えず変化するプログラムの間に追加の防御層を設けるのは良いことです:)


特に、すべてのアクセスがSPを通過するように強制し、SPがCRUDレイヤーだけでなくトランザクションAPIとして十分に考えられている場合は、+ 1
Jack Douglas

2008+では、id = 42単純な/強制的なパラメータ設定に応じて、同じプランを使用してクエリを最適化できます。もちろん、クエリは適切にパラメータ化する必要があります。:-)
アーロンバートランド
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.