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

Webから実行するとクエリはタイムアウトしますが、SSMSから実行すると超高速になります

    では、C#コードは、どのような方法を使用して、アドホックSQLクエリをSQLServerに送信していますか?ストアドプロシージャの使用を検討しましたか?それはおそらく誰がそれを呼んだかに関係なく(少なくともエンジンで)同じパフォーマンスを保証するでしょう。

    なんで? ARITHABORT設定は、オプティマイザーがクエリの実行方法を決定するときに(より具体的には、プランの照合のために)確認するものの1つです。キャッシュ内のプランがSSMSと同じ設定である可能性があるため、キャッシュされたプランを使用しますが、反対の設定では、C#コードが再コンパイルを強制します(または、実際に BAD キャッシュ内の計画)。これは、多くの場合、確かにパフォーマンスを低下させる可能性があります。

    すでにストアドプロシージャを呼び出している場合(クエリを投稿していませんが、意図したとおりです)、ストアドプロシージャの問題のあるクエリにOPTION(RECOMPILE)を追加してみてください。これは、これらのステートメントが常に再コンパイルされることを意味しますが、ヒットしているように見える悪い計画の使用を防ぐことができます。もう1つのオプションは、ストアドプロシージャがコンパイルされるときに、SETARITHABORTONでバッチが実行されるようにすることです。

    最後に、SSMSでARITHABORT設定を変更する方法を尋ねているようです。あなたが尋ねるつもりだったのは、コードでARITHABORT設定を強制する方法だと思います。 C#アプリからアドホックSQLを引き続き送信する場合は、もちろん、セミコロンで区切られた複数のステートメントを含むテキストとしてコマンドを送信できます。例:

    SET ARITHABORT ON; SELECT ...
    

    この問題が発生する理由の詳細については、ErlandSommarskogのすばらしい記事を参照してください。

    • アプリケーションが遅い、SSMSが速い?パフォーマンスの謎を理解する


    1. ProxySQLをKubernetesサービスとして実行する

    2. nvarchar(MAX)が保持する最大文字数はいくつですか?

    3. PostgreSQL-テーブル名としての動的な値

    4. 空のテーブルのMAX()をNULLではなく0として扱う方法