Taulukon muuttujien ja väliaikaisten taulukoiden (ST011, ST012) valitseminen

Ihmiset voivat ja kiistävät paljon pöytämuuttujien ja väliaikaisten taulukoiden suhteellisista eduista. Joskus, kuten kirjoittaessasi toimintoja, sinulla ei ole muuta vaihtoehtoa; mutta kun huomaat, huomaat, että molemmilla on käyttötarkoituksensa, ja on helppo löytää esimerkkejä siitä, kumpi on nopeampaa. Tässä artikkelissa selitän tärkeimmät tekijät, jotka liittyvät yhden tai toisen valitsemiseen, ja esitän muutaman yksinkertaisen säännön parhaan suorituskyvyn saavuttamiseksi.

Olettaen, että noudatat sitoutumisen perussääntöjä , sinun tulisi harkita taulukon muuttujia ensimmäisenä vaihtoehtona työskennellessäsi suhteellisen pienten tietojoukkojen kanssa. Niiden kanssa on helpompi työskennellä ja ne aiheuttavat vähemmän uudelleenkääntämistä rutiineissa, joissa niitä käytetään, verrattuna väliaikaisten taulukoiden käyttöön. Taulukon muuttujat vaativat myös vähemmän lukitusresursseja, koska ne ovat ”yksityisiä” niitä luoneelle prosessille ja erälle. SQL Prompt toteuttaa tämän suosituksen koodianalyysisääntönä, ST011 – Harkitse taulukon muuttujan käyttöä väliaikaisen taulukon sijaan.

Jos käsittelet monimutkaisempia väliaikaisia tietoja tai sinun on käytettävä enemmän kuin kohtuullisen pieniä määriä tietoja, niin paikalliset väliaikaiset taulukot ovat todennäköisesti parempi valinta. SQL Code Guard sisältää koodianalyysisäännön, joka perustuu hänen suositukseensa ST012 – Harkitse väliaikaisen taulukon käyttöä taulukon muuttujan sijaan, mutta sitä ei tällä hetkellä ole otettu käyttöön SQL-kehotteessa.

Taulukon muuttujien ja väliaikaisten taulukoiden edut ja haitat

Taulukon muuttujilla on taipumus saada huonoa lehdistöä, koska niitä käyttävät kyselyt johtavat ajoittain erittäin tehottomiin toteutussuunnitelmiin. Jos kuitenkin noudatat muutamia yksinkertaisia sääntöjä, ne ovat hyvä valinta välitason ”työtaulukoihin” ja tulosten siirtämiseen rutiinien välillä, joissa tietojoukot ovat pieniä ja vaadittu käsittely on suhteellisen yksinkertaista.

Taulukon muuttujia on erittäin helppo käyttää, pääasiassa siksi, että ne ovat ”nolla ylläpitoa”. Ne määritetään erään tai rutiiniin, jossa ne on luotu, ja ne poistetaan automaattisesti, kun se on suoritettu loppuun, ja siten niiden käyttäminen pitkäikäisessä yhteydessä ei vaaranna resurssien hogging-ongelmia tempdb: ssä. Jos taulukon muuttuja ilmoitetaan tallennetussa menettelyssä, se on paikallinen kyseiselle tallennetulle menettelylle, eikä siihen voi viitata sisäkkäisessä menettelyssä. Taulukon muuttujiin ei myöskään ole tilastopohjaisia uudelleenkäännöksiä ja et voi ALTER yhtä, joten niitä käyttävissä rutiineissa on yleensä vähemmän käännöksiä kuin niissä, jotka käyttävät väliaikaisia taulukoita. Niitä ei myöskään ole täysin kirjattu, joten niiden luominen ja täyttäminen on nopeampaa ja vaatii vähemmän tilaa t: ssä ransaction log. Kun niitä käytetään tallennetuissa menettelyissä, järjestelmätaulukoissa on vähemmän kiistoja korkean samanaikaisuuden olosuhteissa. Lyhyesti sanottuna on helpompaa pitää asiat siistinä.

