Tento článek je zrcadlovým článkem o strojovém překladu, klikněte zde pro přechod na původní článek.

Pohled: 11952|Odpověď: 0

[Zdroj] Podrobné vysvětlení dočasných tabulek v databázích SQL serveru

[Kopírovat odkaz]
Zveřejněno 28.05.2020 10:52:28 | | | |
Dočasné tabulky jsou v databázi Sqlserver velmi důležité a následuje podrobný úvod do charakteristik a využití dočasných tabulek v SQL databázi, pouze pro referenci.

Dočasné tabulky jsou podobné trvalým tabulkám, ale dočasné tabulky jsou uloženy v tempdb a automaticky se mažou, když již nejsou používány. Existují dva typy dočasných tabulek: lokální a globální. Jsou odlišeni jménem, viditelností a dostupností.

Dočasná tabulka má následující charakteristiky:

  • Lokální dočasné tabulky jsou tabulky, do kterých uživatelé přidávají předponu "#" při vytváření tabulek, které jsou nezávislé podle propojení s databází. Pouze databázové připojení, které vytvořilo lokální dočasnou tabulku, má přístup k tabulce a ostatní připojení k tabulce nemají přístup.
  • V různých databázových připojeních, i když mají vytvořené lokální dočasné tabulky stejný "název", tyto tabulky mezi sebou nemají žádný vztah. V SQLSERVERu speciální mechanismus pojmenování zajišťuje nezávislost lokálních dočasných tabulek v databázových připojeních.
  • Skutečné dočasné tabulky využívají dočasný prostor v databázi, který je automaticky udržován databázovým systémem, čímž šetří místo v tabulce. A protože dočasný stolový prostor obvykle používá virtuální paměť, počet vstupů/výstupů na pevném disku je výrazně snížen, což zvyšuje i efektivitu systému.
  • Dočasná tabulka se automaticky vyprázdní po skončení transakce nebo relace, takže nemusíte pamatovat na smazání dat po jejich vyčerpání.


Místní dočasné tabulky

Název lokální dočasné tabulky je předponou jediného číselného symbolu (#); Jsou viditelné pouze pro aktuální uživatelské spojení (tj. spojení, které vytváří lokální dočasnou tabulku); Je smazána, když uživatel odpojí instanci SQL Serveru.

Například vytvoříme lokální dočasnou tabulku v databázovém spojení s následujícím příkazem: #Temp

Připojení k databázi 1:



Pak současně spustit databázové připojení 2, aby se prováděl dotazovací #temp

Připojení k databázi 2:



Podívejme se, jaký je výsledek připojení k databázi 2?

Připojení k databázi 2:



Výsledky ukazují, že připojení k databázi 2 nemůže najít tabulku #Temp. To znamená, že dočasný #Temp tabulky je viditelný pouze pro databázové spojení 1, které jej vytvořilo, ale ne pro databázové spojení 2.

Globální dočasná tabulka

Název globální dočasné tabulky je předponou dvou číselných symbolů (##) a je viditelný pro jakékoli databázové spojení při vytvoření, přičemž je odstraněn, když jsou všechna databázová spojení odkazující na tabulku odpojena od SQL Serveru.

Například vytvoříme globální dočasnou tabulku ##Temp v databázovém spojení s následujícím příkazem a poté vložíme tři řádky dat

Připojení k databázi 1:



Poté se dotazujeme na ##Temp的数据 v databázovém spojení 2

Připojení k databázi 2:



Výsledek připojení k databázi 2 je následující

Připojení k databázi 2:



Jak vidíte, připojení k databázi 2 může úspěšně přistupovat k globální dočasné tabulce ##Temp vytvořené připojením k databázi 1, ale pokud nyní uzavřeme datové spojení 1 a pak spustíme ##Temp查询语句会发生什么呢 připojení databáze 2? Výsledky jsou následující:

Uzavřete připojení k databázi 1 a poté se znovu spustí připojení k databázi 2:



Zjistili jsme, že po uzavření připojení k databázi 1 nemůže připojení 2 najít globální dočasnou tabulku ##Temp了. Je to proto, že po uzavření databázového připojení 1 není v databázovém spojení 2 žádný příkaz, který by používal dočasnou tabulku ##Temp, takže sqlserver si myslí, že v tuto chvíli neexistuje žádné databázové spojení odkazující na globální dočasnou tabulku ##Temp了, takže bude ##Temp释放掉了.


Dále se snažíme uzavřít globální dočasnou tabulku ##Temp持有事务中的排他锁 (X-lock) v databázovém připojení 2 a poté zavřít databázové připojení 1.

Připojení k databázi 1:



Připojení k databázi 2:



Uzavřete připojení k databázi 1 a poté se spustí připojení k databázi 2:



Výsledek ukazuje, že i když uzavřeme databázové spojení 1, protože databázové spojení 2 drželo v transakci globální dočasnou tabulku ##Temp的排他锁 (X zámek), dočasná tabulka # #Temp并没有随着数据库连接1的关闭而被释放掉, pokud transakce zahájená v databázovém připojení 2 není vrácena zpět nebo povázána, pak databázové spojení 2 vždy uchovává dočasnou tabulku ##Temp的排他锁. V tuto chvíli si Sqlserver bude myslet, že stále existuje databázové spojení odkazující na globální dočasnou tabulku ##Temp, tedy ##Temp不会被释放掉.




Předchozí:TypeScript vlastnostní accessor (set,get)
Další:SQL Server dotazuje na předchozí dny aktuálního systémového času
Zřeknutí se:
Veškerý software, programovací materiály nebo články publikované organizací Code Farmer Network slouží pouze k učení a výzkumu; Výše uvedený obsah nesmí být používán pro komerční ani nelegální účely, jinak nesou všechny důsledky uživatelé. Informace na tomto webu pocházejí z internetu a spory o autorská práva s tímto webem nesouvisí. Musíte výše uvedený obsah ze svého počítače zcela smazat do 24 hodin od stažení. Pokud se vám program líbí, podporujte prosím originální software, kupte si registraci a získejte lepší skutečné služby. Pokud dojde k jakémukoli porušení, kontaktujte nás prosím e-mailem.

Mail To:help@itsvse.com