Sql & Veritabanı İle Veri Analitiği İçin Stored Procedure Nasıl Yapılır?

Sql & Veritabanı İle Veri Analitiği İçin Stored Procedure Nasıl Yapılır?
Sql & Veritabanı İle Veri Analitiği İçin Stored Procedure Nasıl Yapılır?

Gereksinimler ve Ön Hazırlık

Bu eğitimdeki örnekleri uygulayabilmek için modern bir ilişkisel veritabanı yönetim sistemine (RDBMS) ihtiyacınız vardır. Örnekler PostgreSQL ve SQL Server (T-SQL) uyumlu yapılar temel alınarak hazırlanmıştır.

  • Veritabanı Sunucusu: PostgreSQL 16+ veya SQL Server 2022+ yüklü olmalıdır.
  • SQL Editörü: DBeaver, pgAdmin veya SQL Server Management Studio (SSMS) gibi bir araç.
  • Temel Bilgi: Tablo yapısı (Schema), SELECT, JOIN ve temel toplama fonksiyonları (SUM, AVG, COUNT) hakkında bilgi sahibi olmanız beklenir.

Stored Procedure Nedir ve Neden Kullanılır?

Stored Procedure, veritabanı üzerinde çalışan bir fonksiyon bloğu gibidir. Analitik süreçlerde kullanılmasının temel nedenleri; ağ trafiğini azaltmak, kodun tekrar kullanılabilirliğini artırmak ve veritabanı seviyesinde güvenlik sağlamaktır. Analiz sonuçlarını her seferinde uygulama katmanına çekip orada işlemek yerine, bu işlemi veritabanında yapmak performansı %40'a varan oranlarda artırabilir.

Özellik Stored Procedure Dinamik SQL (Uygulama İçi)
Performans Yüksek (Ön derleme) Düşük (Her seferinde ayrıştırma)
Güvenlik Yüksek (SQL Injection koruması) Düşük (Riskli)
Bakım Kolay (Tek merkezden) Zor (Kod genelinde değişiklik)

Adım Adım İlk Stored Procedure Oluşturma

Bir satış tablonuz olduğunu ve belirli bir tarih aralığındaki toplam ciro analizi yapmak istediğinizi varsayalım. İlk adım, prosedürün yapısını tanımlamaktır. Aşağıdaki kod, basit bir ciro hesaplama prosedürü örneğidir.

CREATE PROCEDURE GetTotalRevenueByDate
    @StartDate DATE,
    @EndDate DATE
AS
BEGIN
    SELECT SUM(TotalAmount) AS TotalRevenue
    FROM Sales
    WHERE SaleDate BETWEEN @StartDate AND @EndDate;
END;

Bu kod bloğunda, parametre olarak alınan başlangıç ve bitiş tarihleri arasında satışların toplamını hesaplıyoruz. CREATE PROCEDURE komutu, bu mantığı veritabanı kataloğuna kaydeder.

Veri Analitiği İçin Parametreli Prosedürler

Analitik süreçler genellikle dinamik filtrelemeye ihtiyaç duyar. Örneğin, belirli bir kategoriye veya bölgeye göre satış analizi yapmak isteyebilirsiniz. Parametre kullanımı, prosedürünüzü esnek hale getirir.

CREATE PROCEDURE GetCategoryPerformance
    @CategoryName NVARCHAR(100),
    @Year INT
AS
BEGIN
    SELECT ProductID, SUM(Quantity) AS TotalSold
    FROM Sales
    WHERE Category = @CategoryName AND YEAR(SaleDate) = @Year
    GROUP BY ProductID
    ORDER BY TotalSold DESC;
END;

Bu prosedür, kategori ve yıl bazında en çok satan ürünleri listeler. Parametreler sayesinde aynı prosedürü farklı kategoriler için tekrar tekrar kullanabilirsiniz.

Stored Procedure İçerisinde Hata Yönetimi

Veri analitiği sırasında beklenmedik hatalar (bölme hatası, veri tipi uyuşmazlığı vb.) oluşabilir. Profesyonel bir yapıda TRY...CATCH blokları kullanmak, uygulamanızın çökmesini engeller.

CREATE PROCEDURE SafeRevenueCalculation
    @InputID INT
