Redgate Hub (Suomi)

Väliaikaiset taulukot ovat juuri sitä. Niitä käytetään useimmiten välitulosten työtilan tarjoamiseen, kun tietoja käsitellään erässä tai menettelyssä. Niitä käytetään myös taulukon välittämiseen taulukkoarvoisesta funktiosta, taulukkopohjaisen datan välittämiseen tallennettujen toimintojen välillä tai viime aikoina taulukkoarvoisten parametrien muodossa, kokonaisten vain luku -taulukoiden lähettämiseen sovelluksista SQL Server -rutiineihin tai välitä vain luku -tilassa olevat väliaikaiset taulukot parametreina. Kun käyttö on valmis, ne hävitetään automaattisesti.

Ennen kuin perehdymme liian syvälle tekniikkaan, suosittelen, että käytät taulukon muuttujia aina kun mahdollista. Ne ovat helppoja, ja SQL Server tekee työn puolestasi. Ne aiheuttavat myös vähemmän ongelmia ahkealle OLTP-järjestelmälle. Joskus saatat joutua hienosäätämään niitä saadaksesi hyvän suorituskyvyn liittymisissä, mutta selitän sen hetken kuluttua. Jos kuitenkin käsittelet monimutkaisempaa tilapäistä dataa tai todennäköisesti käytät enemmän kuin kohtuullisen pieniä niissä olevat tietomäärät, paikalliset väliaikaiset taulukot ovat todennäköisesti parempi valinta.

Taulukon muuttujat

Taulukon muuttujia käytetään sen rutiinin tai erän puitteissa, jossa ne ovat määritelty, ja ne luotiin alun perin tekemään taulukkoon arvostetut toiminnot mahdolliseksi. Ne ovat kuitenkin hyviä moniin käyttötarkoituksiin, joihin perinteinen väliaikainen taulukko laitettiin. He käyttäytyvät kuten muut muuttujat laajennussäännöissään. Kun ne ovat soveltamisalan ulkopuolella, ne hävitetään. Näiden kanssa on paljon helpompaa työskennellä ja ne ovat melko turvallisia, ja ne aiheuttavat myös vähemmän uudelleenkääntämistä rutiineissa, joissa niitä käytetään, kuin jos käyttäisit väliaikaisia taulukoita. Taulukon muuttujat vaativat vähemmän lukitusresursseja, koska ne ovat ”yksityisiä” niitä luoneelle prosessille. Tapahtumien palautukset eivät vaikuta niihin, koska taulukkomuuttujien soveltamisala on rajallinen, eivätkä ne ole osa pysyvää tietokantaa, joten ne ovat käteviä luomaan tai tallentamaan tietoja, joiden pitäisi selviytyä selaussivuista, kuten lokimerkinnöistä. Taulukon muuttujien haittapuoli on, että ne hävitetään usein ennen kuin voit tutkia niiden sisällön virheenkorjauksen tai käyttää niitä kokeilemaan erilaisia SQL-lausekkeita vuorovaikutteisesti.

Jos sovelluksesi on konservatiivinen ja tietomäärät sytyttävät sinut En koskaan halua mitään muuta. Voit kuitenkin törmätä ongelmiin. Yksi vaikeus on, että taulukkomuuttujiin voidaan viitata vain niiden paikallisessa laajuudessa, joten et voi käsitellä niitä dynaamisen SQL: n avulla, kuten saatat tehdä väliaikaisen taulukon tai taulukon arvoisen parametrin kanssa. Tämä johtuu siitä, että et voi viitata ulkoisesti määriteltyyn taulukon muuttujaan dynaamisessa SQL: ssä, jonka suoritat sitten EXEC-käskyn tai tallennetun sp_ExecuteSQL -prosessin kautta, koska dynaaminen SQL suoritetaan laajuuden ulkopuolella taulukon muuttujan arvosta. Voit tietysti luoda ja käyttää sitten taulukon muuttujaa dynaamisen SQL: n sisällä, koska taulukon muuttuja olisi soveltamisalassa. Kuitenkin, kun dynaaminen SQL on suoritettu, taulukon muuttujaa ei olisi.

