sql >> Database teknologi >  >> RDS >> Sqlserver

Forespørgsel ekstremt langsom i kode, men hurtig i SSMS

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



  1. MySQL IF() Funktion forklaret

  2. Optimering af MySQL-søgning ved hjælp af like og jokertegn

  3. MySQL – MariaDB – Skrivning af den allerførste lagrede procedure

  4. MySQL SIN() Funktion – Returner sinus for et tal i MySQL