sql >> データベース >  >> RDS >> Sqlserver

パラメーターは、値のハードコーディングと同様に機能しません

    概要を編集 Damien_The_Unbeliever からのリクエストによる

    目標は、計画が作成される前に、変数値に関する最良/ほとんどの情報を SQL に取得することです。通常、パラメーター スニッフィングはこれを行います。この場合、パラメータ スニッフィングが「無効」になっている理由が考えられます。実際のコードのより良い表現を見ないと、解決策が何であるか、または問題が存在する理由を実際に言うことはできません.以下のことを試して、影響を受ける地域に実際の値を使用して計画を生成させてください。

    *より詳細なロングバージョン*

    これは実際のストアド プロシージャですか?パラメータのデフォルト値はありますか?もしそうなら、それらは何ですか?

    パラメーター スニッフィングは役に立ちますが、計画を適切に作成するには、典型的なパラメーター値が必要です。そのため、変数が最初に実行されてプランがコンパイルされたときに null のデフォルト値または典型的な値ではない値を持つ場合、不適切なプランが作成されます。

    他の誰かがこの sproc を書いた場合、何らかの理由で、ローカル変数のパラメーター スニッフィングを意図的に「無効」にしている可能性があります。ビジネス ルールでは、これらの変数構造が必要になる場合があります。

    目標は、計画が作成される前に変数値に関する最良/ほとんどの情報を SQL に取得することであり、通常はパラメーター スニッフィングがこれを行います。ただし、パフォーマンスに悪影響を与える可能性があるものがあるため、「無効」になっている可能性があります。パラメータのスニッフィングを使用するかどうかにかかわらず、パラメータの非定型値またはまだ十分な情報で計画が作成されていないようです。

    Use sp_executesql を使用して sproc 内でクエリを呼び出して、影響を受けるクエリを実行し、実際の変数を使用してその領域のプランを強制的に生成し、それがより良いかどうかを確認してください。この種の不規則なパラメーター値が必要な場合は、これが解決策になる可能性があります。変数が典型的な値を受け取った後、影響を受ける部分を実行するストアド プロシージャを作成し、後でストアド プロシージャ内から呼び出す必要があります。

    実際のコードをより適切に表示しないと、何が問題なのかを理解するのは困難です。この情報がお役に立てば幸いです -



    1. mysqldumpを使用したmysqldbバックアップの「ビュー」を無視する

    2. 同じ列のmysqlAND句が複数回

    3. MIN集計関数をBITフィールドに適用する

    4. MySQL 5、シンプルメンバーシッププロバイダー、EntityFramework5でのASP.NETMVC4の使用