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

Parameteren fungerer ikke så godt som hårdkodning af værdien

REDIGER RESUMÉ Efter en anmodning fra Damien_The_Unbeliever

Målet er at få den bedste/mest information om variabelværdien til SQL FØR planen oprettes, generelt gør parametersniffing dette. Der kan være en grund til, at parametersniffing blev 'deaktiveret' i dette tilfælde. Uden at se en bedre repræsentation af den faktiske kode kan vi ikke rigtig sige, hvad løsningen er, eller hvorfor problemet eksisterer. Prøv nedenstående ting for at tvinge de berørte områder til at generere planer ved hjælp af faktiske værdier.

*LANG VERSION MED FLERE DETALJER *

Er dette din faktiske lagrede proc? Har du standardværdier for dine parametre? Hvis ja, hvad er de?

Parametersniffing kan hjælpe - men det skal have typiske parameterværdier for at skabe planen godt, og hvis ikke, hjælper det ikke rigtigt eller vil skabe en dårlig plan baseret på den ikke-typiske parameterværdi. Så hvis en variabel har en standardværdi på null eller en værdi, der ikke er en typisk værdi, første gang den køres og planen kompileres - skaber den en dårlig plan.

Hvis en anden skrev denne sproc - kan de med vilje have 'deaktiveret' parametersniffing med de lokale variabler af en grund. Forretningsregler kan kræve disse variable strukturer.

Målet er at få den bedste/mest information om variabelværdien til SQL FØR planen oprettes, og generelt gør Parameter Sniffing dette. Men der er ting, der kan få det til at påvirke ydeevnen negativt, og det er måske derfor, det er 'deaktiveret'. Det ser stadig ud til, at planen bliver oprettet med atypiske værdier for parametrene eller stadig ikke nok info - ved hjælp af parametersniffing eller ej.

Prøv at kalde forespørgslen inde i sproc'en med Brug sp_executesql til at udføre de berørte forespørgsler, og tving den til at generere en plan for det område med de faktiske variabler, og se om den er bedre. Dette kan være din løsning, hvis du skal have denne form for uregelmæssig parameterværdi - opret lagrede procs, der kører de berørte dele og kalder dem senere inde fra den lagrede procedure - efter at variablen har modtaget en typisk værdi.

Uden at se en bedre repræsentation af den faktiske kode, er det svært at se, hvad problemet er. Forhåbentlig vil disse oplysninger hjælpe -



  1. Returner det oprindelige frø af en identitetskolonne i SQL Server

  2. MySQL til Qt på Mac

  3. Android Sqlite ydeevne

  4. Gruppér efter ID undtagen NULL-posterne