Myös muutama poikkeama on otettava huomioon. Et voi esimerkiksi muuttaa taulukon määritelmää ensimmäisen DECLARE-käskyn jälkeen. SQL Server 2000: ssa taulukon muuttuja ei voi olla SELECT INTO -lausekkeen tai INSERT EXEC (nyt korjattu) kohde; Et voi soittaa käyttäjän määrittelemiä toimintoja taulukon muuttujan TARKISTA rajoitukset, oletusarvot ja lasketut sarakkeet -kohdasta. Ainoat rajoitukset, jotka sallitaan TARKISTA-rajoitusten ulkopuolella, ovat PRIMARY KEY, UNIQUE KEY ja NULL / NOT NULL

Vaikeimmat ongelmat kuitenkin johtavat taulukoiden koon kasvamiseen, koska ennen SQL Server 2016: ta , et voinut ilmoittaa hakemistoa yksiselitteisesti, eikä UNIQUE- ja PRIMARY KEY -rajoituksia pakottaneissa hakemistoissa ollut yllä jakeluhakemistoja. Nyt voit luoda tiettyjä hakemistotyyppejä taulukon määritelmän mukaisesti, mutta niiden jakautumistilastoja ei silti ylläpidetä. Kyselyn optimoija olettaa, että taulukossa on vain yksi rivi. Et myöskään voi luoda rinnakkaisia kyselysuunnitelmia SQL-lausekkeelle, joka muuttaa taulukon sisältöä. Voit kiertää osittain hakemistorajoituksen käyttämällä rajoituksia saman asian tekemiseen. Tärkein on ensisijaisen avaimen rajoitus, jonka avulla voit asettaa klusteroidun indeksin, mutta ainutlaatuiset rajoitukset ovat hyödyllisiä suorituskyvyn kannalta. Kyselyn optimoija käyttää niitä mielellään, jos ne ovat lähellä.

Taulukon muuttujien suurin ongelma on, että tilastoja ei ylläpidetä sarakkeissa. Tämä tarkoittaa, että kyselyn optimoijan on arvattava tietojen koko ja jakauma, ja jos se menee pieleen, huomaat, että liittymien suorituskyky on huono: Jos näin tapahtuu, muuta on vähän. kuin palata käyttämään perinteisiä paikallisia väliaikaisia taulukoita. SQL Server 2019: stä alkaen Microsoft esitteli uuden ominaisuuden nimeltä Table Variable Deferred Compilation, joka ratkaisee tämän ongelman. Jos haluat lisätietoja, lue tämä artikkeli Greg Larsenilta.

Jos et käytä SQL Server 2019: tä, voit yrittää lisätä OPTION (RECOMPILE) -lausekkeeseen lauseen, joka sisältää taulukon muuttujan yhdistämisen muihin taulukoihin. Näin tekemällä SQL Server pystyy havaitsemaan rivien määrän uudelleen käännettäessä, koska rivit on jo täytetty. Tämä ei ratkaise ongelmaa kokonaan, koska optimoijalla ei edelleenkään ole jakelutilastoja, ja se voi yleensä tuottaa huonon suunnitelman yleensä silloin, kun jakelu on vinossa. Tässä esittelyssä liittymistä vähennettiin ajassa kolmella neljänneksellä yksinkertaisesti lisäämällä OPTION (RECOMPILE)

Jos voit tehdä taulukoihin liittyvistä asioista ainutlaatuisia, voit käyttää näissä ensisijaisen avaimen rajoitusta taulukoita. Tämä antoi optimoijalle mahdollisuuden käyttää klusteroitua hakemistohakua taulukon skannauksen sijaan, ja suoritusaika oli liian nopea mittaamaan

