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 (0)

Yorum Yaz