Din kode i SSMS er ikke den samme kode, som du kører i din applikation. Denne linje i din applikation tilføjer en NVARCHAR-parameter:
ada.SelectCommand.Parameters.AddWithValue("@clientID", ClientID);
mens du i SSMS-scriptet erklærer det som VARCHAR:
declare @clientID varchar(200)
På grund af reglerne for Data Type Precedence er Where client_id = @clientID
udtryk i din forespørgsel er ikke SARG-kompatibelt hvor @clientID
er af typen NVARCHAR (jeg tager et spring af tro og antager, at client_id
kolonne er af typen VARCHAR). Applikationen fremtvinger således en tabelscanning, hvor SSMS-forespørgslen kan foretage en hurtig nøglesøgning. Dette er et velkendt og forstået problem med at bruge Parameters.AddWithValue og er blevet diskuteret i mange artikler før, f.eks. se Hvordan dataadgangskode påvirker databaseydelsen. Når først problemet er forstået, er løsningerne trivielle:
-
tilføje parametre med konstruktøren, der accepterer en type:
Parameters.Add("@clientID", SqlDbType.Varchar, 200)
(og gør indgiv den eksplicitte længde for at forhindre cacheforurening, se Forespørgselsydelse og planlæg cacheproblemer, når parameterlængden ikke er angivet korrekt -
eller cast parameteren i SQL-teksten:
where client_id = cast(@clientID as varchar(200))
.
Den første løsning er overlegen, fordi den løser cacheforureningsproblemet ud over SARG-evneproblemet.
Jeg vil også anbefale dig at læse Langsom i applikationen, hurtig i SSMS? Forståelse af præstationsmysterier