Aloita taulukon muuttujista, mutta palaa takaisin paikallisten väliaikaisten taulukoiden käyttämiseen, jos kohtaat suorituskykyongelmia. Jotkut ihmiset ovat tarpeeksi rohkeita antamaan neuvoja taulukon rivien lukumäärän suhteen, ja olen nähnyt 100 tai 1000 tarjoavan enimmäismäärän; mutta olen nähnyt paljon suurempien taulukon muuttujien toimivan täysin tyydyttävästi ajan myötä, ja paljon pienemmät aiheuttavat ongelmia. Pienemmissä taulukoissa ongelma on kuitenkin vähemmän havaittavissa!

Taulukkoarvotut parametrit

Taulukkoarvotut parametrit (TVP) ovat erityyppisiä taulukon muuttujia, jotka laajentavat sen käyttöä. Kun taulukon muuttujat välitetään parametreina, taulukko materialisoituu TempDB-järjestelmätietokantaan taulukon muuttujana ja välitetään viitteenä, osoitin TempDB: n taulukkoon.

Taulukkoarvoisia parametreja on käytetty jo SQL Server 2008 lähettää useita tietorivejä Transact-SQL-rutiinille tai erälle sp_ExecuteSQL kautta. Niiden erityinen arvo ohjelmoijalle on, että niitä voidaan käyttää TSQL-koodissa sekä asiakassovelluksessa, joten ne sopivat hyvin asiakastaulukoiden lähettämiseen palvelimelle. TSQL: stä voit ilmoittaa taulukkoarvoiset muuttujat, lisätä niihin tietoja ja välittää nämä muuttujat taulukkoarvoisina parametreina tallennettuihin menettelyihin ja toimintoihin, ja niiden yleistä hyödyllisyyttä rajoittaa se, että ne välitetään vain vain luku -muodossa. Et voi tehdä UPDATE, DELETE tai INSERT lauseita taulukkoarvolla parametri rutiinin rungossa.

Sinun on luotava käyttäjän määrittämä taulukotyyppi ja määritettävä taulukon rakenne niiden käyttöä varten. Tässä on yksinkertainen esimerkki niiden käytöstä TSQL: ssä

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

/ * Sinun on ensin luotava taulukko tyyppi. * /
LUO TYYPPINIMET TAULUKKOON
(Nimi VARCHAR (10));
GO
/ * Seuraavaksi luo menettely tietojen vastaanottamiseksi taulukon arvoiselle parametrille, nimitaulukolle ja valitse yksi kohde taulukosta * /
LUO MENETTELY ChooseAName
@CandidateNames Nimet VALMIS
AS
ILMOITA @candidates TAULUKKO (NIMI VARCHAR (10),
theOrder UNIQUEIDENTIFIER)
INSERT INTO @candidates (name, theorder)
SELECT name, NEWID ()
FROM @CandidateNames
VALITSE YKSI 1
NIMI
@ ehdokkaista
TILAA TILAUS >
/ * Ilmoita muuttuja, joka viittaa lehmäluettelomme tyyppiin. * /
ILMOITA @MyFavouriteCowName AS -nimet;
/ * Lisää tietoja taulukon muuttujaan. * /
INSERT INTO @MyFavouriteCowName (Name)
SELECT ”Bossy” UNION SELECT ”Bessy” UNION SELECT ”terälehti” UNION SELECT ”Daisy” UNION SELECT ”Lulu” UNION SELECT ” Buttercup ”UNION SELECT” Bertha ”UNION SELECT” Bubba ”UNION SELECT” Beauregard ”UNION SELECT” Brunhilde ”UNION SELECT” Lore ”UNION SELECT” Lotte ”UNION SELECT” Rosa ”UNION SELECT” Thilde ”UNION SELECT” Lisa ”UNION SELECT” Peppo ”UNION SELECT” Maxi ”UNION SELECT” Moriz ”UNION SELECT” Marla ”
/ * Siirrä taulukko, jossa on luettelo lehmien perinteisistä nemeistä, tallennettuun menettelyyn. * /
EXEC selectAName @MyFavouriteCowName
GO

