3 Ekim 2012 Çarşamba

Oracle’da Prosedürel Parametreler

 Oracle’da Prosedürel Parametreler ve NOCOPY Deyimi

Herkese Selam,
Bugün sizlere Oracle’da genellikle fonksiyon ve prosedürlerde sık olarak kullandığımız parametre tiplerinden, bunların davranış biçimlerinden ve bunlara bağlı olarak NOCOPY deyiminin ne olduğundan ve etkilerinin neler olabileceğinden bahsedeceğim.
Parametre Tipleri 
Oracle’da kullandığımız prosedürel parametre tipleri 3 tanedir. Bunlar IN, OUT ve IN OUT‘dur. Bu parametrelerin nasıl tanımlanacağı söz deyim olarak aşağıda gösterilmiştir.

CREATE PROCEDURE tmp (x IN NUMBER, y IN OUT VARCHAR2, z OUT VARCHAR2) IS BEGIN NULL; END;

Şimdi kısaca bu parametre tiplerini kısaca açıklayalım. 
IN Paramteresi: Bu parametre tipi Oracle tarafından default olarak belirlenmiş parametre tipidir. Prosedür ve fonksiyon yazarken yukarıda bahs ettiğimiz  parametre söz deyimlerinden herhangi birini özellikle belirtmediğimiz sürece Oracle parametremiIN olarak tanımlar. Pass by Reference mantığına göre çalışmaktadır. Yani IN parametresi alan bir prosedür’ü çağırdığımızda, IN parametresine gönderdiğimiz değişkenin yada değerin yalnızca memory’deki adresi prosedüre gönderilir. IN parametresinin en önemli özelliği ise Read Only olmasıdır. Prosedüre gönderdiğimiz değer eğer IN tipinde ise bu değer prosedür içinde yalnızca okunabilir. Üzerinde değişiklik yapılamaz. Üzerinde değişiklik yapıldığı takdirde compile-time ‘de hata alınır.

Örnek Çağırım: 
CREATE PROCEDURE tmp_2 (x IN NUMBER, y IN VARCHAR2)
IS
sonuc NUMBER := 0;
BEGIN
sonuc := x + y;
END;
—Çağırma Kısmı
EXEC tmp_2(10,20);
Out Parametresi: OUT parametresi, isiminden’de anlaşılabileceği gibi, prosedür veya fonksiyonda OUT olarak tanımlanmış parametreyi, ilgili prosedür veya fonksyonu çağıran alt programa geri gönderen parametre yapısıdır. Kullanımı oldukca sıktır çünkü bize fonksiyon ve prosedürlerden geriye birden fazla değer döndürmemizi sağlamaktadır. Çalışma yapısı pass by value dur.
Örnek: 
CREATE PROCEDURE tmp_2 (p_x IN NUMBER, p_y IN VARCHAR2, p_z OUT VARCHAR2)
IS
BEGIN
p_z := p_x + p_y;
END;
—Çağırma Kısmı
DECLARE
v_sonuc NUMBER := NULL;
BEGIN
tmp_2 (10, 20, v_sonuc);
DBMS_OUTPUT.put_line (v_sonuc);
END;
Yukarıdaki örnekte çağırma kısmından’da göreceğimiz gibi null olarak yollanan değerin(v_sonuc) prosedür içinde dolup çağırılan yere geri döndürülmesi ile değer console’a yazılmıştır. Burada ilgi çekici bir diğer noktada bu değerin dolup geri dönmesine karşın dolduğu prosedürde herhangi bir return söz deyimi kullanmayışımızdır. Unutmamalıdırki daha öncede bahse ettiğimiz gibi fonksiyon ve prosedürlerden bu yöntem sayesinde birden fazla değer geriye döndürülebilmektedir.
IN OUT ParametresiBu parametrenin çalışma yapısı pass by value’dur. IN OUT olarak tanımlanan parametre aslında hem IN hemde OUT parametre tipinin özelliğini ortak barındırır. IN paramtresinin yalnızca Read Only olduğundan bahs etmiştik bu yüzden üzerinde değişiklik yapıldığı takdirde compile time da hata alınacağını söylemiştik fakat bu durum IN OUT tanımlanan  parametreler için geçerli olmamaktadır. Bu tip parametrelerin hem değerleri üstünde değişiklik yapılabilemektedir hemde değiştirilen değerin son hali geriye döndürülebilmektedir.
Örnek:
CREATE OR REPLACE FUNCTION add_x_y (p_x IN NUMBER, p_y IN NUMBER, p_result IN OUT NUMBER)
RETURN NUMBER
IS
BEGIN
p_result := p_x + p_y;
RETURN 1;
END;
DECLARE
v_a NUMBER;
v_result NUMBER:=150;
BEGIN
v_a := add_x_y (10, 20, v_result);
DBMS_OUTPUT.put_line (‘Result: ‘ || v_a || ‘ Sonuc: ‘ || v_result);
END;
Yukarıda Parametreleri ve çalışma mekanizmalarından bahs ettik. Şimdi bu parametrelerin oluşturabileceği performans problemlerine karşı yazılabilecek NOCOPYhint’inden bahs edeceğim.

