Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

.NET извикванията на базата данни са бавни, когато се използва COM Interop, бързо чрез анализатор на заявки

Проверете типа на параметъра (@SSN), който предавате на SQL. По-често параметърът се добавя по следния начин:

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). Правилата на SQL Server Приоритет на типа данни изискват сравнението между NVARCHAR и VARCHAR да се извършва като NVARCHAR, така че заявката се изпълнява така, сякаш е бил поискан следният SQL:

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

Тази заявка не може да се възползва от индекс в колоната SSN, така че вместо това се извършва сканиране на таблица. 90% от случаите, когато проучвам твърдението „заявката се изпълнява бавно от приложението, но бързо от SSMS“ е този проблем, защото огромното мнозинство от разработчиците всъщност изпълняват различни заявка в SSMS за сравняване (те използват аргумент VARCHAR или твърдо кодирана стойност).

Ако това наистина е проблемът, решението е тривиално:изрично посочете типа на параметъра като SqlDbType.VarChar .




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Вмъкване на големи обектни данни в Salesforce.com от SQL Server

  2. SUBSTRING Команда в SQL:Пример

  3. Форматиране на sysjobhistory дата и време на колони в SQL Server

  4. SQL WHERE клауза, съответстваща на стойности с крайни интервали

  5. Свържете SQL Server към HubSpot CRM