Kuten taulukon muuttujien kohdalla, taulukon arvoinen parametri lakkaa olemasta, kun se on ulkopuolella, mutta tyypin määrittely pysyy, kunnes se nimenomaisesti pudotetaan.Kuten taulukon muuttujat, he eivät hanki lukituksia, kun tiedot täytetään asiakkaalta, eikä tilastoja ylläpidetä taulukon arvoisten parametrien sarakkeissa. Et voi käyttää taulukon arvoista parametria SELECT INTO – tai INSERT EXEC -lausekkeen kohteena. Kuten voit odottaa, taulukon arvoinen parametri voi olla FROM -lausekkeessa SELECT INTO tai INSERT EXEC merkkijono tai tallennustapa.

TVP ratkaisee yleisen ongelman, joka koskee paikallisen muuttujan siirtämistä dynaamiseen SQL: ään, jonka sitten suorittaa sp_ExecuteSQL. Microsoft on dokumentoinut sen huonosti, joten näytän sinulle toimivan esimerkin aloittaaksesi

Ennen kuin siirrymme kuvaamaan perinteisempiä väliaikaisia taulukoita ja niiden käyttöä, meidän on perehdyttävä paikka, jossa tilapäisiä pöytiä pidetään. TempDB.

TempDB

Väliaikaiset taulukot ja taulukon muuttujat luodaan TempDB-tietokantaan, joka on oikeastaan vain yksi tietokanta, jolla on yksinkertainen palautus: TempDB: n avulla vain riittävä minimaalinen kirjaus tehdään sallia palautus ja muut ACID-herkut. TempDB: n erityinen ero on, että kaikki objektit, kuten taulukot, tyhjennetään käynnistyksen yhteydessä. Koska TempDB käyttää aina yksinkertaista palautusmallia, suoritettu tapahtuma tyhjennetään seuraavan TempDB-tarkistuspisteen lokilokista ja vain aktiiviset tapahtumat säilytetään. Tämä kaikki tarkoittaa, että väliaikaiset taulukot käyttäytyvät kuten mikä tahansa muu perustaulukko siinä, että ne kirjataan ja tallennetaan aivan kuten ne. Käytännössä väliaikaiset taulukot pysyvät todennäköisesti välimuistissa muistissa, mutta vain, jos niitä käytetään usein: sama kuin perustaulukkojen kanssa. TempDB käyttää järjestelmää, jota kutsutaan väliaikaiseksi objektin uudelleenkäytöksi, joka tallentaa osan väliaikaisista kohteista suunnitelman kanssa, jos muistia on riittävästi. Tämä saattaa selittää legendan, jonka mukaan väliaikaiset objektit ovat vain muistissa. Totuus on aina ”se riippuu …”.

Paljon muuta tapahtuu TempDB: ssä: Tietokantamoottori voi käyttää sitä työtaulukoiden sijoittamiseen DBCC-tarkistuksiin, hakemistojen, kohdistimien luomiseen tai uudelleenrakentamiseen. esimerkiksi. Välitaulukot kyselyissä, jotka kuvataan nimellä ”hajautus”, ”lajittelu” ja ”taustat”, toteutuvat esimerkiksi TempDB: ssä yhdessä niiden kanssa, joita tarvitaan useille ”fyysisille” operaatioille SQL-lauseiden suorittamisessa. Sitä käytetään myös versiotallennuksena Snapshot-eristykseen, useita aktiivisia tulosjoukkoja (MARS), triggereitä ja online-index-buildia varten.

Koska väliaikaiset taulukot tallennetaan aivan kuten perustaulukot, niitä on yksi tai kaksi. asioista, joista sinun on oltava varovaisia. Sinulla on esimerkiksi oltava CREATE TABLE -oikeus TempDB: ssä normaalin taulukon luomiseksi. Voit säästää ongelmia ongelman määrittämällä oletusarvoisesti DBO (db-omistaja) -roolille, mutta sinun on ehkä tehtävä se nimenomaisesti käyttäjille, joille ei ole määritetty DBO-roolia. Kaikilla käyttäjillä on käyttöoikeudet luoda paikallisia tai globaaleja väliaikaisia taulukoita TempDB: ssä, koska tämä on osoitettu heille GUEST -käyttäjän suojauskontekstin kautta.

