Temp Tablo ve Table Variable Farkları

20 Ara by NURULLAH ÇAKIR

Temp Tablo ve Table Variable Farkları

Temp Tablo ve Table Variable ile ilgili daha önce makaleler yazmıştım. Genelde tsql kod geliştirmeye yeni başlayan insanlar hangisini kullanmanın kendisi için daha performanslı olacağını merak ediyor. Bu yüzden bu 2 kavramın farklılıklarını belirten bir makale yazmak istedim. Önceki yazdığım makaleler aşağıdaki linklerden ulaşabilirsiniz.

Global Ve Lokal Temp Tablo Oluşturmak“,

Table Variable Kullanımı

 

Aşağıda da Temp Tablolar ve Table Variables’ın karşılaştırma tablosunu bulabilirsiniz.

Temp Tablolar

Table Variables

Syntax farklılığı vardır. Temp tabloları aşağıdaki şekilde oluşturabilirsiniz.

 

create table #TempTablo (Tempkolon varchar(50))

 

Syntax farklılığı vardır. Table Variable’ı aşağıdaki şekilde oluşturabilirsiniz.

 

DECLARE  @TableVariableTablo table(TableVariableKolon varchar(50))

 

Tempdb’de tutulurlar ve temp tablolar üzerinde yapılan işlemler tempdb’nin transaction log’unda loglanır.

Genelde memory’de tutuldukları yönünde bir yanlış kanı vardır. Table Variable’lar da tempdb de tutulurlar. İsterseniz aşağıdaki kod yardımıyla test edebilirsiniz. Kodu çalıştırdıktan sonra belirli aralıklarla tempdb’nin boyutuna bakın arttığını göreceksiniz.

 

DECLARE  @TableVariableTablo table(TableVariableKolon varchar(50))

while(1=1)

BEGIN

Insert Into @TableVariableTablo VALUES(‘testkayıt’)

END

 

Create Index ile Index oluşturulabilir ve bu şekilde perfomans sorununu aşabilirsiniz.

SQL Server 2014 ‘ten önce Primary Key ve Unique Constraint’ler ile index oluşturuluyordu. Non unique bir index oluşturulamıyordu. SQL Server 2014 ile beraber non unique index’te aşağıdaki şekilde oluşturulabiliyor.

 

DECLARE @TableVariableTablo TABLE (

Kolon1 INT INDEX IX1 CLUSTERED,

Kolon2 INT INDEX IX2 NONCLUSTERED,

       INDEX IX3 NONCLUSTERED(Kolon1,Kolon2) /*Kolon1 ve Kolon2’yi içeren bir index*/

);

 

Büyük tablolarda  table variable’a göre daha performanslı çalışır.

Execution plan oluşturulurken table variable üzerinde 0 kayıt olduğu kabul edilerek oluşturulur. Bu yüzden büyük tablolarda performans sorunu olur.

Temp Tablolarda Transaction yapısı vardır. Bu yüzden aşağıdaki gibi bir transaction’ı rollback yapabilirsiniz.

 

create table #TempTablo (Tempkolon varchar(50))

 

BEGIN TRANSACTION

Insert Into #TempTablo VALUES(‘testkayıt’)

ROLLBACK

 

select * from #TempTablo

 

Table Variable’da Transaction yapısı yoktur. Bu yüzde aşağıdaki gibi bir transaction’ı rollback yapmak istediğinizde bunu gerçekleştiremezsiniz.

 

DECLARE  @TableVariableTablo table(TableVariableKolon varchar(50))

 

BEGIN TRANSACTION

Insert Into @TableVariableTablo VALUES(‘testkayıt’)

ROLLBACK

 

Select * From @TableVariableTablo

 

Stored Procedure’ün içinde temp tablo varsa store procedure her seferinde recompile olacaktır ve her seferinde yeni bir execution plan oluşturacaktır. Bu Stored Procedure’ün asıl amaçlarından biri olan “her seferinde query plan oluşmasını engelleyerek bu maliyetten kurtulmak” ifadesini engelleyecektir.

Stored Procedure’ün içinde table variable varsa recompile işlemi gerçekleşmez.

SELECT INTO ile temp tablo oluşturabilirsiniz.

SELECT INTO ile table variable oluşturamazsınız.

Global bir temp tablo kullanıyorsanız başka insanlarda bu temp tabloyu kullanabileceğinden ve temp tablolarda transaction yapısı olduğundan lock sorunu yaşayabilirsiniz.

Table Variable’lar transaction yapısına dahil değildir. Hiçbir zaman lock sorunu yaşanmaz.

ALTER, DROP gibi DDL komutları temp tablolar oluşturulduktan sonra çalıştırılabilir.

 

 

Table Variable’lar oluşturulduktan üzerlerinde ALTER ya da DROP gibi DDL komutları çalıştırılamaz. Sp ya da funtion içinde Table Variable tanımladıysanız sp ya da function bittiğinde table variable otomatik olarak silinir.

user-defined function içersinde temp tablo oluşturulamaz

user-defined function içersinde table variable oluşturulabilir.

Temp tablolar nested stored procure’lerde kullanılabilir

Table Variable nested stored procedure’lerde kullanılamaz

Loading

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir