SQL Server
SQL Server'da Table-Valued Function Yazımı
Inline ve Multi-Statement TVF arasındaki farklar, yazım kalıpları ve sorgu optimizasyonu için pratik rehber.
📅 6 Haziran 2025 ⏱ ~2 dk okuma 👤 SQL sorgusuyla çalışan herkes
SQL Server'da tekrar eden SELECT sorgularını her yere kopyalamak yerine bir Table-Valued Function (TVF) içine almanız, hem bakım maliyetini hem hata riskini önemli ölçüde düşürür. Bu makalede iki TVF türünü — Inline ve Multi-Statement — somut örneklerle karşılaştırıyor, hangi senaryoda hangisini tercih etmeniz gerektiğini açıklıyoruz.
İçindekiler
- 01TVF Nedir, Neden Kullanılır?
- 02İki TVF Türü: Inline vs Multi-Statement
- 03Inline TVF Yazımı ve Sözdizimi
- 04Multi-Statement TVF Yazımı ve Sözdizimi
- 05TVF'leri Sorguda Kullanmak
- 06Performans: Hangisi Daha Hızlı?
- 07Değiştirme ve Silme
- 08Sık Yapılan Hatalar
- 09Özet Karşılaştırma Tablosu
- 10Sonuç
1. TVF Nedir, Neden Kullanılır?
Table-Valued Function, geriye tek bir değer yerine bir sonuç tablosu döndüren kullanıcı tanımlı fonksiyondur. Scalar fonksiyondan farkı tam da bu noktada: FROM veya JOIN içinde, sanki gerçek bir tablo gibi kullanabilirsiniz.
💡Ne Zaman TVF?SELECT sorgularını uygulama koduna gömmek, sorguda değişiklik yapıldığında yeniden derlemeyi zorunlu kılar. TVF ile sorgu mantığı veritabanında kalır; uygulama kodu sadece fonksiyon adını çağırır.
TVF'lerin temel avantajları:
- ✓Sorgu mantığı tek yerden yönetilir, tekrar kullanılır.
- ✓Parametre alarak dinamik filtreler uygulanabilir (View'ın yapamayacağı şey).
- ✓Diğer tablolarla
JOINiçinde birleştirilebilir. - ✓Sorguda kolon seçimi yapılabilir:
SELECT id, ad FROM dbo.fn_Cari(1)
2. İki TVF Türü: Inline vs Multi-Statement
| Özellik Inline TVF (iTVF) Multi-Statement TVF (MSTVF) | ||
| Gövde | Tek RETURN (SELECT ...) | BEGIN...END bloğu, birden fazla deyim |
| Dönüş tanımı | RETURNS TABLE | RETURNS @tablo TABLE (...) |
| Performans | Optimizer satır içi genişletir → hızlı | Tablo değişkeni doldurur → daha yavaş |
| Esneklik | Tek SELECT yeterli | Döngü, koşullu mantık, çoklu INSERT |
| Ne zaman tercih | Basit filtreler, JOIN'e giren sorgular | Karmaşık iş mantığı, çok adımlı hesaplamalar |
3. Inline TVF Yazımı ve Sözdizimi
Inline TVF'nin gövdesi yalnızca bir RETURN (SELECT ...) ifadesinden oluşur. AS BEGIN...END bloğu yoktur; bu sayede SQL Server sorgu iyileştirici fonksiyonu satır içi genişletir (inline expansion) ve onu bağımsız bir view gibi optimize edebilir.
✅En İyi PratikMümkün olduğunca Inline TVF tercih edin. SQL Server query optimizer, iTVF içindeki istatistikleri doğrudan görebildiğinden çok daha etkili bir yürütme planı üretir.
4. Multi-Statement TVF Yazımı ve Sözdizimi
Birden fazla sorgu adımı, döngü ya da koşullu mantık gerektiğinde Multi-Statement TVF kullanılır. Dönüş tipi olarak RETURNS @degisken TABLE (kolon1 tip, ...) şeklinde bir tablo değişkeni tanımlanır; BEGIN...END bloğunun sonunda RETURN yazılarak bu değişken döndürülür.
5. TVF'leri Sorguda Kullanmak
Her iki türü de FROM içinde doğrudan ya da başka tablolarla JOIN ederek kullanabilirsiniz:
🔗CROSS APPLY ile güçCROSS APPLY, her satır için TVF'yi ayrı parametre ile çalıştırır. Korelasyonlu alt sorgulara göre çok daha okunabilir ve genellikle daha hızlıdır.
6. Performans: Hangisi Daha Hızlı?
Inline TVF, query optimizer tarafından sanki inline bir view gibi ele alınır: fonksiyon gövdesi çağrıyı yapan sorgunun içine gömülür, istatistikler kullanılır, indeksler devreye girer. Multi-Statement TVF ise önce tablo değişkenini doldurur; bu değişkende istatistik olmadığından optimizer tahmin yapamaz ve genellikle daha kötü bir plan seçer.
⚠️Büyük Veri Setlerinde DikkatMulti-Statement TVF, büyük veri setlerinde belirgin yavaşlamaya neden olabilir. SQL Server 2019 ve sonrasında INTERLEAVED_EXECUTION özelliği MSTVF'nin tahminlerini iyileştirir, ancak Inline TVF hâlâ birinci tercih olmalıdır.
7. Değiştirme ve Silme
8. Sık Yapılan Hatalar
🚫Şema Öneki Olmadan ÇağırmaSELECT * FROM fn_Cari(1) yerine her zaman dbo.fn_Cari(1) yazın. Şema öneki olmadan SQL Server önce sistem fonksiyonlarını arar ve gereksiz yük yaratır.
- ✓TVF içinde
INSERT / UPDATE / DELETEkullanamazsınız; yan etki yasaktır. - ✓Multi-Statement TVF'de kolon listesini
RETURNS @t TABLE (...)bloğunda eksiksiz tanımlayın. - ✓Inline TVF'ye
BEGIN...ENDkoymayın; bu onu otomatik olarak MSTVF'ye çevirir. - ✓TVF içinden başka TVF veya Stored Procedure çağırmak performansı olumsuz etkiler.
9. Özet Karşılaştırma Tablosu
| Konu Inline TVF Multi-Statement TVF | ||
| Sözdizimi | RETURNS TABLE … RETURN (SELECT) | RETURNS @t TABLE … BEGIN…END |
| Kolon tanımı | SELECT listesinden otomatik | Manuel, önceden belirtilir |
| Sorgu sayısı | Yalnızca 1 | Sınırsız |
| İstatistik kullanımı | ✔ Tam destek | ✘ Tablo değişkeninde yok |
| Döngü / koşul | ✘ | ✔ (IF, WHILE…) |
| Tavsiye edilen durum | Basit, parametrik filtreler | Karmaşık iş mantığı |
10. Sonuç
Table-Valued Function'lar, SQL Server sorgularında kod tekrarını ortadan kaldırmanın en temiz yollarından biridir. Kural basit: ihtiyacınız tek bir SELECT'le karşılanıyorsa Inline TVF yazın ve optimizer'ın işini doğru yapmasına izin verin. Birden fazla adım, döngü ya da farklı mantık dalı gerekiyorsa Multi-Statement TVF'e geçin — ancak bunu bilinçli bir performans tercihi olarak yapın.
Netsis, ERP entegrasyonları veya özel .NET uygulamalarında TVF'leri yoğun biçimde kullanıyorsanız, aşağıdaki makaleler de işinize yarayabilir.
Ecol — SQL Server Makaleleri
Daha Fazla SQL Server İçeriği mi Arıyorsunuz?
Stored Procedure'den indeks yönetimine, sorgu optimizasyonundan ERP entegrasyonuna kadar teknik blog yazılarımıza göz atın.
Kaynaklar
- Microsoft Learn — Create User-defined Functions (Database Engine)
- Microsoft Learn — CREATE FUNCTION (Transact-SQL)
- SQL Server 2019 Intelligent Query Processing: Interleaved Execution for MSTVFs — Microsoft Docs