SQL Server 2008を使用しています。SQLServerプロファイラーで監視していると、たとえば20秒かかるクエリがいくつか見つかりました。 SQL Server Management Studioで同じクエリを(ストアドプロシージャで)実行すると、2秒かかります。メモリとCPUが20%のクエリをキャッチすると、SQL Serverに負荷がかかります。
私は何ができますか?
ストアドプロシージャの実行時間とインラインSQLの実行時間を比較するときは注意してください。
ストアドプロシージャは1つの実行プランにコンパイルされ、可能なすべてのパラメーターに適合します。クエリによっては、これはすべてのパラメーターに対して適切な計画ではない可能性がありますが、代わりにすべてのパラメーターの中で最悪です。
Inlineを実行すると、オプティマイザーはクエリとパラメーターの両方を確認できます。その後、そのケースに特化した計画を作成できます。 OR @param IS NULL
などの条件を取り、それをOR TRUE
に変換してから、具体的にそれに適合するインデックスとアプローチを選択できます。
つまり、インラインプロシージャとストアドプロシージャは、さまざまなパフォーマンス特性を持つさまざまなプランを生成できます。
特定のケースについて、ストアドプロシージャの定義を教えていただけますか?
これは、クエリプランが「ひどく間違っている」という過去に見たことがあります。SSMSからアプリケーション(.Netで作成されたものなど)経由で実行する場合は、異なるクエリプランを使用することを覚えておく価値があります。
SQLサーバーにリンクサーバーがある場合、これを実証できます。 「実際の」サーバーに接続し、高速に実行されることを確認します。リンクサーバーに再接続して再度実行すると、パフォーマンスの違いがわかります。
これはSQL Server 2000用でしたが、おそらくあなたのケースに適用されます: https://stackoverflow.com/questions/440944/sql-server-query-fast-but-slow-from-procedure
それは反対の状況でしたが、おそらくANSI NULLSに問題があるのでしょうか?