T-SQL Geçici Tablolar-Temporary Tables

Geçici tablolar, SQL Server’da geçici veri depolamak için kullanılan özel tablo türleridir. İki ana türü vardır: yerel geçici tablolar ve global geçici tablolar. Bunlar fiziksel olarak oluşmazlar. Bellekte geçici olarak oluşmaktadır.

Production ortamdaki bir tablo üzerinde yapmaya korkacağınız işlemleri güvenli bir şekilde temp tablolar üzerinde yapabilirsiniz. Sadece size özel bir tablo olacağı için locklanma olmaz ve performans artışı sağlar. Temp tablolarda index oluşturabilirsiniz. Temp tablolar tempdb veritabanında duracağı için, tempdb veritabanının bulunduğu diskler yavaş olursa performans sorunu olacaktır. Tempdb veritabanını büyüteceği için ekstra disk alanı gerektirecektir. User defined function’lar üzeriden temp tablolara insert,update ve delete yapamazsınız.

Yerel Geçici Tablolar(#) sadece oluşturulan session içinde görünür. Bağlantı sonlandığında otomatik silinir. Adı # işareti ile başlar.

-- Yerel geçici tablo oluşturma
CREATE TABLE #GeciciTablo (
    SiparisID INT PRIMARY KEY,
    MusteriID INT,
    Tarih DATETIME,
    Hesap DECIMAL(10,2)
);

-- Veri ekleme
INSERT  #GeciciTablo VALUES 
(1, 101, '2023-01-15', 150.99),
(2, 102, '2023-01-16', 225.50);

-- Veri sorgulama
SELECT * FROM #GeciciTablo;

Aynı session altında tablomuz tekrardan çağırdığımızda herhangi bir sorunla karşılaşmayız. Fakat farklı bir session’da değişken tanımlı tablomuzu çağırdığımızda sonucumuz gelmez.

Global Geçici Tablolar (##) tüm bağlantılar tarafından görülebilir. Oluşturan bağlantı dahil tüm bağlantılar kapandığında silinir. Adı ## işareti ile başlar

-- Global geçici tablo oluşturma
CREATE TABLE ##GlobalTablo (
    ProductID INT,
    ProductName VARCHAR(100),
    Price DECIMAL(10,2)
);

-- Tüm bağlantılar bu tabloya erişebilir
INSERT INTO ##GlobalTablo VALUES 
(1, 'Laptop', 999.99),
(2, 'Mouse', 19.99);

Tablo Değişkenleri (@) DECLARE ile tanımlanır. Sadece tanımlandığı batch içinde geçerlidir. Performans açısından küçük veri setleri için uygundur. Table Variable özel bir veri tipidir. Sorgu içerisinde bir sonuç kümesini table variable oluşturup içine atabilir ve daha sonra tekrar kullanabiliriz. Temp tablolara benzer. Fakat bazı farkları vardır.  Table Variable’lar da tempdb de tutulurlar.

Temp Tablolarda Transaction yapısı vardır. Bu yüzden transaction’ı rollback yapabilirsiniz. Table Variable’da Transaction yapısı yoktur. Bu yüzde bir transaction’ı rollback yapmak istediğinizde bunu gerçekleştiremezsiniz. Temp tablolar 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.

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. 

Table Variable üzerinde, Primary Key, Unique Constraint’ler ve Non unique index oluşturuluyor.

DECLARE @TableVar TABLE (
    EmployeeID INT,
    FullName VARCHAR(100),
    Department VARCHAR(50)
);

-- Veri ekleme
INSERT INTO @TableVar VALUES 
(1, 'Ahmet Yılmaz', 'IT'),
(2, 'Ayşe Demir', 'HR');

-- Kullanım
SELECT * FROM @TableVar WHERE Department = 'IT';

Yukarıdaki select ifadesinin Değişkenle birlikte çalışması gerekmektedir. Yoksa hata mesajıyla karşılaşırız.

Gerçek sistem üzerinde gerçek tablomuzun üzerindeki verileri geçici tabloya atmak isteriz. Bunun için aşağıdaki komut kullanılmaktadır. ## yaparsak tüm sessionlar üzerinde işlemler yapabiliriz.

select*into #TEST from [dbo].[Personeller]

Sorgularımızı optimize ederken order by ifadesinden önce veriler geçici tablolara atıldıktan sonra bu tablo üzerinde order by işlemi yapılmaktadır.

Yukarıda oluşturulan tabloda insert update delete ifadelerini rahatlıkla gerçekleştirebiliriz.

insert #TEST(Adi,SoyAdi) values('YUNUS','YUCEL')

Geçici tablomuza select çektiğimizde değerimizin insert edildiğini görmüş oluyoruz. Verileri bellekten almaktadır.

Değişken üzerinde ilgili tablomuzdaki herhangi bir değeri silebiliriz.

delete from #TEST where PersonelID=12

Diğer oturumlarında değişken tablonun kullanılması için ##TEST olarak oluşturulması gerekmektedir. Tek # ile oluşturulan her şey aynıdır.

Bu makalede Temporary Tables konusunu detaylı bir şekilde görmüş olduk. Başka bir makalede görüşmek dileğiyle..

Gökyüzünü de korunmuş bir tavan yaptık. Onlar ise oradaki, (Allah’ın varlığını gösteren) delillerden yüz çevirmektedirler.Enbiya Suresi 32. ayet

Author: Yunus YÜCEL

Bir yanıt yazın

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