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

Forespørgsel timeout, når den udføres fra web, men superhurtig, når den udføres fra SSMS

Så din C#-kode sender en ad hoc SQL-forespørgsel til SQL Server, ved hjælp af hvilken metode? Har du overvejet at bruge en lagret procedure? Det ville nok sikre den samme ydeevne (i hvert fald i motoren) uanset hvem der kaldte den.

Hvorfor? ARITHABORT-indstillingen er en af ​​de ting, optimeringsværktøjet ser på, når det bestemmer, hvordan din forespørgsel skal udføres (mere specifikt til planmatching). Det er muligt, at planen i cachen har samme indstilling som SSMS, så den bruger den cachelagrede plan, men med den modsatte indstilling tvinger din C#-kode en omkompilering (eller måske rammer du en virkelig DÅRLIG plan i cachen), hvilket helt sikkert kan skade ydeevnen i mange tilfælde.

Hvis du allerede kalder en lagret procedure (du har ikke sendt din forespørgsel, selvom jeg tror, ​​du mente det), kan du prøve at tilføje OPTION (RECOMPILE) til den stødende forespørgsel (eller forespørgsler) i den lagrede procedure. Dette vil betyde, at disse udsagn altid genkompileres, men det kan forhindre brugen af ​​den dårlige plan, du ser ud til at ramme. En anden mulighed er at sikre, at når den lagrede procedure er kompileret, udføres batchen med SET ARITHABORT TIL.

Endelig synes du at spørge, hvordan du kan ændre ARITHABORT-indstillingen i SSMS. Jeg tror, ​​det du ville spørge om, er hvordan du kan tvinge ARITHABORT-indstillingen i din kode. Hvis du beslutter dig for at fortsætte med at sende ad hoc SQL fra din C# app, så kan du selvfølgelig sende en kommando som tekst, der har flere sætninger adskilt af semikolon, f.eks.:

SET ARITHABORT ON; SELECT ...

For mere information om, hvorfor dette problem opstår, se Erland Sommarskogs store artikel:

  • Langsom i applikationen, hurtig i SSMS? Forståelse af præstationsmysterier


  1. SQL Server rekursiv forespørgsel

  2. Analyser Big Data med Microsoft Azure Tools

  3. Fejl ORA-65048 ved ændring af brugeradgangskode i containerdatabase (CDB)

  4. Oracle pl-sql escape-tegn (for en ' )