Temp Table vs Temp Variable

Geçen hafta kurum içi verdiğim sql performans ipuçları eğitiminde Geçici Tablolar (GT) ve Tablo Tipi Değişkenlerden (TTD) ve bunların kullanımlarıyla ilgili bilgilerden bahsettim. Bugünde bu sunumda verdiğim bir kaç örneği ve GT ve TTD arasındaki farkları  sizinle paylaşmak istiyorum.

Genel olarak raporlama yaparken veya büyük veri setleriyle uğraşırken, bu veri setlerini küçültmek ve daha hızlı sonuç almak için bu yapılara başvurduğumuz olur.
Bu iki tablo tipi arasındaki farkın ne olduğu veya bunları nerelerde kullanmamız gerektiği konusunda da gerek yazılım ekibinden gerek raporlama ekibinde sıklıkla sorular sorulur.

GT ve TTD arasında yazım/kullanım (syntax), depolama, Index, Erişim, Transaction konularında bazı farklar mevcuttur.

Yazım ve Kullanım Farkı

GT

  • GT oluşturmak, kayıt eklemek, sorgulamak ve tablo silmek için aşağıdaki örnekte olduğu gibi bir yapı kullanabiliriz.
  • GT’de Tablolara kolon ekleme veya çıkartma işlemleri de yapabilmek mümkündür.
  • GT’de UDF (Kullanıcı tanımlı Fonksiyon) kullanımını desteklememektedir.
CREATE TABLE #Employee
(
 Id INT,
 Name VARCHAR(50),
 Surname VARCHAR(50)
)

INSERT INTO #Employee
 ( Id, Name, Surname )
VALUES (1,'Hasan','Tatarlı')

SELECT * FROM #Employee

ALTER TABLE #Employee
ADD Birthdate DATETIME

DROP TABLE #Employee

TTD

  • TTD bir değişken türü olduğu için Create ve Drop gibi DDL işlemleri geçerli değildir. Değişken oluşturma, Kayıt ekleme ve Kayıt sorgulama işlemleri aşağıdaki gibidir.
  • TTD Kolon ekleme ve çıkartma işlemleri için “ALTER” kullanımını desteklemez.
  • UDF (Kullanıcı tanımlı fonksiyonlar) kullanılabilir.
DECLARE @Employee TABLE
(
 Id INT,
 Name VARCHAR(50),
 Surname VARCHAR(50)
)</pre>

INSERT INTO @Employee
( Id, Name, Surname )
VALUES (1,'Hasan','Tatarlı')

SELECT * FROM @Employee

Depolama

GT

GT create edildiğinde TempDb üzerinde tutulurlar ve bunun sonucu olarak veriler diske yazılır ve diskten okunurlar. Aynı zamanda yapılan işlemlerin logları tempdb’ye ait transaction log’da tutulduğundan dolayı transaction yapısını da desteklerler. Bu nedenle yapılan işlemler TTD’ye göre daha uzun sürebilir.

CREATE TABLE #Employee
(
	Id INT,
	Name VARCHAR(50),
	Surname VARCHAR(50)
)

INSERT INTO #Employee
        ( Id, Name, Surname )
VALUES (1,'Hasan','Tatarlı')

BEGIN TRANSACTION
	DELETE FROM #Employee
ROLLBACK TRANSACTION

SELECT * FROM #Employee

TTD

TTD’ler bir değişken türü olduğu için diske yazılmazlar ve sadece bellekte tutulurlar. Yapılan işlemlerin logları da tutulmaması dolayısıyla Transaction yapısı TTD’lerde kullanılmamaktadır.

DECLARE @Employee TABLE
(
	Id INT,
	Name VARCHAR(50),
	Surname VARCHAR(50)
)

INSERT INTO @Employee
        ( Id, Name, Surname )
VALUES  (1,'Hasan','Tatarlı')

BEGIN TRANSACTION
	DELETE FROM @Employee 
ROLLBACK TRANSACTION

SELECT * FROM @Employee

Indexing

GT

GT’lerde Index yapısı desteklenmektedir. Aşağıdaki şekilde Clustered ve Nonclustered index oluşturulabilir

CREATE CLUSTERED INDEX cl_EmployeeId ON #Employee  ( 	ID    )

CREATE NONCLUSTERED INDEX ncl_EmployeeName ON #Employee  ( 	Name  )

TTD

Index yapısı desteklenmemektedir.

Erişim

GT

GT’lere erişim sadece açılmış olan sessionlar içerisinden mümkündür. Fakat GT Create ederken aşağıdaki şekilde kullanım bu tablonun Global olarak oluşturulmasını ve diğer sessionlar üzerinden erişilmesini de mümkün kılmaktadır.

CREATE TABLE ##Employee
(
	Id INT,
	Name VARCHAR(50),
	Surname VARCHAR(50)
)

TTD

Diğer sessionlar üzerinden erişilmesi mümkün değildir.

Son olarak genelleme yapılmış şekilde aşağıdaki tabloyu sizlerle paylaşmak istiyorum.

DDL İşlemleri (Alter,Create,Drop) Depolama Transaction Kullanıcı Tanımlı Fonksiyonlar(UDF) Index Erişim
Var Bellek Disk Var Var Var Global*
Geçici Tablo + + + + + +
Tablo Tipi Değişken + +
* Not: Global erişmek için ## şeklinde Global temp olarak tanımlamak gerekir.

Umarım faydalı olmuştur.

Bir başka yazıda görüşmek dileğiyle.

Leave a Reply