INVALID OBJECTS RECOMPILE

Okudum bildim deme
Çok taat kıldım deme
Eğer Hak bilmez isen
Abes yere gelmektir –Mevlana

Merhaba

bugünkü yazımızda oracle package procedure vb.. invalide düşen objeleri görme ve istenirse tek tek, istenirse de tümünü nasıl compile ederiz onu inceleyeceğiz

kaç kayıt var bir bakalım…

---

SELECT count(*) FROM dba_objects
 WHERE object_type IN ('PACKAGE', 'PACKAGE BODY') 
  -- buraya istenilen objeler eklenebilir...
   AND status != 'VALID';

----

 

invalid objeleri sırayla compile etmek için

----

BEGIN
  FOR cur_rec IN (SELECT owner,
                         object_name,
                         object_type,
                         DECODE(object_type, 'PACKAGE', 1,
                                             'PACKAGE BODY', 2, 2) AS recompile_order
                  FROM   dba_objects
                  WHERE  object_type IN ('PACKAGE', 'PACKAGE BODY')
                  AND    status != 'VALID'
                  ORDER BY 4)
  LOOP
    BEGIN
      IF cur_rec.object_type = 'PACKAGE' THEN
        EXECUTE IMMEDIATE 'ALTER ' || cur_rec.object_type || 
            ' "' || cur_rec.owner || '"."' || cur_rec.object_name || '" COMPILE';
      ElSE
        EXECUTE IMMEDIATE 'ALTER PACKAGE "' || cur_rec.owner || 
            '"."' || cur_rec.object_name || '" COMPILE BODY';
      END IF;
    EXCEPTION
      WHEN OTHERS THEN
        DBMS_OUTPUT.put_line(cur_rec.object_type || ' : ' || cur_rec.owner || 
                             ' : ' || cur_rec.object_name);
    END;
  END LOOP;
END;

----

 

tümünü tek seferda yapan metodlar

--recomp all

-- Schema Duzeyinde.
EXEC UTL_RECOMP.recomp_serial('SCOTT');
EXEC UTL_RECOMP.recomp_parallel(4, 'SCOTT');

-- Database Duzeyinde.
EXEC UTL_RECOMP.recomp_serial();
EXEC UTL_RECOMP.recomp_parallel(4);

-- Paralel job kullanarak.
EXEC UTL_RECOMP.recomp_parallel();
EXEC UTL_RECOMP.recomp_parallel(NULL, 'SCOTT');
--

 

COMMIT WRITE NOWAIT PARAMETRESI

 

MerhabaArkadaşlar.

Loglama yapıları üzerinde biraz araştırma yaparken karşılaştığım ve çok hoşuma giden bir yapıdan bahsedeceğim.

“COMMIT WRITE”
Oracle 10g2xxx ve üzerinde
Bir o kadar kolaylık sağlayan bu komut aynı zamanda bir o kadar da tehlikelidir. Direkt redologlara müdehale ediyorsunuz ki… Bunun tehlikesini tahmin ediyorsunuzdur umarım. etmiyorsanız canlı ortamlarda kullanmamanızı tavsiye ederim.

COMMIT WRITE BATCH NOWAIT; -- Can kurtaran 🙂

Batch comutu ekleyerek, verilen data Redelog dosyalarına yazılmadan öce buffer’a alınarak tampon belleğe almış oluyoruz ve transaction hızını artırmış oluyoruz.

Ama asıl bahsetmek istediğim iş Nowait : Database in işlem sırasını atlatıyoruz diyebiliriz. bir işe öncelik tanıyoruz.(Torpil geçiyoruz)Commitle verilen datanın diske yazılmasını beklemeden, yerine yeni bir iş alır. Data bütünlüğü düşünülmeyecek işler için uygun olabilir. Kayıp olasıdır….

Örnek: Sisteminize giriş yapan kullanıcıların logunu tutmak istiyorsunuz. Aynı anda yüzlerce, binlerce kullanıcı sisteme giriyor ve çok yoğun bir sisteminiz var. Veya veritabanında yaptığınız insert, update, delete işlemlerinde bir hata alınınca bunları loglamak istiyorsunuz.
Bunların veri bütünlüğüne ihtiyacı yoktur. Yani bir log kaydı yazılamama ihtimalinde sizi çok büyük sorumluluklar beklememektedir. bunlar sizin işlerinizi kolaylaştırmak için yaptığınız çalışamalardır. Burada NOWAIT komutunu kullanmak akıllıcadır.
Ama bir ödeme yapan sisteminizi düşünelim. bu kaydın veri bütünlüğü şarttır. arkasında ciddi sorumluluklar vardır. İşte burada WAIT metodu devreye giriyor. yani bu commit diske kaydedilmeden, yeni bir işlem kesinlikle almayacaktır.

 

Olayı daha iyi anlamak adına Daha önce yapılmış bir testi de paylaşmak istiyorum.

   DECLARE
      SD DATE;
    BEGIN
     FOR I IN 1..150000 LOOP
      UPDATE EMP SET counter = counter + 1 WHERE EMPno=7499;
      commit;
     END LOOP;
    END;
    /

PL/SQL procedure successfully completed.

Elapsed: 00:00:15.02

--------------------------------------------------------

    DECLARE
      SD DATE;
    BEGIN
     FOR I IN 1..150000 LOOP
      UPDATE EMP SET counter = counter + 1 WHERE EMPno=7499;
      commit write batch nowait;
     END LOOP;
    END;
    /

 successfully completed.

Elapsed: 00:00:14.09
---------------------------------------------------------------  
   DECLARE
      SD DATE;
    BEGIN
     FOR I IN 1..150000 LOOP
      UPDATE EMP SET counter = counter + 1 WHERE EMPno=7499;
      commit write immediate wait;
     END LOOP;
    END;
    /

PL/SQL procedure successfully completed.

Elapsed: 00:02:20.06