Klassinen väliaikainen taulukko tulee sisään kaksi makua, yleinen tai jaettava väliaikainen taulukko, jonka etuliite on ”##”, ja paikallinen väliaikainen taulukko, jonka nimessä on etuliite ”#”. Paikalliset väliaikaiset taulukot ovat vähemmän kuin tavalliset taulukot kuin yleiset väliaikaiset taulukot: ei voi luoda näkemyksiä heille tai liittää niihin laukaisimia. On vähän hankala selvittää mikä prosessi, istunto tai menettely loi ne. Annamme sinulle hieman apua tässä myöhemmin. Mikä tärkeintä, ne ovat turvallisempia kuin yleinen väliaikainen taulukko, koska vain omistajaprosessi näkee sen.

Toinen paikallisen väliaikaisen taulukon (ja paikallisen väliaikaisesti tallennetun menettelyn) omituisuus on se, että sillä on eri nimi metatiedoissa siihen, jonka annat rutiinissasi tai eräsi. Jos sama rutiini suoritetaan samanaikaisesti useilla prosesseilla, tietokantamoottorin on kyettävä erottamaan eri prosessien luomat paikallisesti nimetyt paikalliset taulukot. Se tekee tämän lisäämällä numeerisen merkkijonon jokaiseen paikallisen taulukon nimeen, jotka on jätetty alleviivattuina. Vaikka määrität lyhyen nimen, kuten #MyTempTable, TempDB: hen tosiasiallisesti tallennetut tiedot koostuvat CREATE TABLE -lausekkeessa määritetystä taulukon nimestä. ja pääte. Tämän jälkiliitteen vuoksi paikallisten väliaikaisten taulukoiden nimien on oltava enintään 116 merkkiä.

Jos haluat nähdä, mitä tapahtuu, voit tarkastella TempDB: n taulukoita samalla tavalla kuin mitä tahansa muuta pöytä. Voit jopa käyttää sp_help -työtä väliaikaisissa taulukoissa vain, jos kutsut ne TempDB: stä.

1
2
3

KÄYTÄ TempDB
go
suorita sp_Help #mytemp

tai voit löytää ne TempDB: n järjestelmänäkymistä ilman tietokantoja.

1

VALITSE nimi, luo päivämäärä TEMPDB.sys.tables-taulukosta MISSÄ nimi LIKE ”#%”

Tai tietojärjestelmä

1

VALITSE * FRO M TempDB.information_schema.tables

Vielä parempi, voit selvittää mikä prosessi ja käyttäjä pitävät kiinni valtavista väliaikaisista taulukoista TempDB: ssä ja kieltäytyvät luovuttamasta tilaa

Et voi käyttää käyttäjän määrittelemiä tietotyyppejä väliaikaisissa taulukoissa, ellei tietotyyppejä ole TempDB: ssä; eli ellei tietotyyppejä ole nimenomaisesti luotu.

TempDB: n käyttäjätaulukot

