Cuma , 16 Kasım 2018

Temp tablo ve Table variable Karşılaştırılması

SQL Serverda verileri geçici olarak tutabileceğimiz yapılar vardır. Bunlardan en fazla bilinen ve kullanılanı Temp tablolar ve Tablo tipi değişkenler(Table variable)’dir. Genelde performans için hangisini kullanmalıyım ya da ikisinin kullanmak arasında ne gibi farklar var soruları ile çok sık karşılaşabilirsiniz. Bu yüzden kısaca bu iki yapı arasındaki önemli farklara değinmek istiyorum.

İlk olarak table variable bir değişken olduğu için bellekte tutulurlar. Buna karşılık temp tablolara yazılan datalar ise SQL Server sistem veritabanlarından biri olan TempDB adlı veritabanında tutulur dolayısıyla veriler diske yazılıp diskten okunurlar. Ayrıca Temp tablo olarak oluşturduğumuz veri kümeleri Tempdb de tutulduğu gibi bu veriler üzerinde yapılan işlemler(Transactionlar) Tempdb’nin transaction loguna yazılırlar. Bu da ayrıca bir işlem maliyeti getirmektedir.

Bu kadar teorik bilgiden sonra adım adım farkları örnekleyelim.

Belkide en önemli fark olarak az önce söylediğimiz gibi table tipli değişkenler üzerinde yapılan insert,delete,update işlemlerinin loğları tutulmazken temp tablolar üzerinde yapılan işlemlerin logları Tempdb veritabanının transaction log dosyasında tutulmaktadır. Buradan çıkaracağımız sonuç ise temp tablolarda bir transaction mekanizması olmasına rağmen table tipli değişkenler transaction mekanizmasının dışındadır. Hemen örnekleyelim.


tmptablo1

 

tmptablo

Örneğimiz çıktısına baktığımızda transaction rollback olduktan sonra temp tablo içindeki değer eski haline dönmesine karşı tablo tipli değişken içindeki değer update edilmiştir. Bu da bize temp tabloların transaction içinde kullanılabileceğini tablo tipli değişkenlerinse transaction kapsamında olmadıklarını göstermektedir.

İkinci önemli fark ise özellikle stored procedure içinde kullanılan temp tablolar stored procedurun her çağrıldığında RECOMPILE olmasını sağlar. Çünkü stored procedurlerin içinde herhangibir ddl işelmi(create,drop,alter vb)  veya işlemleri varsa SQL Server kullanacağı execution planı oluşturmak için çalışma zamanında ilgili obje veya objelerin oluşmasını bekler.Bu yüzden içinde temp tablo bile olsa herhangi bir ddl işlemi olan stored procedureler her çağrıldıklarında RECOMPILE olurlar. Bu da bize stored procedure tarafından sağlanan yararı ortadan kaldırmaktadır. Bu sebeple stored procedure içinde Temp tablo yerine Tablo tipli değişken kullanmak daha yaralı olabiliyor.

Temp tablolar hakkında söylenmesi gereken bir diğer nokta ise Temp tablo kullanılan bir sorgu ile tablo tipli değişken kullanılan aynı sorgunun execution planları incelendiğinde Estimated Execution Planları aynı olmasına rağmen Actual Execution Planları aynı olmayabilir. Bu yüzden execution planları karşılaştırırken Actual Execution planlar referans alınmalıdır.

Aslında Execution planlarına bakmadan Temp tablo veya Tablo tipli değişken hakkında hangisinin daha hızlı çalışacağı hakkında yorum yapmak pek doğru değildir. Bu yüzden her iki kullanımda özellikle büyük veriler kullanılarak test edilmelidir.

 

Hakkında ismailadar

Cevapla

E-posta adresiniz yayınlanmayacak. Required fields are marked *

*


*

Şu HTML etiketlerini ve özelliklerini kullanabilirsiniz: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>