AS
BEGIN
    BEGIN TRY
        SELECT Revenue / SalesCount AS AveragePerSale
        FROM FinancialMetrics
        WHERE ID = @InputID;
    END TRY
    BEGIN CATCH
        PRINT 'Bir hata oluştu: ' + ERROR_MESSAGE();
    END CATCH
END;

Burada, SalesCount değerinin sıfır olması durumunda oluşabilecek "sıfıra bölme hatasını" yakalıyoruz. Bu, sistemin kararlılığı için kritik bir adımdır.

Güvenlik: SQL Injection ve Yetkilendirme

Kritik Uyarı: Stored Procedure kullanırken dinamik SQL oluşturmaktan kaçının. Eğer mutlaka dinamik SQL kullanmanız gerekiyorsa, kullanıcı girdilerini mutlaka sp_executesql veya eşdeğer parametreli yöntemlerle temizleyin. Aksi takdirde SQL Injection saldırılarına açık hale gelirsiniz.

Prosedürleri kullanırken, veritabanı kullanıcısına sadece prosedürü çalıştırma (EXECUTE) yetkisi verin; tablolara doğrudan erişim yetkisi vermeyin. Bu, "En Az Ayrıcalık" (Principle of Least Privilege) prensibidir.

Performans Optimizasyonu İpuçları

Analitik sorgular milyonlarca satır üzerinde çalışabilir. Prosedürlerinizin hızlı çalışması için şu adımları izleyin:

  • İndeksleme: WHERE ve JOIN koşullarında kullanılan sütunlara mutlaka indeks ekleyin.
  • Sorgu Planı: EXPLAIN ANALYZE (PostgreSQL) veya SET SHOWPLAN_ALL ON (SQL Server) kullanarak sorgu planını inceleyin.
  • Geçici Tablolar: Çok karmaşık analitik işlemlerde ara sonuçları #TempTable yapılarında saklayarak işlem yükünü bölün.
CREATE PROCEDURE GetHighValueCustomers
AS
BEGIN
    -- Ara sonuç için geçici tablo kullanımı
    SELECT CustomerID, SUM(TotalAmount) AS TotalSpent
    INTO #TempCustomerSpend
    FROM Sales
    GROUP BY CustomerID;

    SELECT * FROM #TempCustomerSpend WHERE TotalSpent > 10000;
END;

Sıkça Sorulan Sorular

Stored Procedure kullanmak her zaman daha mı hızlıdır?

Çoğu durumda evet, özellikle karmaşık sorgularda. Ancak çok basit ve tek seferlik sorgular için prosedür oluşturmak ek bir yönetim yükü getirebilir.

Prosedür içindeki değişkenleri nasıl debug ederim?

SQL Server'da PRINT veya SELECT ifadeleri ile değişkenlerin değerlerini çıktı olarak görebilirsiniz. PostgreSQL'de RAISE NOTICE komutunu kullanabilirsiniz.

Bir prosedür başka bir prosedürü çağırabilir mi?

Evet, bir prosedür içerisinde başka bir prosedürü EXEC komutu ile çağırabilirsiniz. Bu, modüler bir yapı kurmanıza yardımcı olur.

Analitik sonuçları bir tabloya nasıl yazdırırım?

INSERT INTO ... EXEC ... yapısını kullanarak bir prosedürün çıktısını kalıcı bir tabloya kaydedebilirsiniz.

Parametre sınırı var mıdır?

Teknik olarak veritabanı sistemine göre değişse de, okunabilirlik ve performans için 10-15 parametreyi geçmemeye çalışın.

Stored Procedure Versiyonlama ve Deployment Stratejileri

Veritabanı projeleri büyüdükçe, stored procedure kodlarının yönetimi karmaşıklaşabilir. Profesyonel bir geliştirme ortamında, prosedürlerinizi doğrudan veritabanı üzerinde düzenlemek yerine, bir versiyon kontrol sistemi (Git gibi) üzerinde tutmanız ve deployment süreçlerini otomatize etmeniz kritiktir.

SQL Scriptlerini Modülerleştirme

Prosedürlerinizi tek bir devasa dosya yerine, mantıksal parçalara ayırarak yönetin. Her bir prosedür için ayrı bir .sql dosyası oluşturmak, ekip içi çalışmalarda çakışmaları önler.

