Oracle’da Segmentler ve Özellikleri

Herkese Selam,

Bu yazımda sizlerle Tom KYTE’ın da Expert Oracle kitabında Terminology başlığı altında işlemiş olduğu, Oracle’da bellek mekanizamsı ile ilgili çeşitli kavramlar ve parametrelerden bahsedicem.

Bahsediceğim kavramları sıralıyacak olursak,

– Segment

– Free List

– PCTFREE

– PCTUSED

– LOGGING

– NOLOGGING

– MAXTRANS

– INITTRANS

SEGMENT

Oracle terminolojisi içinde Segment, Disk üzerinde belli bir alan ifade eden kavramdır. Bu bağlamda Disk’i segmentler toplamı olarak düşünebiliriz. Oracle’da farklı segment tipleri mevuttur. Kısaca bu segment tiplerine değinecek olursak;

– Cluster (Küme): Tablo saklama yeteneğine sahip segment tipidir. Clusterlarında 2 farklı tipi mevcuttur. Bunlar B* Tree ve Hash cluster tipleridir. Clusterlar genellikle, birden çok tablonun aynı database bloğu üstünde ilişkilendirilmesi(join) ile oluşmuş ve ilişki(join) sonucu ortaya çıkan bilgileri tutan bölgelerdir. Bu ilişkilendirilmiş bilgi tek bir tabloymuş gibi clusterlar üstünde depolanmaktadır. Buradan yola çıkarak küme(cluster) kavramından, ilişkili bilgilerin fiziksel olarak aynı yerde tutulduğu yargısına varabiliriz.

– Table :  Tablo segmenti , database tablolarını içinde barındıran segment yapısıdır. En genel segment yapısıdır ve, index segmentler ile bağlanarak kullanılırlar.

– Table Partition: Bu segment yapısı Oracle’da partition işlemleri için kullanılmaktadır. Tablo segment yapısına çok benzemektedir. Partition segment yapısı, tablo içinde belirli bir kurala göre ayrılmış data parçalarını tutmaktadır (Örneğin bir tabladaki kayıtları aylık olarak parçalara ayırdığımızı düşünürsek, bu  durumda her parça bir partition segment’e denk düşmektedir.)

– Index Partition:  Table partition segemnt yapısı ile benzerlik göstermektedir ancak bunun farkı içinde indexler barındırmasıdır.

– Lob Partition, Lob Subpartition, Lobindex, ve Lobsegment: Lobindex ve lobsegmentler büyük data yapısına sahip objeleri tutmaktadırlar. Örnek olarak LOB data tipine sahip değişkenleri düşünebiliriz.

LOB partition içeren bir tabloda, lobsegment yapısıda bölümlendirlmiş(partition) olacaktır. Lobsegment bu sebepten dolayı kullanılmaktadır. (Lobpartitionlara alanlar ayırmak için.).

Oracle’da aslında Lobindex diye bir segment yapısı mevcut değildir, genellikle index partitionlar Oracle tarafından Lobindex olarak adlandırılabilir.

– Nested Table: Nested Tablolar içinde atanmış segment tipidir. Nested tablolar, normal tabllarımızın özel bir tipidir. Bu tablolar master/detail tarzda ilişkileri barındırır. 

Örnek:

create or replace type my_type is table of varchar2(50);

create table my_nested_table (tab_id number, colA my_type)                             NESTED TABLE  colA Store As colA_tab;

– Rollback : Rollback segmentler DBA’ler tarafından manuel olarak yaratılan segmentlerdir. Geri dönüşlerin nasıl yapılacağı ile ilgili tarifler bu segmentlerde tutulmaktadır.

Database’ini üzerinde yarattığınız segmentleri görüntülüyebilmek için

select * from user_segments; komutunu yazabilirsiniz.

PCTFREE ve PCTUSED

PCTFREE değeri bize her data bloğunda  Oracle’ın ileride update işlemlerinde kullanmak için ne kadarlık bir boş alan bırakacağını söyleyen parametredir. Tablo yaratırken özellikle belirtmezise default olarak %10 şeklinde setlenir. Eğer %10 dan daha fazla bir boş alan bırakılmasını istiyorsak tablo yaratırken bu değeri manuel olarak belirtmek durumundayız.   Sürekli update göreceğini düşündüğümüz tablolarda bu değeri yüksek vermek, birbirleri ile alakalı bilgilerin aynı datablock’da saklanacağını garanti altına alacaktır. Aksi takdirde fragmentation olayı meydana gelecektir. Bu şekilde disk kapasitemizi efektif oalrak kullanamayabiliriz.