Kun työskentelet suhteellisen pienten tietojoukkojen kanssa, ne ovat nopeampi kuin vastaava väliaikainen taulukko. Rivien lukumäärän kasvaessa, kuitenkin noin 15 000 rivin yli, mutta vaihtelevat kontekstin mukaan, voit joutua vaikeuksiin pääasiassa siksi, että ne eivät tue tilastoja. Jopa hakemistoissa, jotka pakottavat PRIMARY KEY ja UNIQUE rajoitukset taulukon muuttujiin, ei ole tilastoja . Siksi optimoija käyttää kovakoodattua estimaattia yhdestä taulukon muuttujasta palautetusta rivistä ja pyrkii siten valitsemaan operaattorit, jotka ovat optimaalisia työskentelemään pienten tietojoukkojen kanssa (kuten Nested Loops -operaattori liittymiä varten). Mitä enemmän rivejä taulukon muuttujassa on, sitä suuremmat erot estimoinnin ja todellisuuden välillä ovat, ja tehottomammiksi tulevat optimoijan suunnitelmavalinnat. Tuloksena oleva suunnitelma on joskus pelottava.

Kokenut kehittäjä tai DBA etsii tällaista ongelmaa ja on valmis lisäämään OPTION (RECOMPILE) kyselyvihje lauseelle, joka käyttää taulukon muuttujaa. Kun lähetämme erän, joka sisältää taulukon muuttujan, optimoija kokoaa ensin erän, jossa taulukon muuttuja on tyhjä. Kun erä alkaa suorittaa, vihje aiheuttaa vain kyseisen yksittäisen lauseen kääntämisen uudelleen, jolloin taulukon muuttuja täytetään ja optimoija voi käyttää todellista rivien lukumäärää laatiakseen uuden suunnitelman tälle käskylle. Joskus, mutta harvoin, edes tämä ei auta. Myös liiallinen luottaminen tähän vihjeeseen mitätöi jossain määrin edun, joka taulukon muuttujilla on, mikä aiheuttaa vähemmän uudelleenkääntämistä kuin väliaikaiset taulukot.

Toiseksi tietyistä taulukon muuttujien indeksirajoituksista tulee enemmän tekijöitä käsiteltäessä suuret tietojoukot. Vaikka voit nyt käyttää sisäisen hakemistojen luomisen syntaksia luomaan ryhmittymättömiä hakemistoja taulukon muuttujalle, on joitain rajoituksia, eikä niihin liittyviä tilastoja ole vielä.

Jopa suhteellisen vaatimattomien rivien määrällä voit kohdata kyselyn suorituskykyongelmia, jos yrität suorittaa kyselyn, joka on liitos, ja unohdat määrittää PRIMARY KEY tai UNIQUE rajoitus liittymiseen käytetyssä sarakkeessa. Ilman tarjoamiaan metatietoja optimoijalla ei ole tietoa tietojen loogisesta järjestyksestä tai siitä, sisältävätkö liittymissarakkeen tiedot päällekkäisiä arvoja, ja todennäköisesti valita tehottomia liittymistoimintoja, mikä johtaa hitaisiin kyselyihin. Jos työskentelet taulukon muuttuvan kasan kanssa, voit käyttää sitä vain yksinkertaista luetteloa, joka todennäköisesti käsitellään yhdellä kerralla (taulukon skannaus). Jos yhdistät sekä OPTION (RECOMPILE) -vihjeen käytön tarkkojen kardinaaliarvioiden arvioimiseksi, että liitosarakkeen avaimen, jotta optimoija olisi hyödyllinen metatiedot, pienempien tietojoukkojen kohdalla voit usein saavuttaa kyselynopeuden, joka on samanlainen tai parempi kuin paikallisen väliaikaisen taulukon käyttö.

Kun rivien määrä kasvaa taulukon muuttujan mukavuusalueen ulkopuolella tai sinun on tehtävä monimutkaisempia tietoja käsittelyssä, sinun on parasta siirtyä käyttämään väliaikaisia taulukoita. Täällä sinulla on kaikki indeksointiin käytettävissä olevat vaihtoehdot, ja optimoijalla on ylellisyyttä käyttää tilastoja kullekin näistä hakemistoista. Tietenkin haittapuoli on, että väliaikaisilla pöydillä on korkeammat ylläpitokustannukset. Sinun on ehdottomasti puhdistettava itsesi jälkeen, jotta vältetään tempdb-ruuhkat. Jos muutat väliaikaista taulukkoa tai muokkaat niiden tietoja, saatat joutua kääntämään uudelleen ylätason rutiinin.

Väliaikaiset taulukot ovat parempia, kun vaaditaan suurta määrää poistoja ja lisäyksiä (rivisarjan jakaminen) ). Tämä pätee erityisesti, jos tiedot on poistettava kokonaan taulukosta, koska vain väliaikaiset taulukot tukevat katkaisua. Taulukon muuttujien suunnittelussa tehdyt kompromissit, kuten tilastojen ja uudelleen kääntämisen puute, toimivat niitä vastaan, jos tiedot ovat epävakaita.

