Laikinosios lentelės yra labai svarbios Sqlserver duomenų bazėje, o toliau pateikiamas išsamus įvadas į laikinųjų lentelių charakteristikas ir naudojimą SQL duomenų bazėje.
Laikinosios lentelės yra panašios į nuolatines lenteles, tačiau laikinosios lentelės saugomos tempdb ir automatiškai panaikinamos, kai jos nebenaudojamos. Yra dviejų tipų laikinosios lentelės: vietinės ir pasaulinės. Jie išsiskiria pavadinimu, matomumu ir prieinamumu.
Laikinas stalas turi šias charakteristikas:
- Vietinės laikinosios lentelės yra lentelės, kurias vartotojai prideda "#" priešdėlį kurdami lenteles, kurios yra nepriklausomos pagal duomenų bazės ryšius. Tik duomenų bazės ryšys, sukūręs vietinę laikinąją lentelę, turi prieigą prie lentelės, o kiti ryšiai negali pasiekti lentelės.
- Skirtinguose duomenų bazių ryšiuose, nors sukurtos vietinės laikinos lentelės turi tą patį "pavadinimą", šios lentelės neturi jokio ryšio viena su kita. SQLSERVER specialus pavadinimų suteikimo mechanizmas užtikrina vietinių laikinų lentelių nepriklausomumą duomenų bazių ryšiuose.
- Tikros laikinos lentelės naudoja duomenų bazės laikiną lentelių erdvę, kurią automatiškai prižiūri duomenų bazės sistema, taip sutaupydama vietos lentelėje. Kadangi laikinoji stalo erdvė paprastai naudoja virtualią atmintį, I/O skaičius standžiajame diske labai sumažėja, todėl sistemos efektyvumas taip pat pagerėja.
- Laikinoji lentelė automatiškai ištuštinama pasibaigus operacijai ar seansui, todėl jums nereikia nepamiršti ištrinti duomenų, kai ji baigiasi.
Vietinės laikinosios lentelės
Vietinės laikinosios lentelės pavadinimas turi vieną skaitmeninį simbolį (#); Jie matomi tik dabartiniam vartotojo ryšiui (t. y. ryšiui, kuris sukuria vietinę laikinąją lentelę); Jis ištrinamas, kai vartotojas atsijungia nuo SQL serverio egzemplioriaus.
Pavyzdžiui, mes sukuriame vietinę laikiną lentelę duomenų bazės ryšyje su šiuo teiginiu: #Temp
1 duomenų bazės ryšys:
Tada tuo pačiu metu paleiskite duomenų bazės ryšį 2, kad atliktumėte užklausos #temp
2 duomenų bazės ryšys:
Pažiūrėkime, koks yra 2 duomenų bazės ryšio rezultatas?
2 duomenų bazės ryšys:
Rezultatai rodo, kad 2 duomenų bazės ryšys negali rasti lentelės #Temp. Tai reiškia, kad laikinoji lentelės #Temp matoma tik ją sukūrusiam duomenų bazės ryšiui 1, bet ne duomenų bazės ryšiui 2.
Visuotinė laikinoji lentelė
Visuotinės laikinosios lentelės pavadinimas yra su dviem skaitiniais simboliais (##) ir yra matomas visuose duomenų bazės ryšiuose, kai jis sukuriamas, ir pašalinamas, kai visi duomenų bazės ryšiai, nurodantys lentelę, atjungiami nuo SQL serverio.
Pavyzdžiui, duomenų bazės ryšyje sukuriame visuotinę laikiną lentelę ##Temp su šiuo teiginiu, tada įterpiame tris duomenų eilutes
1 duomenų bazės ryšys:
Tada mes užklausiame ##Temp的数据 2 duomenų bazės ryšyje
2 duomenų bazės ryšys:
Duomenų bazės ryšio 2 rezultatas yra toks
2 duomenų bazės ryšys:
Kaip matote, 2 duomenų bazės ryšys gali sėkmingai pasiekti visuotinę laikinąją lentelę ##Temp, sukurtą naudojant 1 duomenų bazės ryšį, bet jei dabar uždarysime 1 duomenų ryšį ir tada vykdysime 2 duomenų bazės ryšio ##Temp查询语句会发生什么呢? Rezultatai yra tokie:
Uždarykite 1 duomenų bazės ryšį, tada vėl vykdomas 2 duomenų bazės ryšys:
Nustatėme, kad uždarius 1 duomenų bazės ryšį, 2 duomenų bazės ryšys negali rasti visuotinės laikinos lentelės ##Temp了. Taip yra todėl, kad uždarius 1 duomenų bazės ryšį, 2 duomenų bazės ryšyje, naudojančiame laikinąją lentelę ##Temp, nėra jokio teiginio, todėl sqlserver mano, kad šiuo metu nėra duomenų bazės ryšio, nurodančio visuotinę laikiną lentelę ##Temp了, todėl jis bus ##Temp释放掉了.
Tada bandome uždaryti visuotinę laikinąją lentelę ##Temp持有事务中的排他锁 (X užraktas) 2 duomenų bazės ryšyje, tada uždaryti 1 duomenų bazės ryšį.
1 duomenų bazės ryšys:
2 duomenų bazės ryšys:
Uždarykite 1 duomenų bazės ryšį, tada vykdomas 2 duomenų bazės ryšys:
Rezultatas rodo, kad nors uždarome 1 duomenų bazės ryšį, nes 2 duomenų bazės ryšys operacijoje laikė visuotinę laikiną lentelę ##Temp的排他锁 (X užraktas), laikinoji lentelė # #Temp并没有随着数据库连接1的关闭而被释放掉, kol 2 duomenų bazės ryšyje pradėta operacija nėra atšaukta arba įvykdyta, tada 2 duomenų bazės ryšys visada laikys laikiną lentelę ##Temp的排他锁. Šiuo metu "Sqlserver" manys, kad vis dar yra duomenų bazės ryšys, nurodantis pasaulinę laikinąją lentelę ##Temp, taigi ##Temp不会被释放掉. |