Normaalissa käytössä luot väliaikaisia taulukoita tai taulukon muuttujia ajattelematta sitä liian syvällisesti. On kuitenkin mielenkiintoista, että TempDB on siellä kaikenlaista hiekkalaatikkotoimintaa varten. Voit luoda tavallisia pohjataulukoita, näkymiä tai mitä tahansa muuta mitä haluat. Voit luoda skeemejä, tallennettuja toimintoja ja niin edelleen. Et todennäköisesti halua tehdä tätä, mutta se on varmasti mahdollista, koska TempDB on vain yksi tietokanta. Minun on vain käynnistettävä SQL Server-kehitykseni uudelleen todistettuani tämän itselleni asentamalla AdventureWorksin siihen. Tämä tarkoittaa, että TempDB: hen on mahdollista luoda perustaulukko, eräänlainen ..er… väliaikainen pysyvä taulukko. Toisin kuin yleinen väliaikainen pöytä, joudut tekemään itse kaikki talosi siivouksesi: olet yksin. Sama pätee rutiiniin. Tämän tekemisen etuna on, että tekemäsi käsittely käyttää TempDB: n yksinkertaista palautusta, joten jos epäonnistut mopilla, SQL Server toimii äitinä seuraavassa käynnistyksessä: vaikka tämä saattaa kestää hyvin kauan. Seuraava vaihe on saada niin sanottu ”pysyvä väliaikainen” pöytä. Tässä taulukossa data itsessään on epävakaa, kun palvelin käynnistetään uudelleen, mutta itse taulukko jatkuu. Todennäköisesti yleisin tapa luoda pysyvä väliaikainen taulukko on luoda globaali väliaikainen taulukko käynnistettäessä uudelleen. Tämä voidaan tehdä automaattisesti, kun kaikki tietokannat on palautettu ja ”Palautus on valmis” -viesti kirjataan. Vaikka tämä onkin ”globaali väliaikainen”, sitä ei poisteta, kun kaikki sitä käyttävät yhteydet ovat kadonneet, koska sitä ajava prosessi ei koskaan katoa. Epäilemättä on parempi luoda tällainen työtaulukko sitä käyttävään tietokantaan, mutta jos käytät täydellistä palautusta, väliaikainen työ pysyy lokissa. Voit tietysti luoda vain tavallisen taulukko TempDB: ssä. Voit luoda nämä pysyvät taulukot käynnistyksen yhteydessä määrittelemällä pääkäyttäjälle tallennetun menettelyn, joka luo yleisen väliaikaisen taulukon.

Miksi käyttää tällaista hybriditaulukkoa? On esimerkiksi luku tekniikoita taulukkojen välittämiseksi menettelyjen välillä pysyvien taulukoiden kautta moniprosessin turvallisella tavalla, jotta tietojenkäsittely voidaan suorittaa sarjana. Näitä kutsutaan prosessiavaimellisiin taulukoihin (katso Kuinka jakaa tietoja tallennettujen menettelyjen välillä : Prosessiavaintaulukko Erland Sommarskog ). Ne nostavat aluksi minkä tahansa maustetun DBA: n kulmakarvat, mutta ne ovat tehokas ja turvallinen ratkaisu monivuotiseen ongelmaan, kun ne tehdään oikein.

Väliaikaisten pöytien lisäksi on myös useita taulukotyyppejä jotka eivät ole suoraan johdettuja perustaulukoista, kuten väärennetyt taulukot ja johdetut taulukot: jotkut näistä ovat niin ohimeneviä, että niitä pidetään parhaiten lyhytaikaisina eikä väliaikaisina. CTE käyttää lyhytaikaisia taulukoita, jotka ovat ”inline” tai ”johdettuja” ja joita ei toteuteta. BOL viittaa niihin ”väliaikaisiin nimettyihin tulosjoukoihin”. Ne ovat olemassa vain lausekkeen puitteissa. CTE: ssä heillä on etu johdettuihin taulukoihin verrattuna, koska niitä voidaan käyttää useammin kuin kerran.

Paikallinen väliaikainen taulukko