NOCOPY Hint’nin Kullanımı
PL/SQL ‘de 3 tip parametre kullanıldığını yukarıda ayrıntılı bir şekilde açıkladık. IN-OUT-IN OUT.  Bu parametre tiplerinden OUT ve IN OUT’un pass by value mantığında çalıştığından  bahs ettik. Bu konuyu biraz daha açıcak olursak pass by value yönteminde ilgili prosedür veya fonksiyona gönderilecek değer ilgili fonksiyon ve prosedürün kullanımı için memory’de başka bir alana kopyalanmaktadır.  İşte bu konu ile ilgili performans handikapları bu noktada başlamaktadır. Eğer gönderdiğimiz parametre büyük bir collection(array), record veya büyük boyutlu objeler ise bu değişkenlerin memory’de başka bir alana kopyalanmaları oldukça uzun sürecektir. Buda sorgu zamanlarımızı olumsuz yönde etkileyecektir.  Execution Time’mımız ve memory kullanımımız artacaktır. Bu handikap’ı engellemek için NOCOPY hintini OUT ve IN OUT parametreleri için kullanabilmekteyiz. Bu hinti ilgili parametrelerin yanına yazdığımız takdirde paramterenin çalışma yapısı pass by value’dan pass by reference’a dönecektir. Yani değişkenin içeriği kopyalanmaktansa, memory’deki adresi ilgili fonksiyon veya prosedüre gönderilecektir.
Örnek Tanımlama: 
CREATE OR REPLACE FUNCTION add_x_y (p_x IN NUMBER, p_y IN NUMBER, p_result IN OUT NOCOPY NUMBER)
RETURN NUMBER
IS
BEGIN
p_result := p_x + p_y;
RETURN 1;
END;