Kun kannattaa käyttää taulukon muuttujia

Me Aloitan esimerkillä, jossa taulukon muuttuja on ihanteellinen ja johtaa parempaan suorituskykyyn. Laadimme luettelon Adventureworksin työntekijöistä, missä osastossa he työskentelevät ja missä vuoroissa he työskentelevät. Käsittelemme pientä tietojoukkoa (291 riviä).

Laitamme tulokset toiseen väliaikaiseen taulukkoon, ikään kuin välitämme tuloksen seuraavalle erälle. Listaus 1 näyttää koodin.

Ja tässä on tyypillinen tulos hitaalla testikoneellani:

Väliaikaisen taulukon käyttö on jatkuvasti hitaampaa, vaikka yksittäiset ajot voivat vaihdella melko paljon.

Mittakaavan ongelmat ja avaimen tai vihjeen antamisen unohtaminen

Millainen suorituskyky on, jos yhdistämme kaksi taulukon muuttujaa? Kokeillaan. Tässä esimerkissä tarvitaan kaksi yksinkertaista taulukkoa, joista toisessa on kaikki englannin kielen yleisimmät sanat (CommonWords), ja toisessa luettelo kaikista Bram Stokerin Draculan sanoista. (WordsInDracula). TestTVsAndTTs-lataus sisältää komentosarjan näiden kahden taulukon luomiseksi ja kunkin täyttämiseksi siihen liittyvästä tekstitiedostosta. Yleisiä sanoja on 60 000, mutta Bram Stoker käytti niitä vain 10000. Ensin mainittu on kaukana kannattavuusrajasta, jossa aletaan suosia väliaikaisia taulukoita.

Käytämme neljää yksinkertaista, ulompaa liittymiskyselyä, testaamalla tuloksen NULL arvot, selvittääksesi yleiset sanat, jotka eivät ole Draculassa, yleiset sanat, jotka ovat Draculassa, Draculan sanat, jotka ovat harvinaisia, ja lopuksi toinen kysely, jolla löydetään yleisiä sanoja Draculasta, mutta yhdistetään vastakkaiseen suuntaan. Näet kyselyt pian, kun näytän testilaitteen koodin.

Seuraavassa on ensimmäisten testiajojen tulokset. Ensimmäisessä ajassa molemmissa taulukon muuttujissa on ensisijaiset avaimet, ja toisessa ne ovat molemmat kasoja, vain sen selvittämiseksi, liioittelenko ongelmia, jos hakemistoa ei ilmoiteta taulukon muuttujassa. Lopuksi suoritamme samat kyselyt väliaikaisilla taulukoilla. Kaikki testit suoritettiin tarkoituksella hitaalla kehityspalvelimella havainnollistamista varten; saat hyvin erilaisia tuloksia tuotantopalvelimen kanssa.

Tulokset osoittavat, että kun taulukon muuttujat ovat kasoja, sinulla on riski, että kysely toimii kymmenen minuuttia eikä 100 millisekuntia. Nämä ovat loistava esimerkki kamala suorituskyvystä, jonka voit kokea, jos et tunne sääntöjä. Vaikka käytämme ensisijaisia avaimia, käsittelemiemme rivien lukumäärä tarkoittaa sitä, että väliaikaisten taulukkojen käyttö on nyt kaksinkertaista.

En aio syventää näiden takana olevia toteutussuunnitelmia. suorituskykymittareita, paitsi antaa muutama laaja selitys tärkeimmistä eroista. Lämpötilataulukoiden kyselyjä varten optimoija, joka on täysin tietoinen kardinaalisuudesta ja ensisijaisten avainten rajoituksista saatavista metatiedoista, valitsee tehokkaan Yhdistä liittyminen -operaattorin liittämistoiminnon suorittamiseksi.Ensisijaisilla avaimilla varustetun taulukon muuttujan optimoija tietää liittymissarakkeen rivien järjestyksen ja että ne eivät sisällä kaksoiskappaleita, mutta olettaa, että se käsittelee vain yhtä riviä ja valitsee sen sijaan sisäkkäisten silmukoiden liittymisen. Tässä se skannaa yhden taulukon ja suorittaa sitten jokaiselle palautetulle riville toisen taulukon yksittäiset hakutoiminnot. Tämä on vähemmän tehokasta, mitä isommat tietojoukot ovat, ja se on erityisen huono tapauksissa, joissa se skannaa taulukon muuttujaa CommonWords, koska se johtaa yli 60 000 hakemukseen Dracula taulukon muuttuja. Sisäkkäisten silmukoiden liittyminen saavuttaa ”huipputehokkuuden” kahdelle kymmenen minuutin kyselylle taulukon muuttujien kasoilla, koska se edellyttää tuhansia taulukon skannauksia CommonWords. Mielenkiintoista on, että ”Draculan yleiset sanat” -kyselyt toimivat paljon paremmin, ja tämä johtuu siitä, että optimoija valitsi näille kahdelle Hash Match -liittymän.

Kaiken kaikkiaan temp-taulukot näyttävät olevan paras valinta , mutta emme ole vielä valmiit! Lisätään OPTION (RECOMPILE) -vihje kyselyihin, jotka käyttävät taulukon muuttujia ensisijaisilla avaimilla, ja Suorita näiden kyselyjen testit ja alkuperäiset kyselyt väliaikaisilla taulukoilla. Jätämme toistaiseksi huonot kasat pois.

Kuten näette, väliaikaisen taulukon suorituskykyetu katoaa. Oikeat rivilaskelmat ja järjestetyt syötteet optimoija valitsee paljon tehokkaamman Yhdistä liittyminen.

Mitä tapahtuisi, jos antaisit niille köyhille kasoille OPTION (RECOMPILE) vihje myös? Lo, tarina muuttuu heille niin, että kaikki kolme ajoitusta ovat paljon lähempänä.

Kiinnostavaa on, että kaksi ”Draculan yleistä sanaa” kysyvät olivat nopeasti jopa kasoilla ovat nyt paljon hitaampia. Oikeilla riviluvuilla varustettuna optimoija muuttaa strategiaansa, mutta koska sillä ei ole vielä mitään hyödyllisiä metatietoja, kun määritämme rajoituksia ja avaimia, se tekee huonon valinnan. Se skannaa kasan CommonWords ja yrittää sitten ”osittaista aggregaatiota” arvioiden, että se kootaan 60 000 rivistä muutamaan sataan. Se ei tiedä, että kaksoiskappaleita ei ole, joten itse asiassa se ei koota lainkaan alaspäin, ja yhdistäminen ja sitä seuraava liittyminen vuotavat tempdb: hen.

Testilaite

Huomaa, että tämä on testilaite lopullisessa muodossaan näyttää suunnilleen samanlaisen suorituskyvyn kolmelle erityyppiselle taulukolle. Sinun on poistettava OPTION (RECOMPILE) -vihjeet palataksesi alkuperäiseen.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136

>

137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189

KÄYTÄ PhilFactoria;
– luo työtaulukko, jossa on kaikki Draculan sanat
DECLARE @WordsInDracula TABLE
(sana VARCHAR ( 40) EI NULL ENSISIJAISTA AVAINKESKUSTELUA);
INSERT INTO @WordsInDracula (sana) VALITSE WordsInDracula.word DROM dbo.WordsInDracula;
– luo toinen työtaulukko, jossa on kaikki yleisimmät sanat
DECLARE @CommonWords TABLE
(sana VARCHAR ( 40) EI NULL ENSISIJAISTA AVAINKESKUSTELUA);
INSERT INTO @CommonWords (sana) VALITSE commonwords.word FROM dbo.commonwords;
– luo ajoitusloki
DECLARE @log TABLE
(TheOrder INT IDENTITY (1, 1),
WhatHappened VARCHAR (200),
WhenItDid DATETIME2 DEFAULT GetDate ());
—- ajoituksen alku (ei ilmoitettu)
INSERT INTO @log (WhatHappened) SELECT ”Start_ My_Section_of_code”;
– paikka alussa
————— koodiosa taulukon muuttujien avulla
– koodin ensimmäinen ajastettu osa taulukon muuttujia käyttäen
SELECT Count (*) AS
FROM @CommonWords AS c
VASEN ULKOINEN LIITTYMINEN @WordsInDracula AS d
ON d.word = c.word
Missä d.word ON NULL
VAIHTOEHTO (SUOSITTELU);
INSERT INTO @log (WhatHappened)
SELECT ”yhteiset sanat, jotka eivät ole Draculassa: Molemmat taulukon muuttujat ensisijaisilla avaimilla”;
– jonne haluamasi rutiini päättyy
– Toinen ajastettu koodiosa taulukon muuttujien avulla
SELECT Count (*) AS
LÄHETTÄJÄ @CommonWords AS c
VASEN ULKOINEN LIITTYMINEN @WordsInDracula AS d
ON d.word = c.word
Missä d.sana EI OLE NULL
VAIHTOEHTO (SUOSITTELU);
INSERT INTO @log (WhatHappened)
SELECT ”yleiset sanat Draculassa: Molemmat taulukon muuttujat ensisijaisilla avaimilla”;
– jonne haluamasi rutiini päättyy
– kolmas ajastettu koodiosio taulukon muuttujia käyttämällä
SELECT Count (*) AS
LÄHETTÄJÄ @WordsInDracula AS d
VASEN ULKOINEN LIITTYMINEN @CommonWords AS c
ON d.word = c.word
WHERE c.word IS NULL
OPTION (SUOSITTELU);
INSERT INTO @log (WhatHappened)
SELECT ”epätavalliset sanat Draculassa: Molemmat taulukon muuttujat ensisijaisilla avaimilla”;
– jonne haluamasi rutiini päättyy
– viimeinen ajastettu koodiosio taulukon muuttujien avulla
SELECT Count (*) AS
LÄHETTÄJÄ @WordsInDracula AS d
VASEN ULKOINEN LIITTYMINEN @CommonWords AS c
ON d.word = c.word
Missä c.sana EI OLE NULL
VAIHTOEHTO (SUOSITTELU);
INSERT INTO @log (WhatHappened)
SELECT ”yleisempiä sanoja Draculassa: Molemmat taulukon muuttujat ensisijaisilla avaimilla”;
– missä haluamasi rutiini päättyy
————— koodiosa käyttämällä kasan muuttujat
ILMOITA @WordsInDraculaHeap TAULUKKO (sana VARCHAR (40) EI NULL);
INSERT INTO @WordsInDraculaHeap (sana) SELECT WordsInDracula.word DROM.boysWordsInDracula;
ILMOITTAA @CommonWordsHeap TAULUKKO (sana VARCHAR (40) EI NULL);
INSERT INTO @CommonWordsHeap (sana) VALITSE commonwords.word FROM dbo.commonwords;
INSERT INTO @log (WhatHappened) VALITSE ”Test Rig Setup”;
– jonne haluamasi rutiini päättyy
– ensimmäinen ajastettu koodiosa kasamuuttujien avulla
SELECT Count (*) AS
LÄHETTÄJÄ @CommonWordsHeap AS c
VASEN ULKOINEN LIITTYMINEN @WordsInDraculaHeap AS d
ON d.word = c.word
Missä d.word on NULL
VAIHTOEHTO (SUOSITTELU);
INSERT INTO @log (WhatHappened) SELECT ”yleiset sanat, jotka eivät ole Draculassa: Molemmat kasat”;
– jonne haluamasi rutiini päättyy
– toinen ajastettu koodiosa kasan muuttujien avulla
SELECT Count (*) AS
LÄHETTÄJÄ @CommonWordsHeap AS c
VASEN ULKOINEN LIITTYMINEN @WordsInDraculaHeap AS d
ON d.word = c.word
Missä d.sana EI OLE NULL
VAIHTOEHTO (SUOSITTELU);
INSERT INTO @log (WhatHappened) SELECT ”yleiset sanat Draculassa: molemmat kasat”;
– jonne haluamasi rutiini päättyy
– kolmas ajastettu koodiosa kasamuuttujien avulla
SELECT Count (*) AS
LÄHETTÄJÄ @WordsInDraculaHeap AS d
VASEN OUTER JOIN @CommonWordsHeap AS c
ON d.word = c.word
WHERE c.word IS NULL
OPTION (SUOSITTELU);
INSERT INTO @log (WhatHappened) SELECT ”epätavalliset sanat Draculassa: molemmat kasat”;
– jonne haluamasi rutiini päättyy
– viimeinen ajastettu koodiosa kasan muuttujien avulla
SELECT Count (*) AS
LÄHETTÄJÄ @WordsInDraculaHeap AS d
VASEN OUTER JOIN @CommonWordsHeap AS c
ON d.word = c.word
Missä c.sana EI OLE NULL
VAIHTOEHTO (SUOSITTELU);
INSERT INTO @log (WhatHappened) SELECT ”yleiset sanat Draculassa: molemmat kasat”;
– missä ajoitettu rutiini päättyy
————— koodiosa käyttämällä Väliaikaiset taulukot
LUO TAULUKKO #WordsInDracula (sana VARCHAR (40) EI NULL PRIMARY KEY);
INSERT INTO #WordsInDracula (sana) VALITSE WordsInDracula.word FROM dbo.WordsInDracula;
LUO TAULUKKO #CommonWords (sana VARCHAR (40) EI NULL PRIMARY KEY);
INSERT INTO #CommonWords (sana) Valitse commonwords.word FROM dbo.commonwords;
INSERT INTO @log (WhatHappened) SELECT ”Temp Table Test Rig Setup”;
– jonne haluamasi rutiini päättyy
– ensimmäinen ajastettu koodiosa käyttämällä väliaikaisia taulukoita
SELECT Count (*) AS
FROM #CommonWords AS c
VASEN ULKOINEN LIITTYMINEN #WordsInDracula AS d
ON d.word = c.word
Missä d.sana on NULL;
INSERT INTO @log (WhatHappened) SELECT ”yleiset sanat, jotka eivät ole Draculassa: Molemmat lämpötilataulukot”;
– jonne haluamasi rutiini päättyy
– Toinen ajastettu koodiosa käyttämällä väliaikaisia taulukoita
SELECT Count (*) AS
FROM #CommonWords AS c
VASEN ULKOINEN LIITTYMINEN #WordsInDracula AS d
ON d.word = c.word
Missä d.sana EI OLE NULL;
INSERT INTO @log (WhatHappened) SELECT ”yleiset sanat Draculassa: Molemmat lämpötaulukot”;
– jonne haluamasi rutiini päättyy
– kolmas ajastettu koodiosa käyttämällä väliaikaisia taulukoita
SELECT Count (*) AS
FROM #WordsInDracula AS d
VASEN ULKOINEN LIITTYMINEN #CommonWords AS c
ON d.word = c.word
Missä c.sana on tyhjä;
INSERT INTO @log (WhatHappened) SELECT ”epätavalliset sanat Draculassa: Molemmat lämpötilataulukot”;
– missä haluamasi rutiini päättyy
– viimeinen ajastettu koodiosa käyttämällä väliaikaisia taulukoita
SELECT Count (*) AS
FROM #WordsInDracula AS d
VASEN ULKOINEN LIITTYMINEN #CommonWords AS c
ON d.word = c.word
Missä c.sana EI NULL;
INSERT INTO @log (WhatHappened) SELECT ”yleiset sanat Draculassa: Molemmat lämpötilataulukot”; – missä haluamasi rutiini päättyy
DROP TABLE #WordsInDracula;
PUDOTUSTAULUKKO #CommonWords;
SELECT päättyy.WhatHappened AS,
DateDiff (ms, alkaa.WhenItDid, päättyy.WhenItDid) AS
FROM @log AS alkaa
INNER JOIN @log AS päättyy
ON päättyy.TheOrder = alkaa.TheOrder + 1;
– listaa kaikki ajoitukset

