ホームページ >データベース >mysql チュートリアル >パラメーター スニッフィングによる SQL Server ストアド プロシージャのパフォーマンス低下を解決するにはどうすればよいですか?

パラメーター スニッフィングによる SQL Server ストアド プロシージャのパフォーマンス低下を解決するにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-31 00:39:38230ブラウズ

How Can I Resolve SQL Server Stored Procedure Performance Degradation Caused by Parameter Sniffing?

パラメータ スニッフィングによる SQL Server ストアド プロシージャのパフォーマンス低下

パラメータ スニッフィングは、SQL Server で使用される最適化手法で、クエリのパフォーマンスを向上させるために、ストアド プロシージャが最初にコンパイルされるときのパラメーター値に基づく実行計画。ただし、場合によっては、パラメーター スニッフィングがパフォーマンスの問題を引き起こす可能性があります。

次のストアド プロシージャを考えてみましょう:

CREATE PROCEDURE MyProc
    @MyDate DATETIME = NULL
AS
    IF @MyDate IS NULL SET @MyDate = CURRENT_TIMESTAMP
    -- Do Something using @MyDate

このストアド プロシージャが @MyDate を NULL として最初に実行されると、クエリはオプティマイザーは、その特定のパラメーター値に最適化された実行プランを生成します。ただし、その後ストアド プロシージャが @MyDate の異なる値を使用して実行されると、クエリ オプティマイザーが最適な実行プランをコンパイルできず、パフォーマンスの低下につながる可能性があります。

この問題は、「パラメーター スニッフィングの異常」として知られています。 。上の例では、ストアド プロシージャで @MyDate を使用するときに実際には NULL であっても、最初のコンパイルに基づいて生成された不適切な実行プランが引き続き有効です。

この問題を解決するには、パラメータを無効にします。パラメーターのスプーフィングによるスニッフィング:

CREATE PROCEDURE MyProc
    @MyDate DATETIME = NULL
AS
    DECLARE @MyDate_Copy DATETIME
    SET @MyDate_Copy = @MyDate
    IF @MyDate_Copy IS NULL SET @MyDate_Copy = CURRENT_TIMESTAMP
    -- Do Something using @MyDate_Copy

このアプローチでは、入力パラメーターのコピーを作成し、そのコピーをクエリ最適化プロセスに使用して、パラメーターの偏りを防ぎます。

SQL Server 2008 以降では、OPTIMIZE FOR UNKNOWN ヒントを使用してパラメーター スニッフィングを最適化できます。

CREATE PROCEDURE MyProc
    @MyDate DATETIME = NULL
WITH RECOMPILE, OPTIMIZE FOR UNKNOWN
AS
    -- Do Something using @MyDate

このヒントは、不明な情報に基づいて実行プランを生成するようにクエリ オプティマイザーに指示します。パラメータ値を削除し、パラメータ スニッフィングに関連したパフォーマンスの問題のリスクを排除します。

以上がパラメーター スニッフィングによる SQL Server ストアド プロシージャのパフォーマンス低下を解決するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。