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

COM相互運用機能を使用すると、.NETデータベースの呼び出しが遅くなり、クエリアナライザーを介して高速になります

    SQLに渡すパラメーターのタイプ(@SSN)を確認してください。多くの場合、パラメータは次のように追加されます:

    List<...> GetBySSN(string ssn) {
       SqlCommand cmd = new SqlCommand (@"select ... from ... where [email protected]", conn);
       cmd.Parameters.AddWithValue("@SSN", ssn);
       using (SqlDataReader rdr = cmd.ExecuteQuery()) {
         ...
       }
    }
    

    このパターンは残念ながら@SSNを追加します NVARCHARとしてのパラメータ タイプ(つまりUnicode)。 SQLServerのルールデータ型の優先順位 NVARCHARとVARCHARの比較をNVARCHARとして実行する必要があるため、クエリは次のSQLが要求されたかのように実行されます。

    select ... from ... where CAST(SSN as NVARCHAR) = @SSN;
    

    このクエリはSSN列のインデックスの恩恵を受けることができないため、代わりにテーブルスキャンが実行されます。私が主張を調査する回数の90%は、「クエリはアプリからは遅くなりますが、SSMSからは速くなります」という主張を調査します。これは、開発者の大多数が実際に異なるを実行しているためです。 比較するSSMSでのクエリ(VARCHAR引数またはハードコードされた値を使用します)。

    これが実際に問題である場合、解決策は簡単です。パラメータタイプを SqlDbType.VarChar




    1. スクリプトが実行された回数を数える

    2. SQL Server 2016:データのインポート

    3. WolframMathematicaでのMicrosoftAccessデータの使用

    4. PHP + MySQL投票でIPごとに1日あたりの投票を制限するにはどうすればよいですか?