NOCOPY Hint’nin Olası Etkileri
NOCOPY kullanmadığımız bir case düşünelim. NOCOPY hinti kullanmadığımız için out ve in out paramterelerinin default olarak  pass by value mantığına göre çalışacağını biliyoruz. Bu case’de ilgili prosedür ve fonksiyonu çağıran alt programda, fonksiyon veya prosedürden döndüldükten sonra beklenmeyen veya handle edilmemiş bir exception dan kaynaklı çalışmanın durdurulduğunu varsayalım. Bu durumda kullanılan parametreler memory’de başka bir alana kopyalanıp değiştirildiğinden ötürü (yani orjinal hallerinin hala durmakta) işlemlerin ROLLBACK edilmesi mümkün olabilecektir. Bunun tam tersi bir durum oluştuğunu düşündüğümüz takdirde(NOCOPY hinti kullanacağımız durum), çalışma mekanizmasının pass by refrence’a döneceğinden ötürü değerlerin memory’de tek bir yerde duracağı ve değişikliklerin yalnızca burada yapılacağı aşikardır. Bu case’de de ilgili prosedür ve fonksiyonu çağıran alt programda, fonksiyon veya prosedürden döndüldükten sonra beklenmeyen veya handle edilmemiş bir exception dan kaynaklı çalışmanın durdurulduğunu varsayalım, işte bu sefer değişken memory’de tek bir kopya olduğundan ve muhtemelen orjinal kopyasının değişmesinden dolayı işlem ROLLBACK edilemeyecektir. Bu durumdan’da anlaşılacağı gibi kontrollü bir Exception Handling yaptığımız zaman NOCOPY hintinden pozitf anlamda faydalanmamız mümkün olacaktır. Aksi takdirde işlemlerimizi rollback etmek pek mümkün olamayacaktır.
Brr diğer etki ise Remote Procedure Call(RPC) işlemlerinde karşımıza çıkmaktadır. Uzak prosedür çağırımları yapıları gereği yalnızca pass by value mantığı üzerine çalıştıklarından dolayı  yazılan NOCOPY hinti çalışmayacaktır. Bu sebepten dolayı RPC  işlerinde NOCOPY kaynaklı performans iyileşmesi beklenmemelidir.
NOCOPY’nin Yoksayılacağı Durumlar
Aşağıda listelenecek durumlar oluştuğunda NOCOPY hinti ignore edilir.
1- Gerçek parametre bir tabloya ait  index bileşeni ise,
2- Gerçek parametre NOT NULL olarak işaretlenmiş bir constrainted ise,
3- Gerçek parametre %ROWTYPE veya %TYPE tipinde tanımlanmış Recordlar’dan oluşuyor ve kayıtlarla ilgili kısıtlamalar farklı ise,
4- Implicit bir data tipi dönüşümü gerekli ise,
5- External veya Remote procedure call yapılıyor ise,
NOCOPY Hinti ignore edilir.

3 Ocak 2012 Salı

Oracle Grid Infrastructure Architecture

Oracle Clusterware
                Cluster şekil 1 dede görüldüğü üzere birbirinden bağımsız ancak aralarında haberleşmeyi sağlayan interconnect denilen bir bağ ile birbirini gören makinelerin yapısıdır.Cluster yapısı performansı artırmak, kesintisiz erişim sağlamak ve yük dengelemek amacıyla kurulur.

Şekil 1 = Cluster Yapısı

                            
                Oracle Cluster yapısı ise Oracle Grid infrastructure temelidir.ASM (Automatic Store Management by oracle for oracle database) ile entegre çalışabilir.ASM cluster file system (ACFS) temelini oluşturur.Oracle cluster yapısı sadece oracle db için değil başka uygulamalar içinde cluster yapısı olarak kullanılabilir.Örneğin Apache server. Aşağıda oracle clusterware servislerini tanımlanmıştır.

·         Cluster Management: Cluster servislerinin ve uygulama kaynaklarının monitor edilmesine  ve cluster içindeki herbir node için yönetimine izin veren servislerdir.
·         Node Monitoring: Herbir nodun gerçek zamanlı monitor edilmesi, ulaşılabilir olması ve desteklediği kaynakları yönetebilme kapasitesi sağlayan servislerdir.
·         Event Services: Cluster içindeki değişimlerin yayınlandığı servislerdir.
·         Time Synchronization : Cluster içinde ki tüm nodaların zmaanlarının senkron olması gerekir.
·         Network Management: Virtual ip ler ile uygulamanın cluster içindeki ulaşılabilir node ları görmesi sağlanır.Bununla birlikte Grid Naming Service (GNS) network içindeki isim çözme işlemini üstlenir.
·         High Availability : Gerektiğinde tüm servisler restart edilebilir ve uygulama kaynakları için monitor edilebilir.
Oracle Clusterware Network yapısında ise şekil 2 dede görüleceği üzere her bir node üzerinde 2 adet Network Interface Kart olmalıdır.Bunlardan bir tanesi nodalerın birbiri ile haberleşeceği private network diğeri ise switch vasıtası ile clientlere erişim sağlayan public networku oluşturur.Private networke interconnect de denir.Private network UDP veya RDS desteklemelidir.Public network ise TCP desteklemelidir.