Paikallisella väliaikaisella taulukolla (nimet alkavat #), mikä hupun alla tapahtuu, on yllättävän samanlainen kuin taulukon muuttujat. Kuten Taulukon muuttujat, Paikalliset väliaikaiset taulukot ovat yksityisiä prosessille, joka loi ne. Siksi niitä ei voida käyttää näkymissä, etkä voi liittää laukaisimia niihin.

Ne ovat kätevämpiä kuin taulukon muuttujat, jos haluat käyttää SELECT INTO niiden luomiseen, mutta olen hieman varovainen SELECT INTO järjestelmässä, joka todennäköisesti vaatii muutoksia, luon mieluummin väliaikaiset taulukot nimenomaisesti kaikkien tarvittavien rajoitusten kanssa.

Et voi helposti kertoa, mikä istunto tai menettely on luotu. nämä taulukot. Tämä johtuu siitä, että jos sama tallennettu menettely suoritetaan samanaikaisesti useilla prosesseilla, tietokantamoottorin on kyettävä erottamaan samat taulukot, jotka eri prosessit ovat luoneet. Tietokantamoottori tekee tämän liittämällä sisäisesti vasemmanpuoleisen pehmustetun numeerisen loppuliitteen jokaisen paikallisen väliaikaisen taulukon nimeen. TempDB: n sys.objects-näkymään tallennetun väliaikaisen taulukon koko nimi koostuu CREATE TABLE -lausekkeessa määritetystä taulukon nimestä ja järjestelmän luomasta numeerisesta jälkiliitteestä. Jälkiliitteen sallimiseksi paikalliselle väliaikaiselle nimelle määritetyn taulukon nimen on oltava alle 116 merkkiä.

Siivous tapahtuu paikallisten väliaikaisten taulukoiden avulla. ne pudotetaan automaattisesti, kun ne poistuvat soveltamisalasta, ellei niitä nimenomaisesti pudoteta käyttämällä DROP TABLE. Niiden laajuus on anteliaampi kuin taulukon muuttuja, joten sinulla ei ole vaikeuksia viitata niihin erissä tai dynaamisessa SQL: ssä. Paikalliset väliaikaiset taulukot pudotetaan automaattisesti nykyisen istunnon tai menettelyn lopussa. Sen pudottaminen sen luoneen menettelyn lopussa voi aiheuttaa naarmuja: paikallinen väliaikainen taulukko, joka on luotu tallennetun menettelyn tai istunnon aikana, pudotetaan, kun se on valmis, joten siihen ei voida viitata prosessissa, joka kutsui tallennettua menettelyä loi taulukon. Siihen voi kuitenkin viitata kaikki sisäkkäiset tallennetut menettelyt, jotka suoritetaan taulukon luoneen tallennetun menettelyn avulla. Jos sisäkkäinen menettely viittaa väliaikaiseen taulukkoon ja kaksi väliaikaista taulukkoa, joilla on sama nimi, on tuolloin olemassa, mikä taulukko on kysely ratkaistu?

Uteliaisuutena voit myös luoda paikallisia väliaikaisia tallennettuja toimintoja sama laajuus ja käyttöikä kuin paikallinen väliaikainen taulukko. Et voi tehdä samaa muille rutiineille.

Yleiset väliaikaiset taulukot.

Kuten paikalliset väliaikaiset taulukot, myös yleiset väliaikaiset taulukot (ne alkavat ##) pudotetaan automaattisesti, kun taulukon luonut istunto päättyy: Koska yleiset taulukot eivät ole yksityisiä sen luoneelle prosessille, niiden on jatkuttava sen jälkeen, kunnes viimeinen Transact-SQL-käsky, joka viittasi aktiivisesti taulukkoon luomisistunnon päättymisajankohtana, on suoritettu loppuun ja lukot pudotetaan. Kuka tahansa, jolla on pääsy TempDB: hen silloin, kun nämä yleiset väliaikaiset taulukot ovat olemassa, voi suoraan kysyä, muokata tai pudottaa näitä väliaikaisia objekteja.

Voit liittää sääntöjä, oletusarvoja ja hakemistoja väliaikaisiin taulukoihin, mutta et voi luoda näkymiä väliaikaisissa pöydissä tai liittää niihin triggereitä. Voit käyttää käyttäjän määrittelemää tietotyyppiä väliaikaisen taulukon luomisessa vain, jos tietotyyppi on olemassa TempDB: ssä.

Tallennetut menettelyt voivat viitata väliaikaisiin taulukoihin, jotka on luotu nykyisen istunnon aikana. Tallennetussa menettelyssä et voi luoda väliaikaista taulukkoa, pudottaa sitä ja luoda uuden väliaikaisen taulukon samalla nimellä.

Vaikka tämä toimii …

… tämä ei ole t

1
2
3
4
5
6
7
8
9
10
11
12

LUE MENETTELY VäärinkäyttäytyminenWithTemporaryTables AS: n kanssa
LUO taulukko #Väri (
Värivaihtoehto (10) ENSIMMÄINEN avain)
INSERT INTO #väri Valitse ”Punainen” UNION VALITSE ”Valkoinen”
UNION SELECT ”vihreä ”UNION SELECT” Keltainen ”UNION SELECT” sininen ”
PUDOTUSTAULUKKO #väri
Luo taulukko #Väri (
Värivarchar (10) ENSIMMÄINEN avain)
INSERT INTO #color SELECT ”Punainen” UNION SELECT ”Valkoinen”
UNION SELECT ”vihreä ”UNION SELECT” Keltainen ”UNION SELECT” sininen ”
PUDOTUSTAULUKKO #väri
go

