Временните таблици са много важни в базата данни на Sqlserver, а по-долу е подробно въведение в характеристиките и употребата на временните таблици в SQL база данни, само за справка.
Временните таблици са подобни на постоянните, но временните таблици се съхраняват в tempdb и се изтриват автоматично, когато вече не се използват. Има два вида временни маси: локални и глобални. Те се отличават по име, видимост и наличност.
Временната таблица има следните характеристики:
- Локалните временни таблици са таблици, към които потребителите добавят префикса "#" при създаване на таблици, и които са независими според връзките с базата данни. Само базата данни, която е създала локалната временна таблица, има достъп до таблицата, а други връзки не могат да имат достъп до таблицата.
- При различни връзки с бази данни, въпреки че създадените локални временни таблици имат едно и също "име", тези таблици нямат никаква връзка помежду си. В SQLSERVER специален механизъм за именуване гарантира независимостта на локалните временни таблици в връзките към базата данни.
- Истинските временни таблици използват временното пространство в базата данни, което автоматично се поддържа от системата на базата данни, като по този начин спестява място в таблицата. И тъй като временното таблично пространство обикновено използва виртуална памет, броят на входно-изходните операции на твърдия диск е значително намален, така че ефективността на системата също се подобрява.
- Временната таблица се изпразва автоматично след края на транзакцията или сесията, така че не е нужно да забравяте да изтриете данните след като свършат.
Местни временни маси
Името на локалната временна таблица е с един числов символ (#); Те са видими само за текущата потребителска връзка (т.е. връзката, която създава локалната временна таблица); Той се изтрива, когато потребител се откъсне от SQL Server инстанция.
Например, създаваме локална временна таблица в база данни с следното твърдение: #Temp
Връзка с база данни 1:
След това стартирайте и връзката с базата данни 2 едновременно, за да изпълните заявката #temp
Връзка с база данни 2:
Нека видим какъв е резултатът от Database Connection 2?
Връзка с база данни 2:
Резултатите показват, че база данни 2 не може да намери таблица #Temp. Това означава, че временната таблица #Temp е видима само за базата данни 1, която я е създала, но не и за базата данни 2.
Глобална временна таблица
Името на глобална временна таблица е с префикс два числови символа (##) и е видимо за всяка база данни при създаване, като се премахва, когато всички връзки, свързани с таблицата, са изключени от SQL Server.
Например, създаваме глобална временна таблица ##Temp в база данни с следното изявление и след това вмъкваме три реда данни
Връзка с база данни 1:
След това правим заявка ##Temp的数据 в база данни 2
Връзка с база данни 2:
Резултатът за Database Connection 2 е следният
Връзка с база данни 2:
Както виждате, връзка към база данни 2 може успешно да достъпи глобалната временна таблица ##Temp, създадена от база данни връзка 1, но ако затворим връзка 1 сега и после изпълним ##Temp查询语句会发生什么呢 на база данни връзка 2? Резултатите са следните:
Затворете връзка с база данни 1 и след това връзката към базата данни 2 се изпълнява отново:
Открихме, че след затваряне на връзка база данни 1, база данни връзка 2 не може да намери глобалната временна таблица ##Temp了. Това е така, защото след като връзката към базата данни 1 е затворена, няма оператор в базата данни 2, който използва временната таблица ##Temp, така че SQL Server смята, че в момента няма връзка с базата данни, която да препраща към глобалната временна таблица ##Temp了, затова ще ##Temp释放掉了.
След това се опитваме да затворим глобалната временна таблица ##Temp持有事务中的排他锁 (X-заключване) в база данни връзка 2 и след това да затворим база данни връзка 1.
Връзка с база данни 1:
Връзка с база данни 2:
Затваряне на връзка база данни 1 и след това се изпълнява връзка към база данни 2:
Резултатът показва, че въпреки че затваряме връзка с база данни 1, тъй като връзка база данни 2 държи глобалната временна таблица ##Temp的排他锁 (X заключване) в транзакцията, временната таблица # #Temp并没有随着数据库连接1的关闭而被释放掉, докато транзакцията, започната в база данни връзка 2, не се върне назад или комитиране, тогава база данни връзка 2 винаги ще държи временната таблица ##Temp的排他锁. В момента Sqlserver ще мисли, че все още има връзка с база данни, която се отнася до глобалната временна таблица ##Temp, така че ##Temp不会被释放掉. |