PCTUSED değeri ise databloğun doluluk oranına göre freeliste’e eklenip eklenemiyeceği bilgisini vermektedir. Eğer tablo yaratırken belirlemez isek default olarak %40 olarak setlenir. Bunun anlamı databloğunda kullanılan alan %40 ın üstüne çıkmadığı sürece ilgili data bloğunu, yeni insert işlemlerinin yapılabilmesi için freelist’de tut almaına gelmektedir. Eğer datablok’daki doluluk oranı %40’ı bulursa, ilgili datablok freelist’den çıkarılır.

Tablolarımızın yapısına göre bu parametreleri manuel olarak ayarlamak en doğusu olacaktır. Örneğin oluşturduğumuz tabloya yalnızca insert ve delete yapılıyorsa veya yapılan update’ler row lara üzerinde yeni bir kolon ekleme yönünde değilse bu durumda PCTFREE değerini sıfıra yaklaştırmak ve PCTUSED değerini 100’e doğru yaklaştırmak daha mantıklı olacaktır. Alakalı bilgilerin fiziksel olarak aynı yerde durmaları I/O sayımızı azaltıp sorgu performanslarımızı arttıracaktır. Her halukarda PCTUSED değerini yüksek tutmak diskimizin fragmente olmasını engelleyerek diskimizi daha etkin kullanmamızı sağlayacaktır.

LOGGING ve NOLOGGING

Normal şartlar altında Oracle’da neredeyse her obje LOGGING olarak yaratılır, bunun anlamı o objenin içinde bulunduğu her operasyonun bir redolog üreteceğidir.  NOLOGGING ise obje üstünde yapılacak hiç bir işlemin redo üretmeyeceğini bize söylemektedir.

NOLOGGING, yanlızca bir kaç spesifik işlemi etkilememektedir. Bunlar, objelerin yaratılma anları, database objelerinin rebuild edilmesi ve SQL*Loader kullanarak doğrudan path yüklenmesi.  Bu seçim genel olarak objelerin redolog üretimlerini engellemezler bir kaç spesifik durum haricinde. Örnek olarak bir tabloyu Create as Select NOLOGGING şeklinde yarattığımızı düşünelim ve tabloya bir kayıt insert edelim, bu case’de insert işleminin loglandığı ama crate işleminin “as Select NOLOGGING” deyiminden dolayı loglanmadığı görülebilir. İstisnai bir durum olmasına karşın bu tarz bir case yaşanabilir. Ama normal şartlar altında objelerin yaratılma esnalarında log üretiminin yapıldığını düşünebiliriz.

MAXTRANS ve INITTRANS

Segmentler içindeki her datablok bir blok headerına sahiptir. Blokların başlık kısımlarıda transaction tablosudur. Bu tablodaki entryler hangi transactionının datablok üzerindeki hangi satırı veya elemanı lock’ladığını gösterir. INITTRANS parametresi ile Transaction tablosunun büyüklüğünü belirleriz. Manuel olarak belirtmediğimiz sürece bu parametreye default olarak 2 atanmaktadır. MAXTRANS değeride, Transaction tablosunun gerektiğinde  dinamik olarak maximum nekadar büyüyeceğini söylemektedir. MAXTRANS’da INITTRANS’da 1-255 scalası arasında değerler alabilmektedir. MAXTRANS değeri set edildikten sonra Oracle tarafından transaction tablosu için hafızada gerekli yer açılır.(Her transaction entryside tabloda 23, 24 byte block header da yer kaplamaktadır.)

Kaynak: Tom Kyte, Expert Oracle- tahiti.oracle.com – Oracle SQL High Performance Tuning Prentence Hall

Advertisements

About ... from Emrah METE

Bilgisayar Mühendisi
This entry was posted in Oracle, Root and tagged , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , . Bookmark the permalink.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s