sql >> Databasteknik >  >> RDS >> Sqlserver

Fråga extremt långsam i koden men snabb i SSMS

Din kod i SSMS är inte samma kod som du kör i din applikation. Den här raden i din applikation lägger till en NVARCHAR-parameter:

 ada.SelectCommand.Parameters.AddWithValue("@clientID", ClientID);

medan du i SSMS-skriptet deklarerar det som VARCHAR:

declare @clientID varchar(200)

På grund av reglerna för Data Type Precedence är Where client_id = @clientID uttrycket i din fråga är inte SARG-komligt där @clientID är av typen NVARCHAR (jag gör ett språng i tro och antar att client_id kolumnen är av typen VARCHAR). Applikationen tvingar alltså fram en tabellskanning där SSMS-frågan kan göra en snabb nyckelsökning. Detta är ett välkänt och förstått problem med att använda Parameters.AddWithValue och har diskuterats i många artiklar tidigare, t.ex. se Hur dataåtkomstkod påverkar databasprestanda. När problemet väl är förstått är lösningarna triviala:

  • lägg till parametrar med konstruktorn som accepterar en typ:Parameters.Add("@clientID", SqlDbType.Varchar, 200) (och gör skicka in den explicita längden för att förhindra cacheförorening, se Frågaprestanda och planera cacheproblem när parameterlängden inte har angetts korrekt

  • eller casta parametern i SQL-texten:where client_id = cast(@clientID as varchar(200)) .

Den första lösningen är överlägsen eftersom den löser cacheföroreningsproblemet förutom SARG-förmågasproblemet.

Jag skulle också rekommendera dig att läsa Långsamt i applikationen, Snabbt i SSMS? Förstå prestandamysterier



  1. Hur fungerar MySQL CASE?

  2. Byt namn på en användardefinierad datatyp i SQL Server (T-SQL)

  3. PDO förberedde satsen fetch() som returnerar dubbla resultat

  4. Trädvyskontroll Markera Lägg till Ta bort noder