Veritabanı programlama
Geçici tablolar ve tempdb
Ara sonuçların maliyetini görünür kıl.
Kavramı anlayalım
Yerel #tablo aynı oturuma aittir; oturum bittiğinde temizlenir. Global ##tablo farklı oturumlara görünür ve bu derslerde kullanılmaz. @table değişkeni de tempdb kaynaklarını kullanabilir; “tamamen bellekte” varsayımı doğru değildir. SQL Server sürümü ve compatibility level, table variable tahminlerini etkiler.
CTE bir sonuç saklama garantisi vermez. Büyük ara sonucu tekrar kullanmak gerekiyorsa geçici tablo ve uygun indeks ölçülerek seçilebilir. tempdb; sıralama, hash spill ve row versioning yüklerini de taşır. Yavaşlığın kaynağı disk, latch, bellek veya sorgu planı olabilir. Geçici tabloları anlamlı adlandır; aynı oturumda örneği yeniden çalıştırmadan yalnız ilgili geçici tabloyu temizle.
Tekrar kullanılan ara veriyi hazırlamak için.
Table variable’ın her boyutta daha hızlı olduğunu sanmak.
Aynı konu. Üç farklı derinlik.
DROP TABLE IF EXISTS #Paid;
SELECT OrderId, CustomerId INTO #Paid FROM lab.SalesOrder WHERE Status = 'Paid';
SELECT COUNT(*) AS Orders FROM #Paid;Aynı oturumda dokuz sipariş saklanır.
Bu sayfa SQL çalıştırmaz. Örnekleri indirilebilir SqlStudioLab veritabanında, SSMS’de uygula. Geçici tablo örneklerini yeniden çalıştırırken yalnız ilgili #tabloyu temizle. VIEW, procedure ve function örnekleri lab’da kalıcı nesne oluşturur; üretim bağlantısı kullanma.
Önce kendin dene.
Ürün stoklarını geçici tabloya kopyalayıp toplam stoğu hesapla.
Çözümü ve açıklamasını göster
DROP TABLE IF EXISTS #Stock;
SELECT ProductId, Stock INTO #Stock FROM lab.Product;
SELECT SUM(Stock) AS TotalStock FROM #Stock;Yalnız #Stock yeniden oluşturulur; kalıcı ürün tablosu değişmez.