-- Örnek: Prosedür güncelleme scripti (Migration)
IF OBJECT_ID('sp_GetMonthlySales', 'P') IS NOT NULL
    DROP PROCEDURE sp_GetMonthlySales;
GO

CREATE PROCEDURE sp_GetMonthlySales
    @Year INT
AS
BEGIN
    SELECT Month, SUM(TotalAmount) 
    FROM Sales 
    WHERE Year = @Year
    GROUP BY Month;
END;
GO

CI/CD Süreçlerine Entegrasyon

Veritabanı değişikliklerini canlı ortama taşırken manuel müdahalelerden kaçının. SQL Server Data Tools (SSDT) veya Flyway gibi araçlar kullanarak, prosedürlerinizdeki değişiklikleri versiyon numaralarıyla takip edebilir ve dağıtım hattına (pipeline) dahil edebilirsiniz.

İleri Düzey Analitik İçin Dinamik SQL Kullanımı

Bazen analitik raporlarınızın sütun isimleri veya tablo yapıları çalışma zamanında (runtime) belirlenmek zorunda kalabilir. Bu durumda "Dynamic SQL" kullanarak esnek yapılar oluşturabilirsiniz. Ancak, bu yöntemi kullanırken SQL Injection riskine karşı QUOTENAME fonksiyonunu kullanmak hayati önem taşır.

Dinamik Filtreleme Örneği

Kullanıcının dinamik olarak seçtiği sütunlara göre gruplama yapan bir analitik prosedürü şu şekilde kurgulayabilirsiniz:

CREATE PROCEDURE sp_DynamicAnalytics
    @GroupByColumn NVARCHAR(128)
AS
BEGIN
    DECLARE @SQL NVARCHAR(MAX);
    
    -- QUOTENAME ile SQL Injection'ı engelliyoruz
    SET @SQL = N'SELECT ' + QUOTENAME(@GroupByColumn) + 
               N', COUNT(*) as TotalCount FROM Sales GROUP BY ' + QUOTENAME(@GroupByColumn);
    
    EXEC sp_executesql @SQL;
END;
Dikkat: Dinamik SQL kullanırken, parametre olarak gelen değerlerin veritabanı şemasına uygun olup olmadığını mutlaka kontrol edin. Aksi takdirde, beklenmedik hatalar veya güvenlik açıkları oluşabilir.

Performans Takibi ve Execution Plan Analizi

Prosedürlerinizin performansını ölçmek için SET STATISTICS IO ON ve SET STATISTICS TIME ON komutlarını kullanın. Bu komutlar, prosedür çalışırken veritabanının hangi tablolardan ne kadar veri okuduğunu ve işlemin ne kadar sürdüğünü detaylı bir şekilde raporlar.

SET STATISTICS IO ON;
SET STATISTICS TIME ON;

EXEC sp_GetMonthlySales @Year = 2023;

SET STATISTICS IO OFF;
SET STATISTICS TIME OFF;

Bu verileri inceleyerek, prosedür içerisinde yer alan karmaşık JOIN işlemlerinin veya WHERE koşullarının indeksler tarafından desteklenip desteklenmediğini kolayca tespit edebilirsiniz.

Sonuç

Sql & Veritabanı ile veri analitiği için stored procedure oluşturmak, veritabanı yönetiminde ustalaşmanın en önemli adımlarından biridir. Bu rehberde öğrendiğiniz prosedür yapısı, hata yönetimi ve güvenlik pratikleri, profesyonel projelerinizde hız ve güvenliği bir arada sunacaktır. Bir sonraki adım olarak, prosedürlerinizi tetikleyiciler (triggers) ile birleştirerek veritabanı üzerinde otomatik raporlama sistemleri kurmayı deneyebilirsiniz.

Sorumluluk Reddi: Bu makalede yer alan kod örnekleri eğitim amaçlıdır. Üretim (production) ortamında kullanmadan önce mutlaka veritabanı yedeğinizi alın ve güvenlik testlerini gerçekleştirin. Veritabanı yapılandırmaları, sunucu kaynaklarına ve iş mantığınıza göre değişiklik gösterebilir.

Bu yazıya tepkinizi paylaşın:
Zeynep Kaya

Ev yönetimi ve kendin yap (DIY) projeleri konusunda uzmanlaşmış bir içerik üreticisiyim. Detaylı rehberler hazırlayarak okuyucuların evdeki küçük sorunları profesyonel yardıma gerek duymadan çözmelerini sağlıyorum.

Yorumlar (17)

17
okuyucu bu yazı hakkında yorum yaptı. Siz de deneyiminizi paylaşarak diğer okuyuculara yardımcı olabilirsiniz.
Selin Y.
Selin Y. 23 Temmuz 2026

Benim veritabanında execution planları sürekli değişiyor, proc kullansam bile performans dalgalı. Bu konuda bir önerin var mı?

Mert C.
Mert C. 24 Temmuz 2026

Parametre kokusuna (parameter sniffing) bakmanı öneririm, recompile seçeneği işini görebilir.

Oğuzhan G.
Oğuzhan G. 24 Temmuz 2026

Hocam peki bu proc'ların versiyon takibini nasıl yapıyorsunuz? Git üzerinde tutmak biraz sorunlu olabiliyor bazen.

Zeynep Kaya
Zeynep Kaya 25 Temmuz 2026

Harika bir soru! DDL scriptlerini küçük dosyalar halinde git üzerinde tutmak en temiz yöntem bence.

Ayşe Nur
Ayşe Nur 26 Temmuz 2026

Bu yöntemle raporlama süreçlerini otomatize ettik bile. Çok faydalı bi içerik olmuş, ellerine sağlık.

Fatih B.
Fatih B. 28 Temmuz 2026

SQL Server'da denedim kodlar tıkır tıkır çalışıyo. Teşekkürler paylaşım için.

Emre K.
Emre K. 30 Temmuz 2026

Stored procedure kullanmanın view'lara göre avantajlarını biraz daha detaylandırabilir miydiniz? Hangi durumlarda hangisini tercih etmeliyiz?

Zeynep Kaya
Zeynep Kaya 30 Temmuz 2026

Kısaca; view'lar veri okuma ve basit birleştirmeler için, stored procedure'lar ise karmaşık iş mantığı ve işlem yönetimi için daha uygundur.

Deniz Yıldız
Deniz Yıldız 31 Temmuz 2026

Yazı güzelde keşke örnekleri biraz daha basitleştirseydiniz. Başlangıç seviyesi için biraz ağır geldi sanki.

Selin A.
Selin A. 01 Ağustos 2026

Bence gayet yerinde, orta seviye için ideal bir anlatım olmuş.

Hakan Demir
Hakan Demir 01 Ağustos 2026

Dinamik sql kullanımı hakkında daha detaylı bir rehber bekliyoruz. Injection risklerinden bahsetmişsiniz ama örnekleri biraz daha çoğaltabilir miydiniz?

Zeynep Kaya
Zeynep Kaya 02 Ağustos 2026

Haklısınız Hakan Bey, dinamik SQL başlı başına bir konu. Önümüzdeki haftalarda sadece güvenlik odaklı bir yazı hazırlamayı planlıyorum.

Merve Şahin
Merve Şahin 02 Ağustos 2026

Veri analitiği projelerimizde proc kullanmak işleri baya hızlandırdı, elinize sağlık. Çok açıklayıcı olmuş.

Selim Çelik
Selim Çelik 03 Ağustos 2026

Ya ben bu prosedürleri yazıyom ama sürekli derleme hatası alıyorum. Kod bloklarını kopyaladım yine aynı, nerede yanlış yapıyor olabilirim?

Burak Aras
Burak Aras 04 Ağustos 2026

Kardeşim muhtemelen GO komutlarını yanlış yere koyuyorsundur, bir de veritabanı yetkilerini kontrol et.

Caner Yılmaz
Caner Yılmaz 05 Ağustos 2026

Harika bir yazı olmuş Zeynep Hanım, özellikle hata yönetimi kısmı çok işime yaradı. Stored procedure kullanırken performans kaybı yaşamamak için başka nelere dikkat etmeliyiz?

Zeynep Kaya
Zeynep Kaya 06 Ağustos 2026

Teşekkürler Caner Bey! Performans için 'SET NOCOUNT ON' kullanmayı ve karmaşık sorgularda indekleme stratejilerini gözden geçirmeyi ihmal etmeyin derim.

Yorum Yaz