|
|
Yayınlandı 28.05.2020 10:52:28
|
|
|
|

Geçici tablolar Sqlserver veritabanında çok önemlidir ve aşağıda SQL veritabanında geçici tabloların özellikleri ve kullanımı hakkında ayrıntılı bir giriş verilmektedir; yalnızca referans için sunulmaktadır.
Geçici tablolar kalıcı tablolara benzer, ancak geçici tablolar tempdb'de saklanır ve artık kullanılmadıklarında otomatik olarak silinir. İki tür geçici tablo vardır: yerel ve küresel. İsimleri, görünürlüğü ve erişilebilirlikleriyle ayrılırlar.
Geçici tablo aşağıdaki özelliklere sahiptir:
- Yerel geçici tablolar, kullanıcıların tablo oluştururken "#" önekini eklediği ve veritabanı bağlantılarına göre bağımsız olan tablolardır. Sadece yerel geçici tabloyu oluşturan veritabanı bağlantısı tabloya erişebilir, diğer bağlantılar ise tabloya erişemez.
- Farklı veritabanı bağlantılarında, oluşturulan yerel geçici tablolar aynı "isme" sahip olsa da, bu tabloların birbirleriyle herhangi bir ilişkisi yoktur. SQLSERVER'da, özel bir adlandırma mekanizması veritabanı bağlantılarındaki yerel geçici tabloların bağımsızlığını sağlar.
- Gerçek geçici tablolar, veritabanı sistemi tarafından otomatik olarak korunan veritabanı geçici tablo alanından faydalanır ve böylece tablo alanı tasarrufu sağlar. Ve geçici tablo alanı genellikle sanal bellek kullandığı için, sabit diskteki giriş/işletim sayısı büyük ölçüde azalır, bu yüzden sistem verimliliği de artar.
- Geçici tablo, işlem veya oturum bittikten sonra otomatik olarak boşaltır, bu yüzden veri bittikten sonra verileri silmeyi hatırlamanıza gerek kalmaz.
Yerel geçici masalar
Yerel geçici tablonun adı, tek bir sayısal sembol (#) ile öneklenir; Yalnızca mevcut kullanıcı bağlantısına (yani yerel geçici tabloyu oluşturan bağlantı) görünürler; Bir kullanıcı SQL Server örneğinden bağlantıyı kopardığında silinir.
Örneğin, veritabanı bağlantısında aşağıdaki ifadeyle yerel geçici bir tablo oluştururuz: #Temp
Veritabanı Bağlantısı 1:
Sonra veritabanı bağlantısı 2'yi aynı anda başlatarak sorgu #temp
Veritabanı Bağlantısı 2:
Veritabanı bağlantısı 2'nin sonucu ne olur bakalım?
Veritabanı Bağlantısı 2:
Sonuçlar, veritabanı bağlantısı 2'nin tablo #Temp'yi bulamadığını gösteriyor. Bu, geçici tablo #Temp'nin yalnızca onu oluşturan veritabanı bağlantısı 1'e görünür olduğu, veritabanı bağlantısı 2'ye ise görünmediği anlamına gelir.
Küresel geçici tablo
Küresel geçici tablonun adı, iki sayısal sembol (##) ile ön eklenir ve oluşturulduğunda herhangi bir veritabanı bağlantısına görünürdür; tabloya atıfta bulunan tüm veritabanı bağlantıları SQL Server'dan kopduğunda kaldırılır.
Örneğin, aşağıdaki ifadeyle bir veritabanı bağlantısında küresel geçici tablo ##Temp oluşturuyoruz ve ardından üç satır veri ekliyoruz
Veritabanı Bağlantısı 1:
Sonra veritabanı bağlantısı 2'de ##Temp的数据 sorguluyoruz
Veritabanı Bağlantısı 2:
Veritabanı bağlantısı 2 sonucu aşağıdaki gibidir
Veritabanı Bağlantısı 2:
Gördüğünüz gibi, veritabanı bağlantısı 2, veritabanı bağlantısı 1 tarafından oluşturulan küresel geçici tablo ##Temp'a başarıyla erişebiliyor, ancak veri bağlantısı 1'i kapatıp veritabanı bağlantısı 2'nin ##Temp查询语句会发生什么呢'sini çalıştırırsak? Sonuçlar şu şekildedir:
Veritabanı bağlantısı 1'i kapatın, ardından veritabanı bağlantısı 2 tekrar çalıştırılır:
Veritabanı bağlantısı 1'i kapattıktan sonra, veritabanı bağlantısı 2'nin küresel geçici tablo ##Temp了'yi bulamadığını bulduk. Bunun nedeni, veritabanı bağlantısı 1 kapandıktan sonra, veritabanı bağlantısı 2'de geçici tablo ##Temp'yi kullanan bir ifade olmamasıdır; bu nedenle sqlserver, şu anda küresel geçici tablo ##Temp了'a referans veren bir veritabanı bağlantısı olmadığını düşünür ve bu yüzden ##Temp释放掉了 olur.
Sonra, veritabanı bağlantısı 2'de küresel geçici tablo ##Temp持有事务中的排他锁 (X-lock) kapatmaya ve ardından veritabanı bağlantısı 1'i kapatmaya çalışıyoruz.
Veritabanı Bağlantısı 1:
Veritabanı Bağlantısı 2:
Veritabanı bağlantısı 1'i kapatın, ardından veritabanı bağlantısı 2 şu şekilde çalıştırılır:
Sonuç gösteriyor ki, veritabanı bağlantısı 1'i kapatsak da, veritabanı bağlantısı 2, işlem içinde küresel geçici tablo ##Temp的排他锁 (X kilidi) olan geçici tablo ##Temp并没有随着数据库连接1的关闭而被释放掉 tutuyordu, veritabanı bağlantısı 2'de başlayan işlem geri alınmadığı veya bağlanmadığı sürece, veritabanı bağlantısı 2 her zaman geçici tablo ##Temp的排他锁'yi tutacaktır. Şu anda Sqlserver, küresel geçici tablo ##Temp'a atıfta bulunan bir veritabanı bağlantısı olduğunu düşünecek, yani ##Temp不会被释放掉. |
Önceki:TypeScript property accessor (set,get)Önümüzdeki:SQL Server, mevcut sistem zamanının önceki günlerini sorgular
|