Şekil 2 : Oracle Cluster Network


                
                Netstat komutu ile interconnect hatalarını görebiliriz.Ayrıca ifconfig komut ilede düşen paketler gözlemlenebilir.
                Oracle Clusterware processleri init daemon deniken /etc/init.d/init.ohasd scripti ile başlatılır.Vlusterware başlatılması /etc/inittab içeriği dünelenerek değiştirilebilir.Şekil 3 de göreceğiniz clusterware processllerinin neler olduğunu aşağıda açıklıyor olacağız.


Şekil 3: Oracle Clusterware Processes


Şekil 4 de Clusterware Prosesslerinin neler olduğunu bulabilirsiniz.Daha sonra ise bu servisler hakkında açıklamlara göz atalım.

Şekil 4: Oracle Clusterware processes Architecture
 

·         Cluster Ready Service (CRS) :Crs Process cluster içindeki high availability operasyonlerı yönetir.Bu servise Tüm cluster bazında değerlendirilecek cluster kaynaklarını ve herbir node için değişebilen local kaynakları yönetir.
·         Cluster Synchronization Service (CSS):Servis cluster configurasyonuna ait bilgileri yönetir.Ynai hangi node cluster uyesi yada hangi node cluster çıkarılmış..Servis 3 proses halinde çalışır. Bunlar ocssd (Css daemon), cssdagent (Css Agent), cssdmonitor (Css Monitor).
·         Disk Monitor (diskmon):Exadata storage servislerini yöneten prosesdir .Exadata rac sistemine herhangi zamanda yeni bir rac eklenebilir.
·         Event Manager (EVM):Oracle Clusterware değişimlerini yayınlayan background processdir.
·         Multicast Domain Name Service (mDNS):DNS taleplerinin sağlanmasını yönetir.
·         Oracle Grid Naming Service (GNS):Clusterware mDNS ile Dış DNS server arasında bir kapı niteliği taşır.GNS process cluster içindeki isim çözme işini üstlenir.
·         Oracle Notification Service(ONS):Oracle tarafından alınan alarm yada Bildirileri yayınlayan servisdir.         
·         Oracle Root Agent (orarootagent):Network veya Grid VIP address gibi kaynakların root tarafından CRSD prosessi ile yönetilmesini sağlayan prosesdir.
·         Cluster Kill Daemon (oclskd):CSS tarafından belirlenen instance taleplerinin taşınmaısını sağlar.
·         Grdi IPC Daemon (gipcd):Altyapı haberleşmesinde rol oynar.
Grid Naming Service  (GNS)
Varsayalım public network üzerinde çalışan bir DHCP var ve VIP adrese yada SCAN adrese atayabilecek yeterli ip var.GNS cluster için bir adet statik ip tutar.Buna GNS VIP IP de denir.Bu adress DNS domaine kayıt edilmelidir.GNS cluster içinde mDNS Multicast DNS set eder ve bu DNS sercer içinde statik bir konfigurasyon olmadanda diğer nodların isim çözme işlevini görür.
GNS kullanmak için DNS admin tarfından cluster ait domainin subdomainlerine yayın yetkisi verilmelidir.Single Client Accces Name ise clientların cluster’a bağlanırken kullandığı addresdir.Ancak Bu adress dinamik olarak virden çok ip adresine bakar.Böylece yük dağılımı sağlanır ve ip sabit olmadığı için sürekli availability de sağlanmış olur.Scan ip adresler cluster ip adresslerle aynı subdomainde olamalıdır.
cluster01.example.com         192.168.2.155
cluster01-scan. cluster01.example.com         192.168.2.200
cluster01-scan. cluster01.example.com         192.168.2.201
cluster01-scan. cluster01.example.com         192.168.2.202
SCAN 11 g r2 ile gelmiş bir özelliktir.Scan kullanabilemek için REMOTE-LISTENER parametresi scan listener’a bakacak şekilde aşağıdaki gibi set edilebilir.
ALTER SYSTEM SET REMOTE_LISTENER= cluster01-scan. cluster01.example.com:1521

