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“,
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 |