Voit paikallisia väliaikaisia taulukoita käyttämällä tahattomasti pakottaa uudelleen kääntämisen tallennettuun menettelyyn aina, kun sitä käytetään. Tämä ei ole hyvä, koska tallennettu menettely ei todennäköisesti toimi hyvin. Välttääksesi uudelleen kääntämisen, vältä viittaamista kutsuvan tai kutsutun tallennetun menettelyn avulla luotuun väliaikaiseen taulukkoon: Jos et pysty tekemään niin, laita viite merkkijonoon, joka suoritetaan sitten EXECUTE -lauseke tai sp_ExecuteSQL -toiminto. Varmista myös, että väliaikainen taulukko on luotu tallennettuun menettelyyn tai käynnistimeen, ennen kuin siihen viitataan ja pudotetaan näiden viitteiden jälkeen.Älä luo väliaikaista taulukkoa vuonohjauksen käskyssä, kuten IF... ELSE tai WHILE.

Sinulla on oikeus luoda maailmanlaajuisia väliaikaisia tallennustapoja, mutta en ole vielä löytänyt niiden käyttöä. Globaalit väliaikaiset toiminnot eivät ole sallittuja.

Johtopäätökset

Ole varovainen millä tahansa jaetulla leikkikentällä. Tätä lukiessasi olet huomannut, että TempDB: ssä tapahtuu paljon toimintaa, ja voit aiheuttaa tuhoa koko SQL Serverille käyttämällä pitkään käynnissä olevia prosesseja, jotka täyttävät väliaikaiset taulukot riippumatta siitä, mitkä ne ovat, tarpeettomilla määrillä tiedot. Itse asiassa olen antanut sinulle vihjeitä tässä artikkelissa siitä, kuinka todella, todella, järkyttää DBA: tasi käyttämällä arvokasta jaettua resurssia, TempDB: tä. (Vanhoina aikoina ennen vuotta 2005, SELECT INTO: n käyttäminen valtavan pöydän kanssa oli loistava V-ase (Vergeltungswaffe).

Olen aina varovainen tarjoamalla yli- yleisiä neuvoja, mutta pidän aina parempana tietokannoissani taulukon muuttujien ja TVP: n käyttämisestä aina kun mahdollista. Ne vaativat vähemmän resursseja, ja et todennäköisesti pidä niistä kiinni, kun olet valmis heidän kanssaan. Haluan käyttää niitä maksimaalisesti , sarakkeiden ja taulukoiden tarkastuksilla ja rajoituksilla. Saatat löytää hetkiä, jolloin höyry loppuu, varsinkin kun pöydän koot kasvavat. Tällaisissa tapauksissa tai joissa ei ole käytännöllistä käyttää taulukon muuttujia niiden rajoitetun laajuuden vuoksi, niin Käytän paikallisia väliaikaisia pöytiä. Se vie paljon puristettuja huulia ja päätä ravistelemalla, ennen kuin hyväksyn yleisen väliaikaisen pöydän tai pysyvän väliaikaisen pöydän. Heillä on muutama kelvollinen ja täysin kohtuullinen käyttö, mutta ne luottavat ohjelmoija tekemään tarvittavat taloudenhoito

Vastaa

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