Indtil tabelstrukturen og det forventede resultateksempeldata ikke er angivet, er her et par hurtige ting, jeg ser, som kan forbedres (nogle af dem er allerede nævnt af andre ovenfor):
- WHILE Loop er også en markør. Så det bliver ikke hurtigere at skifte til while-løkke.
- Brug LOCAL FAST_FORWARD cursor, medmindre du har brug for at spore en post tilbage. Dette ville gøre udførelsen meget hurtigere.
-
Ja, jeg er enig i, at en SET-baseret tilgang ville være den hurtigste i de fleste tilfælde, men hvis du skal gemme mellemresultatsæt et eller andet sted, vil jeg foreslå at bruge en midlertidig tabel i stedet for en tabelvariabel. Temp-tabellen er 'mindre ondskab' mellem disse 2 muligheder. Her er et par grunde til, hvorfor du bør forsøge at undgå at bruge en tabelvariabel:
- Da SQL Server ikke ville have nogen forudgående statistik på tabelvariablen under opbygning af eksekveringsplanen, vil den altid overveje, at kun én post ville blive returneret af tabelvariablen under opbygningen af eksekveringsplanen. Og derfor vil Storage Engine kun tildele så meget RAM-hukommelse til udførelse af forespørgslen. Men i virkeligheden kan der være millioner af poster, som tabelvariablen kan have under udførelse. Hvis det sker, vil SQL Server blive tvunget til at spilde dataene til harddisken under udførelse (og du vil se masser af PAGEIOLATCH i sys.dm_os_wait_stats), hvilket gør forespørgslerne meget langsommere.
- En måde at slippe af med ovenstående problem ville være ved at give sætningsniveau hint OPTION (RECOMPILE) i slutningen af hver forespørgsel, hvor der bruges en tabelværdi. Dette ville tvinge SQL Server til at konstruere eksekveringsplanen for disse forespørgsler hver gang under kørsel, og det mindre problem med hukommelsesallokering kan undgås. Men ulempen ved dette er:SQL Server vil ikke længere være i stand til at drage fordel af en allerede cachelagret eksekveringsplan for den lagrede procedure og vil kræve genkompilering hver gang, hvilket ville forringe ydeevnen i nogen grad. Så medmindre du ved, at data i den underliggende tabel ændres ofte, eller selve den lagrede procedure ikke udføres ofte, anbefales denne fremgangsmåde ikke af Microsoft MVP'er.