ProgramlamaBackend geliştirici

SQL'de Geçici Tabloların (Temporary Tables) özellikleri nelerdir, nasıl doğru bir şekilde kullanılmalı ve Tablo Değişkenleri (Table Variables) ile farkı nedir?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap.

Geçici tablolar (Temporary Tables) ve tablo değişkenleri (Table Variables), bir sorgu veya prosedür çalışırken ara verileri saklamak için farklı mekanizmalardır.

Geçici Tablolar (örneğin, #TempTable MS SQL'de):

  • Geçici veritabanı olan tempdb'de saklanır.
  • Mevcut oturumda veya bağlantıda görünür.
  • İndeksler, kısıtlamalar oluşturulmasına izin verir, işlemlerin bir parçası olabilir.
  • Büyük veri setleri ve karmaşık işlemlerle çalışırken kullanılır.

Tablo Değişkenleri (örneğin, @MyTable):

  • Görünürlük alanları batch/prosedür/fonksiyon içinde bulunur.
  • Genellikle küçük veri setleri için optimize edilir.
  • Üzerlerinde tam anlamıyla indeks oluşturulamaz (sadece PRIMARY KEY/UNIQUE dışında).
  • Daha az olasılıkla kilitlenirler ve işlemlerde farklı şekilde katılırlar.

Örnek:

-- Geçici tablo CREATE TABLE #Temp( Id INT, Name NVARCHAR(100) ); INSERT INTO #Temp VALUES (1, 'Test'); SELECT * FROM #Temp; -- Tablo değişkeni DECLARE @MyTable TABLE (Id INT, Name NVARCHAR(100)); INSERT INTO @MyTable VALUES (2, 'Sample'); SELECT * FROM @MyTable;

Kandırmaca Sorusu.

#TempTable ve ##GlobalTempTable geçici tablolarının yaşam süresi ve görünürlük alanı nasıl fark eder?

Doğru cevap:

  • #TempTable yalnızca mevcut oturumda görünür, bağlantı kapandığında veya explicit DROP ile yok edilir.
  • ##GlobalTempTable, tabloyu kullanan son oturum kapatılana kadar tüm oturumlara açıktır veya explicit DROP ile yok edilir. Son olarak, onu kullanan son bağlantı kapandıktan sonra yok olur.
-- Küresel geçici tablo CREATE TABLE ##GlobalTemp (Id INT);

Konunun inceliklerini bilmemekten kaynaklanan gerçek hatalara dair örnekler.


Hikaye

Büyük raporların işlendiği projede, yüz binlerce satırı geçici olarak saklamak için tablo değişkeni kullanıldı. Sonuç: Performansta keskin bir düşüş yaşandı, çünkü optimizasyoncu sorguların maliyetini abarttı ve uygun olmayan planlar kullanmaya başladı. Bir geçici tablonun tempdb'de kullanılması, süre açısından önemli bir kazanç sağladı.


Hikaye

Bir prosedürde geçici tablonun açıkça silinmesini unuttuk. Tekrar eden paketli çalıştırmalarda aynı oturum içinde "nesne zaten mevcut" hataları oluştu. DROP TABLE eklenince bu sorun ortadan kalktı.


Hikaye

Raporlar arasında işlem yapma için küresel geçici tablo kullandık. Aynı anda yürütmenin davranışın tahmin edilemez hale getirdiğini göz ardı ettik — oturumlar aynı veriler için çatıştılar. Küresel tablo yerine her oturum için bireysel geçici tablolar kullanma kararı alındı.