PL/SQL’de BULK COLLECT ve FORALL Nedir? Ne Zaman Kullanılır?
PL/SQL ile büyük veri setleri üzerinde çalışırken, performansı artırmak için BULK COLLECT ve FORALL kullanılabilir. Bu yapılar, satır satır veri işleme yerine toplu veri işlemi yaparak CPU ve I/O maliyetlerini azaltır.
Bir PL/SQL mülakatında, "BULK COLLECT ve FORALL nedir?, Ne zaman kullanılır?, Performans farkı nedir?" gibi sorularla karşılaşabilirsin.
Bu makalede, BULK COLLECT ve FORALL’ın ne olduğunu, nasıl çalıştığını ve performansa etkisini inceleyeceğiz.
- BULK COLLECT ve FORALL Nedir?
📌 BULK COLLECT: Çok sayıda satırı bir koleksiyona (array) toplu olarak çeker.
📌 FORALL: Bir koleksiyon içindeki tüm verileri tek bir DML (INSERT, UPDATE, DELETE) işlemiyle veritabanına gönderir.
Bu iki yapı, PL/SQL'in satır bazlı işleme yaklaşımını toplu işleme (bulk processing) çevirerek verimliliği artırır.
- BULK COLLECT Kullanımı
BULK COLLECT, veri okuma işlemlerinde kullanılır. Tek tek satır okumak yerine, tüm satırları bir koleksiyona (array) toplu olarak yükler.
📌 Kullanım Adımları:
1️⃣ Koleksiyon Tanımlanır (TYPE ... IS TABLE OF ...)
2️⃣ BULK COLLECT ile SELECT sonucu koleksiyona yüklenir
3️⃣ Daha hızlı işlem yapılır
🔹 BULK COLLECT Kullanımı – Örnek
DECLARE
TYPE t_hasta IS TABLE OF hastalar%ROWTYPE; -- Koleksiyon türü tanımla
v_hastalar t_hasta; -- Koleksiyon değişkeni
BEGIN
-- BULK COLLECT ile toplu veri çekme
SELECT * BULK COLLECT INTO v_hastalar FROM hastalar;
-- Koleksiyon içindeki verileri işleme
FOR i IN 1 .. v_hastalar.COUNT LOOP
DBMS_OUTPUT.PUT_LINE(v_hastalar(i).ad || ' ' || v_hastalar(i).soyad);
END LOOP;
END;
📌 Açıklamalar:
✔ BULK COLLECT INTO → Tüm veriyi koleksiyona yükler.
✔ v_hastalar.COUNT → Kaç satır yüklendiğini gösterir.
✔ Daha hızlı çalışır çünkü tek tek fetch işlemi yapılmaz.
- FORALL Kullanımı
FORALL, DML (INSERT, UPDATE, DELETE) işlemlerini hızlandırmak için kullanılır.
Normal FOR LOOP ile her satırda DML işlemi yapmak yerine, tüm koleksiyon tek bir işlem olarak veritabanına gönderilir.
📌 Kullanım Adımları:
1️⃣ Koleksiyon Tanımlanır
2️⃣ Koleksiyon verileri FORALL ile toplu işlenir
🔹 FORALL Kullanımı – Örnek (Toplu INSERT İşlemi)
DECLARE
TYPE t_hasta IS TABLE OF hastalar%ROWTYPE;
v_hastalar t_hasta;
BEGIN
-- BULK COLLECT ile hastaları koleksiyona al
SELECT * BULK COLLECT INTO v_hastalar FROM hastalar WHERE id < 100;
-- FORALL ile yeni tabloya toplu ekleme
FORALL i IN 1 .. v_hastalar.COUNT
INSERT INTO hastalar_yedek VALUES v_hastalar(i);
COMMIT;
END;
📌 Açıklamalar:
✔ FORALL i IN 1 .. v_hastalar.COUNT → DML işlemini toplu yapar.
✔ Her satır için ayrı INSERT çalıştırmaz, tek seferde işler.
✔ Performansı artırır çünkü PL/SQL’den SQL motoruna yapılan geçişleri azaltır.
- BULK COLLECT ve FORALL Performans Karşılaştırması
📢 Neden Daha Hızlı?
Normal FOR LOOP içinde SELECT yapıldığında, her satır için SQL motoruna gidip geliriz.
BULK COLLECT ile tek seferde veri çekilir.
FORALL ile tek seferde DML işlemi yapılır.
Bu sayede, PL/SQL ve SQL motoru arasındaki bağlatılar azalır ve performans artar. 🚀
- PL/SQL Mülakatlarında BULK COLLECT ve FORALL ile İlgili Gelebilecek Sorular
PL/SQL mülakatlarında BULK COLLECT ve FORALL kullanımı hakkında şu sorularla karşılaşabilirsin:
Soru 1: BULK COLLECT ve FORALL farkı nedir?
Cevap:
BULK COLLECT, toplu veri okumak için kullanılır.
FORALL, toplu veri yazmak için kullanılır.
Soru 2: BULK COLLECT kullanmanın avantajı nedir?
Cevap:
Tek tek FETCH yapmak yerine, tüm veriyi bir koleksiyona alır.
PL/SQL ve SQL motoru arasındaki iletişimi azaltarak performansı artırır.
Soru 3: FORALL kullanırken neden FOR LOOP yerine tercih etmeliyiz?
Cevap:
FOR LOOP içinde DML işlemi her satır için tek tek çalışır.
FORALL ise tüm işlemi SQL motoruna tek seferde gönderir, bu da performansı artırır.
- BULK COLLECT ve FORALL Kullanırken Dikkat Edilmesi Gerekenler
📌 BULK COLLECT Kullanırken:
Çok büyük veri setleri bellekte fazla yer kaplayabilir!
Çekilecek veri miktarına göre LIMIT kullanabilirsin.
FETCH cursor_adı BULK COLLECT INTO koleksiyon_name LIMIT 1000;
📌 FORALL Kullanırken:
Sıralı bir koleksiyon kullanılmalıdır.
Eğer bir hata olursa, tüm işlemler iptal olur.
FORALL i IN 1 .. v_hastalar.COUNT SAVE EXCEPTIONS
INSERT INTO hastalar_yedek VALUES v_hastalar(i);
📢 SAVE EXCEPTIONS kullanarak hataları yakalayabilirsin!
- Sonuç
🎯 Özetle:
✅ BULK COLLECT, toplu veri okumak için kullanılır.
✅ FORALL, toplu veri yazmak için kullanılır.
✅ PL/SQL ve SQL motoru arasındaki gereksiz işlemleri azaltarak performansı artırır.