Listaus 2

Johtopäätökset

Taulukon muuttujien käytössä ei ole mitään holtittomia. Ne antavat paremman suorituskyvyn, kun niitä käytetään tarkoituksiin, joihin ne on tarkoitettu, ja he tekevät oman moppauksensa. Tietyssä vaiheessa kompromisseista, jotka antavat heille paremman suorituskyvyn (ei käynnistää uudelleenkääntämistä, ei toimiteta tilastoja, ei palautusta, ei rinnakkaisuutta), tulee heidän kaatumisensa.

Usein SQL Server -asiantuntija antaa neuvoja tuloksen koko, joka aiheuttaa ongelmia taulukon muuttujalle. Tulokset, jotka olen osoittanut sinulle tässä artikkelissa, viittaavat sinulle, että tämä yksinkertaistaa asioita liikaa. On kaksi tärkeää tekijää: jos tulos on yli, sanokaamme, 1000 riviä (ja tämä luku riippuu kontekstista), sinulla on oltava PRIMARY KEY tai UNIQUE -näppäin kyselyille, jotka liittyvät taulukon muuttujaan. Tietyssä vaiheessa joudut myös käynnistämään uudelleenkääntämisen saadaksesi kunnollisen suoritussuunnitelman, jolla on oma yleiskustannuksensa.

Silloinkin suorituskyky voi kärsiä pahasti, varsinkin jos suoritat monimutkaisempaa käsittelyä. , koska optimoijalla ei ole vieläkään pääsyä tilastoihin, joten ei tietoa minkään kysely predikaatin valikoivuudesta. Tällaisissa tapauksissa sinun on vaihdettava väliaikaisten taulukkojen käyttöön.

Lisätietoja

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *