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_executesqlveya 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) veyaSET SHOWPLAN_ALL ON(SQL Server) kullanarak sorgu planını inceleyin. - Geçici Tablolar: Çok karmaşık analitik işlemlerde ara sonuçları
#TempTableyapı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.


Yorumlar (0)
Yorum Yaz