Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Chamadas de banco de dados .NET são lentas ao usar o COM Interop, rápidas por meio do analisador de consultas


Verifique o tipo de parâmetro (@SSN) que você passa para o SQL. Na maioria das vezes, o parâmetro é adicionado assim:
List<...> GetBySSN(string ssn) {
   SqlCommand cmd = new SqlCommand (@"select ... from ... where [email protected]", conn);
   cmd.Parameters.AddWithValue("@SSN", ssn);
   using (SqlDataReader rdr = cmd.ExecuteQuery()) {
     ...
   }
}

Infelizmente, este padrão adiciona o @SSN parâmetro como um NVARCHAR tipo (ou seja, Unicode). As regras do SQL Server Precedência de tipo de dados exigem que a comparação entre um NVARCHAR e um VARCHAR seja feita como NVARCHAR, então a consulta é executada como se o seguinte SQL fosse solicitado:
select ... from ... where CAST(SSN as NVARCHAR) = @SSN;

Essa consulta não pode se beneficiar de um índice na coluna SSN, portanto, uma verificação de tabela é executada. 90% das vezes que investigo a afirmação 'a consulta é lenta no aplicativo, mas rápida no SSMS' é esse problema, porque a grande maioria dos desenvolvedores realmente executa um diferente consulta no SSMS para comparar (eles usam um argumento VARCHAR ou um valor codificado).

Se esse for realmente o problema, a solução é trivial:especifique explicitamente o tipo de parâmetro como SqlDbType.VarChar .