Aşağıdaki srvctl komutları ilede scan listener yönetilebilir.
·         srvctl config scan :Scan konfgürasyonunu gösterir
·         srvctl config scan_listener:Scan listenera ait portu gösterir
·         srvctl add scan -n cluster01-scan:Cluster için Teni scan bilgisi ekler
·         srvctl remove scan –f:Scan Bilgisini kaldırır.
·         srvctl add scan_listener:Default port 1521 ğüzerinden yeni scan ekler
·         srvctl add scan_listener -p 65001 ## non default port number ##:Yeni scan bilgisi ekler
·         srvctl remove scan_listener:Scan Listener ‘ ı kaldırı.
·         srvctl modify scan -n cluster_scan: Scan bilgisini değiştirir. (dns için scan değiştiriken /etc/hosts değiştirildikten sonra kullanılır.)
·         srvctl modify scan_listener –u:Scan listener bilgisini yeni scan vip bilgisi ile uyum sağlaması için düzenler.

1 Ocak 2012 Pazar

Oracle Exadata Database Machine

                                                                                          Oracle Exadata Database Machine
 Oracle Exadata Database Machine, hem veri ambarı    hem de online işlem işleme (OLTP) uygulamaları için olağanüstü bir performans sağlayan tek veritabanı makinesidir ve bu özellikler grid ve özel bulut bilgi-işlem ağlarına konsolide etmek için ideal bir platform olmasını sağlar. Tamamen ölçeklenebilir, güvenli ve yedekli sunucular, depolama, ağ ve yazılımdan oluşan eksiksiz bir pakettir. Oracle Exadata Database Machine'le müşteriler, konsolidasyon aracılığıyla BT maliyetlerini düşürebilir, birden çok sıkıştırma katmanında daha fazla veri yönetebilir, tüm uygulamaların performansını artırabilir ve gerçek zamanlı olarak daha iyi iş kararları almayı sağlayabilir.

Veri ambarları için üstün performans—Exadata Smart Scan yoğun sorgu işleme işlemini ve veri araştırma değerlendirmesini ölçeklendirilebilir akıllı depolama sunucularına aktararak sorgu performansını geliştirir.
OLTP uygulamaları için üstün performans—Exadata Smart Flash Cache 'sık kullanılan' verileri hızlı katı hal depolamasında saydam bir şekilde önbelleğe alarak sorgu yanıt sürelerini ve işlem hacmini geliştirir
Konsolide iş yükleri için üstün performans—Exadata'nın dev paralel kılavuzu, veri ambarı ve OLTP uygulamalarının konsolidasyonu için idealdir ve Exadata hizmet kalitesi kaynak yönetim özellikleri tüm kullanıcılar için hızlı yanıt sürelerini güvence altına alır

Exadata Storage Teknolojileri
Exadata Smart Scan, yalnızca uygun satırları ve sütunları veritabanı sunucusuna döndürerek sorguları depolama katmanında işler. Bunun sonucu olarak, hızlı 40GB InfiniBand ara bağlantılarında çok daha az veri dolaşır; böylece, basit ve karmaşık sorguların hem performansında, hem de eş zamanlılığında önemli artış sağlanır.
Exadata Smart Flash Cache, 'çok' sık kullanılan verileri hızlı katı hal depolarında saydam bir şekilde ön belleğe alarak disk rastgele G/Ç darboğazı sorununu çözer. G/Ç yanıtını on kat hızlı alıp on kat daha az disk alanı kullanırsınız.
Exadata Hybrid Columnar Compression, veri ambarı tablolarını ortalama 10 kat, arşiv tablolarını da 50 kat daha küçük boyuta düşürebilir. Bu, birincil, beklemedeki ve yedek veritabanlarına gereken disk alanında önemli bir tasarruf sağlar ve veri ambarı sorgularının performansını geliştirir.