sql >> Databáze >  >> RDS >> Sqlserver

.NET databáze volá pomalu při použití COM Interop, rychle přes analyzátor dotazů

Zkontrolujte typ parametru (@SSN), který předáváte SQL. Častěji se parametr přidává takto:

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

Tento vzor bohužel přidává @SSN parametr jako NVARCHAR typu (tj. Unicode). Pravidla pro SQL Server Prednost datových typů vyžadují, aby porovnání mezi NVARCHAR a VARCHAR bylo provedeno jako NVARCHAR, takže dotaz bude proveden, jako by byl požadován následující SQL:

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

Tento dotaz nemůže těžit z indexu ve sloupci SSN, takže se místo toho provádí skenování tabulky. V 90 % případů, kdy prošetřuji tvrzení „dotaz běží pomalu z aplikace, ale rychle z SSMS“, je tento problém, protože velká většina vývojářů ve skutečnosti spouští jiné dotaz v SSMS k porovnání (použijí argument VARCHAR nebo pevně zakódovanou hodnotu).

Pokud se skutečně jedná o tento problém, řešení je triviální:explicitně zadejte typ parametru jako SqlDbType.VarChar .




  1. Volání uložené funkce nebo procedury nevloží a zachová změny

  2. ORA-01264 ve fyzickém pohotovostním režimu

  3. Funkce MySQL ATAN() – vrátí arc tangens hodnoty (nebo hodnot)

  4. Žádné příkazy připravené na straně serveru pomocí MySQL Connector/J