SQL Server'da yerel ve global geçici tablolar


156

SQL Server'daki yerel ve genel geçici tablolar arasındaki fark nedir?


2
İşte
bununla

5
Tablo değişkenlerini kullanırken dikkatli olun. Bunları bir sorguda kullanırsanız, dizine eklenmediği için sorgu planınızda ciddi performans sorunlarına yol açabilirler.

Aslında geçici tablolar gerekirse dizine eklenebilir, ancak bu da zaman ve kaynak gerektirir, dolayısıyla yine de performans veya kaynak sorunlarına neden olabilir.
Andrew Steitz

Yanıtlar:


114

Bu açıklamayı oldukça net buluyorum ( Technet'in saf kopyası ):

İki tür geçici tablo vardır: yerel ve küresel. Yerel geçici tablolar, tabloların ilk oluşturulduğu veya başvurulduğu zamanla aynı SQL Server örneğiyle bağlantı sırasında yalnızca yaratıcıları tarafından görülebilir. Yerel geçici tablolar, kullanıcının SQL Server örneğiyle bağlantısı kesildikten sonra silinir. Genel geçici tablolar oluşturulduktan sonra herhangi bir kullanıcı ve herhangi bir bağlantı tarafından görülebilir ve tabloya başvuran tüm kullanıcıların SQL Server örneğiyle bağlantısı kesildiğinde silinir.


Harika, yardımcı cevap! Global temp tabloları otomatik olarak SQL Server tarafından temizlenir eğer / ne zaman hakkında özel bilgi arıyordu.
kwill

Çok açık ve özlü bir cevap. Küresel temp tabloları için iyi bir kullanım durumu düşünen var mı? Yerel geçici tabloların amacının aksine amaçlarını gösteren bir tane mi?
Trevor

336
  • Tablo değişkenleri ( DECLARE @t TABLE) yalnızca onu oluşturan bağlantı tarafından görülebilir ve toplu iş veya saklı yordam sona erdiğinde silinir.

  • Yerel geçici tablolar ( CREATE TABLE #t) yalnızca onu oluşturan bağlantı tarafından görülebilir ve bağlantı kapatıldığında silinir.

  • Genel geçici tablolar ( CREATE TABLE ##t) herkes tarafından görülebilir ve bunlara başvuran tüm bağlantılar kapatıldığında silinir.

  • Tempdb kalıcı tabloları ( USE tempdb CREATE TABLE t) herkes tarafından görülebilir ve sunucu yeniden başlatıldığında silinir.


55
Ayrıca belirtilmesi gerekir: Yerel geçici tablolar, onları oluşturan kapsam kapatıldığında silinir. Yani, bir sproc içinde yerel bir geçici tablo oluşturursanız ve daha sonra bu sproc dışında erişmeye çalışırsanız - mevcut olmaz.

Will için +1. Bir optimize edici olarak yerel bir geçici tablo kullanmaya çalışıyordum ve saklı bir yordam "oluşturma ve varsa yok" başlatıcısı olarak kullanmaya çalışıyordu. Söylediğiniz gibi, bunun yerine genel bir geçici tablo kullanmazsanız çalışmaz.
quillbreaker

9
"kendilerine atıfta bulunan tüm bağlantılar kapatıldığında silinir" - "onlara atıfta bulunan" tam olarak ne anlama gelir? Bir bağlantı # 1'den bir StoredProc bir ## TempTable oluşturursa, başka bir bağlantı # 2'den 10 dakika sonra olduğunu görebilir miyim (bu bağlantı # 2 tablo oluşturma zamanında etkinse?) YANIT: Genel geçici tablolar tabloyu oluşturan oturum sona erer ve diğer tüm görevler bunlara başvurmayı durdurur. (bu sayfada daha farklı cevaplara bakınız)
tbone

Sonraki mantık için gerekli yerel geçici tablolar (#t) oluşturmak için saklı bir yordam kullanarak denedim, ancak üst saklı yordam onları saklı yordam çağrıları kullanılabilir olması için bunları oluşturmak zorunda çıktı. Bu üzücü bir şeydi, çünkü tabloları aynı şekilde ayarlayıp ortak sprocları çağırmak zorunda olan bir sürü saklı prosedürümüz var. Çocuk çağrılarının bir kardeş tarafından oluşturulan tablolara erişimi olan bu durumda genel geçici tablolar çalışır mı? SQL Server 2008 kullanıyoruz.
Brandon

1
@Brandon Çok haklısın. Eksik işlevsellik yok. TSQL'in geçici verilerin doğru bir şekilde kapsamlandırılması desteği oldukça kabataslaktır. Dil tasarımcıları her şeyin küresel olmasını istiyormuş gibi. Ve kapanışlara neredeyse hiç destek yok. Bir imleç değişkeni iletebilirsiniz. Ama bu başka bir solucan olabilir çünkü sıra sıra acı veren sıra gitmek için bir yol değildir.
Anthony Faull

12

1.) Yerel geçici bir tablo yalnızca bir bağlantının süresi boyunca veya bir bileşik ifadesinde tanımlanırsa, bileşik ifadesinin süresi boyunca mevcuttur.

Yerel geçici tablolar, yalnızca tabloları oluşturan SQL Server oturumu veya bağlantısı (tek kullanıcı anlamına gelir) tarafından kullanılabilir. Tabloları oluşturan oturum kapatıldığında bunlar otomatik olarak silinir. Yerel geçici tablo adı tek kare ("#") işaretiyle görüntülenir.

CREATE TABLE #LocalTemp
(
 UserID int,
 Name varchar(50), 
 Address varchar(150)
)
GO
insert into #LocalTemp values ( 1, 'Name','Address');
GO
Select * from #LocalTemp

Yerel geçici tablonun kapsamı, geçerli sorgu penceresindeki geçerli kullanıcının geçerli oturumunda mevcuttur. Geçerli sorgu penceresini kapatırsanız veya yeni bir sorgu penceresi açarsanız ve yukarıda oluşturulan geçici tabloyu bulmaya çalışırsanız, hata verir.


2.) Genel bir geçici tablo veritabanında kalıcı olarak kalır, ancak satırlar yalnızca belirli bir bağlantıda bulunur. Bağlantı kapatıldığında, genel geçici tablodaki veriler kaybolur. Ancak, bir dahaki sefere veritabanı açıldığında tablo tanımı erişim için veritabanında kalır.

Genel geçici tablolar tüm SQL Server oturumları veya bağlantıları için kullanılabilir (tüm kullanıcı anlamına gelir). Bunlar herhangi bir SQL Server bağlantısı kullanıcısı tarafından oluşturulabilir ve tüm SQL Server bağlantıları kapatıldığında bunlar otomatik olarak silinir. Genel geçici tablo adı çift karma ("##") işareti ile işaretlenir.

CREATE TABLE ##GlobalTemp
(
 UserID int,
 Name varchar(50), 
 Address varchar(150)
)
GO
insert into ##GlobalTemp values ( 1, 'Name','Address');
GO
Select * from ##GlobalTemp

Genel geçici tablolar tüm SQL Server bağlantıları için görünürken, yerel geçici tablolar yalnızca geçerli SQL Server bağlantısı tarafından görülebilir.


2
Genel geçici tablo tanımınızı (diğer DB'lerden gelen) davranmasını beklediğiniz nasıl olduğunu, ancak benim test SQL Server'da gerçekte ne olduğunu gösterir: "Tabloyu oluşturan oturum zaman genel geçici tablolar otomatik olarak bırakılır biter ve diğer tüm görevler onları referans durdurmak "
Nickolay

11

Çevrimiçi Kitaplardan Alıntı:

Yerel geçici tablolar yalnızca geçerli oturumda görünür; genel geçici tablolar tüm oturumlar tarafından görülebilir.

Geçici tablolar, DROP TABLE kullanılarak açıkça düşürülmedikçe kapsam dışına çıktıklarında otomatik olarak bırakılır:

  • Saklı yordamda oluşturulan bir yerel geçici tablo, saklı yordam tamamlandığında otomatik olarak bırakılır. Tablo, tabloyu oluşturan saklı yordam tarafından yürütülen herhangi bir iç içe saklı yordam tarafından başvurulabilir. Tabloya, tabloyu oluşturan saklı yordam adı verilen işlem tarafından başvuru yapılamaz.
  • Diğer tüm yerel geçici tablolar, geçerli oturumun sonunda otomatik olarak bırakılır.
  • Genel geçici tablolar, tabloyu oluşturan oturum sona erdiğinde ve diğer tüm görevler bunlara başvurmayı durdurduğunda otomatik olarak bırakılır. Bir görev ve tablo arasındaki ilişki yalnızca tek bir Transact-SQL deyiminin ömrü boyunca korunur. Bu, oluşturma oturumu sona erdiğinde etkin olarak tabloya başvuran son Transact-SQL deyiminin tamamlanmasında genel bir geçici tablonun bırakıldığı anlamına gelir.

0

Yerel geçici tablolar : yerel geçici tablolar oluşturup başka bir bağlantı açar ve sorguyu denerseniz, aşağıdaki hatayı alırsınız.

geçici tablolara yalnızca bunları oluşturan oturumda erişilebilir.

Genel geçici tablolar : Bazen, diğer bağlantılara erişilebilen geçici bir tablo oluşturmak isteyebilirsiniz. Bu durumda, genel geçici tabloları kullanabilirsiniz.

Genel geçici tablolar, yalnızca ilgili tüm oturumlar kapatıldığında yok edilir.


0

Ayrıca şunu da belirtmek gerekir: veritabanı kapsamındaki genel geçici tablolar (şu anda yalnızca Azure SQL Veritabanı tarafından desteklenmektedir).

(## tablo adı ile başlatılan) SQL Server için Küresel geçici tablolar tempdb saklanır ve tüm SQL Server örneği genelinde tüm kullanıcıların oturumları arasında paylaştı.

Azure SQL Veritabanı, tempdb'de depolanan ve veritabanı düzeyine dahil edilen genel geçici tabloları destekler. Bu, genel geçici tabloların aynı Azure SQL Veritabanı'ndaki tüm kullanıcıların oturumları için paylaşıldığı anlamına gelir. Diğer veritabanlarındaki kullanıcı oturumları genel geçici tablolara erişemez.

-- Session A creates a global temp table ##test in Azure SQL Database testdb1
-- and adds 1 row
CREATE TABLE ##test ( a int, b int);
INSERT INTO ##test values (1,1);

-- Session B connects to Azure SQL Database testdb1 
-- and can access table ##test created by session A
SELECT * FROM ##test
---Results
1,1

-- Session C connects to another database in Azure SQL Database testdb2 
-- and wants to access ##test created in testdb1.
-- This select fails due to the database scope for the global temp tables 
SELECT * FROM ##test
---Results
Msg 208, Level 16, State 0, Line 1
Invalid object name '##test'

ALTER VERİTABANI KAPSAMLI YAPILANDIRMA

GLOBAL_TEMPORARY_TABLE_AUTODROP = { ON | OFF }

UYGULAMALAR: Azure SQL Veritabanı (özellik genel önizlemede)

Genel geçici tablolar için otomatik bırakma işlevinin ayarlanmasına izin verir. Varsayılan AÇIK, yani herhangi bir oturum tarafından kullanılmadığında genel geçici tabloların otomatik olarak bırakıldığı anlamına gelir. KAPALI olarak ayarlandığında, genel geçici tabloların DROP TABLE ifadesi kullanılarak açıkça bırakılması veya sunucunun yeniden başlatılmasında otomatik olarak bırakılması gerekir.

Azure SQL Veritabanı tek veritabanları ve elastik havuzlar ile bu seçenek, SQL Veritabanı sunucusunun bireysel kullanıcı veritabanlarında ayarlanabilir. SQL Server ve Azure SQL Veritabanı yönetilen örneğinde, bu seçenek TempDB'de ayarlanır ve tek tek kullanıcı veritabanlarının ayarının hiçbir etkisi yoktur.


0

Kullanıcılara Global Temp tablosunu nerede bulabileceğimizi gösteren hiçbir yanıt görmedim. SSMS içinde gezinirken Yerel ve Global geçici tabloları aynı konumda görüntüleyebilirsiniz. Aşağıdaki ekran görüntüsü bu bağlantıdan alınmıştır .

Veritabanları -> Sistem Veritabanları -> tempdb -> Geçici Tablolar

resim açıklamasını buraya girin

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.