Pagaidu tabulas ir ļoti svarīgas Sqlserver datu bāzē, un tālāk ir sniegts detalizēts ievads par pagaidu tabulu īpašībām un izmantošanu SQL datu bāzē, tikai atsaucei.
Pagaidu tabulas ir līdzīgas pastāvīgajām tabulām, bet pagaidu tabulas tiek glabātas tempdb un tiek automātiski izdzēstas, kad tās vairs netiek izmantotas. Ir divu veidu pagaidu tabulas: lokālās un globālās. Tie atšķiras pēc nosaukuma, redzamības un pieejamības.
Pagaidu tabulai ir šādas īpašības:
- Vietējās pagaidu tabulas ir tabulas, kurām lietotāji pievieno prefiksu "#", veidojot tabulas, kas ir neatkarīgas atbilstoši datu bāzes savienojumiem. Tikai datu bāzes savienojumam, kas izveidoja lokālo pagaidu tabulu, ir piekļuve tabulai, un citi savienojumi nevar piekļūt tabulai.
- Dažādos datu bāzes savienojumos, lai gan izveidotajām vietējām pagaidu tabulām ir vienāds "nosaukums", šīm tabulām nav nekādas saistības viena ar otru. SQLSERVER īpašs nosaukumu piešķiršanas mehānisms nodrošina vietējo pagaidu tabulu neatkarību datu bāzes savienojumos.
- Patiesas pagaidu tabulas izmanto datu bāzes pagaidu tabulu vietu, ko automātiski uztur datu bāzes sistēma, tādējādi ietaupot vietu tabulā. Un tā kā pagaidu galda vieta parasti izmanto virtuālo atmiņu, I/O skaits cietajā diskā ir ievērojami samazināts, tāpēc tiek uzlabota arī sistēmas efektivitāte.
- Pagaidu tabula tiek automātiski iztukšota pēc transakcijas vai sesijas beigām, tāpēc jums nav jāatceras izdzēst datus pēc tā beigām.
Vietējās pagaidu tabulas
Vietējās pagaidu tabulas nosaukumam ir viens ciparu simbols (#); Tie ir redzami tikai pašreizējam lietotāja savienojumam (t.i., savienojumam, kas izveido lokālo pagaidu tabulu); Tas tiek izdzēsts, kad lietotājs atvienojas no SQL Server instances.
Piemēram, mēs izveidojam vietējo pagaidu tabulu datu bāzes savienojumā ar šādu paziņojumu: #Temp
Datu bāzes savienojums 1:
Pēc tam vienlaikus sāciet datu bāzes savienojumu 2, lai veiktu vaicājuma #temp
Datu bāzes savienojums 2:
Redzēsim, kāds ir 2. datu bāzes savienojuma rezultāts?
Datu bāzes savienojums 2:
Rezultāti rāda, ka datu bāzes savienojums 2 nevar atrast tabulas #Temp. Tas nozīmē, ka pagaidu tabulas #Temp ir redzama tikai datu bāzes savienojumam 1, kas to izveidoja, bet ne datu bāzes savienojumam 2.
Globālā pagaidu tabula
Globālās pagaidu tabulas nosaukumam ir divi ciparu simboli (##), un tas ir redzams visiem datu bāzes savienojumiem, kad tas ir izveidots, un tiek noņemts, kad visi datu bāzes savienojumi, kas atsaucas uz tabulu, tiek atvienoti no SQL Server.
Piemēram, mēs izveidojam globālu pagaidu tabulu ##Temp datu bāzes savienojumā ar šādu priekšrakstu un pēc tam ievietojam trīs datu rindas
Datu bāzes savienojums 1:
Tad mēs vaicājam ##Temp的数据 datu bāzes savienojumā 2
Datu bāzes savienojums 2:
Datu bāzes savienojuma 2 rezultāts ir šāds
Datu bāzes savienojums 2:
Kā redzat, datu bāzes savienojums 2 var veiksmīgi piekļūt globālajai temp tabulai ##Temp, kas izveidota ar datu bāzes savienojumu 1, bet, ja mēs tagad aizveram datu savienojumu 1 un pēc tam izpildām datu bāzes savienojuma ##Temp查询语句会发生什么呢 2? Rezultāti ir šādi:
Aizveriet 1. datu bāzes savienojumu, un pēc tam vēlreiz tiek izpildīts 2. datu bāzes savienojums:
Mēs konstatējām, ka pēc 1. datu bāzes savienojuma aizvēršanas 2. datu bāzes savienojums nevar atrast globālo pagaidu tabulu ##Temp了. Tas ir tāpēc, ka pēc datu bāzes savienojuma 1 slēgšanas datu bāzes savienojumā 2 nav paziņojuma, kas izmanto pagaidu tabulu ##Temp, tāpēc sqlserver domā, ka šobrīd nav datu bāzes savienojuma, kas atsaucas uz globālo pagaidu tabulu ##Temp了, tāpēc tas būs ##Temp释放掉了.
Pēc tam mēs mēģinām aizvērt globālo temp tabulu ##Temp持有事务中的排他锁 (X-lock) datu bāzes savienojumā 2 un pēc tam aizvērt datu bāzes savienojumu 1.
Datu bāzes savienojums 1:
Datu bāzes savienojums 2:
Aizveriet 1. datu bāzes savienojumu, un pēc tam tiek izpildīts 2. datu bāzes savienojums:
Rezultāts parāda, ka, lai gan mēs aizveram datu bāzes savienojumu 1, jo datu bāzes savienojums 2 darījumā ir turējis globālo pagaidu tabulu ##Temp的排他锁 (X bloķēšana), pagaidu tabula # #Temp并没有随着数据库连接1的关闭而被释放掉, kamēr darījums, kas sākts datu bāzes savienojumā 2, netiek atcelts vai apstiprināts, tad datu bāzes savienojums 2 vienmēr turēs pagaidu tabulu ##Temp的排他锁. Šobrīd Sqlserver domās, ka joprojām ir datu bāzes savienojums, kas atsaucas uz globālo temp tabulu ##Temp, tātad ##Temp不会被释放掉. |