28
DERS 9 PERFORMANCE TUNİNG Problemler Performance tuning DBA olarak çalışan yada az çok oracle ile uğraşanlar için en gerekli konulardan biridir.Yazılan SQL cümlesinin optimizasyonu yada Oracle getirdiği parametreler performance açısından bize fayda yada zarar ne getirir görmemizi sağlar. Performance tuning için oracle getirdiği birkaç uygulamayı ve raporlamayı kullanabiliriz.Bunlar STATSPACK, UTLBSTAT,UTLESTAT, Oracle Enterprise Manager ve 10G ile gelen ADDM’ dir. Bizim karşımıza çıkan sorunlar, 1-)BAD SESSION MANAGEMENT = Bu tip problemlerde kullanıcının sisteme giriş çıkışı yada kullandığı toolardan kaynaklanan problemler olabilir. 2-)BAD CURSOR MANAGEMENT = Kullanılan sql cümlelerinin yaptığı işlemlerin oluşturduğu sonuçlar ve bunların kullanımı bu sebebi oluşturabilir. 3-)BAD RELATION DESIGN = Bu tip problemlerde karşımıza çıkan sorun,yapılan db dizaynının yanlış olması,tablolar arası ilişkiler yanlış olması gibi sebeplerdendir. Bu tip durumlarda performansı optimize etmenin yolarlı şu şekildedir. Database dizaynını tekrar gözden geçirip düzenlemeliyiz, Uygulamanın işleyişini düzenlemeliyiz, Makinanın memorysini güçlendirmeliyiz, İşletimim sistemini kontrol edip düzenlemeliyiz. PERFORMANS TOOLLARI Performansa girmeden önce databasede oluşan hatalar ve uyarılar için Alert.log ları incelemek lazım.ALert.log’un içinde genel hatalar örneğin(ORA-600) yada blok hataları (ORA-1498,ORA-1578) olabilmekte,yapılan db işlemleri Create Database,Shutdown,Startup ve Recover adımları. Alert.log’un yeri BACKGROUND_DUMP_DEST ile belirtilen yerdedir. Alert.log ları incelersek sistemde oluşmuş çeşitli hatalar ve uyarıları incelemiş görmüş olururz.

Performance Tuni̇ng

Embed Size (px)

Citation preview

DERS 9

PERFORMANCE TUNİNG

Problemler

Performance tuning DBA olarak çalışan yada az çok oracle ile uğraşanlar için en gerekli konulardan

biridir.Yazılan SQL cümlesinin optimizasyonu yada Oracle getirdiği parametreler performance

açısından bize fayda yada zarar ne getirir görmemizi sağlar.

Performance tuning için oracle getirdiği birkaç uygulamayı ve raporlamayı kullanabiliriz.Bunlar

STATSPACK, UTLBSTAT,UTLESTAT, Oracle Enterprise Manager ve 10G ile gelen ADDM’ dir.

Bizim karşımıza çıkan sorunlar,

1-)BAD SESSION MANAGEMENT = Bu tip problemlerde kullanıcının sisteme giriş çıkışı yada

kullandığı toolardan kaynaklanan problemler olabilir.

2-)BAD CURSOR MANAGEMENT = Kullanılan sql cümlelerinin yaptığı işlemlerin oluşturduğu

sonuçlar ve bunların kullanımı bu sebebi oluşturabilir.

3-)BAD RELATION DESIGN = Bu tip problemlerde karşımıza çıkan sorun,yapılan db dizaynının yanlış

olması,tablolar arası ilişkiler yanlış olması gibi sebeplerdendir.

Bu tip durumlarda performansı optimize etmenin yolarlı şu şekildedir.

• Database dizaynını tekrar gözden geçirip düzenlemeliyiz,

• Uygulamanın işleyişini düzenlemeliyiz,

• Makinanın memorysini güçlendirmeliyiz,

• İşletimim sistemini kontrol edip düzenlemeliyiz.

PERFORMANS TOOLLARI

Performansa girmeden önce databasede oluşan hatalar ve uyarılar için Alert.log ları incelemek

lazım.ALert.log’un içinde genel hatalar örneğin(ORA-600) yada blok hataları (ORA-1498,ORA-1578)

olabilmekte,yapılan db işlemleri Create Database,Shutdown,Startup ve Recover adımları.

Alert.log’un yeri BACKGROUND_DUMP_DEST ile belirtilen yerdedir.

Alert.log ları incelersek sistemde oluşmuş çeşitli hatalar ve uyarıları incelemiş görmüş olururz.

Alert.log lar dışında arka planda oluşan işlemleri izlemek için background trace file lar vardır.Bunlardan

da bazı izlenimler edinebiliriz.Kullanıcılarla ilgili raporlar almak içinde user trace file lar vardır.

Bu trace file rı tüm DB aktiviteleri için görebilmek için SQL_TRACE parametresini TRUE yapmak

gerekir.

Eğer Session bazlı görmek istiyorsakta ,

SQL > EXECUTE dbms_system.set_sql_trace_in_session(8,12,TRUE);

Buradaki 8 ve 12 bağlanan kullanıcıların Sistem kimlik numarası ve seri numarasını göstermektedir.

DBMS_SYSTEM package’ını aktif edebilmek için catproc.sql cümlesini çalıştırmak gerekmektedir.

Buda,

UNİX sistemlerde $ORACLE_HOME/rdbms/admin

Windows sistemlerde %ORACLE_HOME%\rdbms\admin

Bulunmaktadır.Daha sonra session bazlı aşağıdaki kodu çalıştırdığımızda kullanıcının session bazlı

aktivitesi izleyebileceğiz.

SQL> ALTER SESSION SET sql_trace=TRUE;

Bunların yanında dinamik dictionary viewlarda çoğu zaman performans ölçümünde bize yardımcı

olabilirler.Bunlar V$xxxxxxxxxxx ve DBA_XXXXXXXXX ile başlıyan viewlardır.Genellikle Segment

storage hakkında bize bilgi verirler.

V$ table ları asıl olarak X$ table larından türemişlerdir.X$ table larının ne olduğuna bakmak istersek

V$FIXED_TABLE görüntüsü kullanılabilir.

Belli zamanlarda çalıştırılacak olan utlbstat.sql ve utlestat.sql cümleleri ise yine performans ölçümünde

bize yardımcı olur.

Performans ölçümlerinde zaman bazlı istatistik almak istiyorsak parametrelerden

SQL> ALTER SYSTEM SET timed_statistics = TRUE; yapmamız gerekmektedir.

Performance viewlarını incelemek istersek,

Şekilde görüldüğü gibidir.

V$PX_PROCESS_SYSSTAT: Paralel Sorgu istatistiklerini verir

V$PROCESS: Aktif olan proseslerin bilgisini verir

V$WAITSTAT: Beklemede olan proses bilgileri

V$SYSTEM_EVENT: Toplam bekleme süresi

V$BUFFER_POOL_STATISTICS: İnsatnce başladığında buffer pool un tahsis edilen bilgisini gösterir.

V$DB_OBJECT_CACHE: Library cachde depolanan database cache’ini gösterir.

V$LIBRARYCACHE: Library cache in performans bilgisini gösterir.

V$ROWCACHE: Yanlış giden aktiviteler

V$SYSSTAT: Basit instance istatistikleri

V$FILESTAT: Datafile yazma/okuma istatistikleri

V$TEMPSTAT: Temp tablespace leri üzerine yazma / okuma istatistiği

V$ROLLSTAT: Rollback segmentlerin durumu

V$WAITSTAT: Çalışan sql ler ve diğer bilgileri için zaman istatistiği

V$LOCKoluşan kilitler

V$OPEN_CURSOR: her bir sesion da açlıp kapanan cursorlar

V$SORT_USAGE: Disk üzerinde temp alanında yapılan sort bilgileri

V$SESSTAT: Kullanıcı session bilgileri

V$SESSION_EVENT: Sesionlarda oluşan event bilgileri

V$SESSION_WAIT: Bekleyen sesionlar

V$PX_SESSTAT: Paralel yürüyen sesionlar.

Örneğin aşağıdaki sql’e bakarsak

SQL> SELECT name,class,value FROM v$sysstat;

NAME CLASS VALUE

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

logons cumulative 1 6393

logons current 1 10

opened cursors cumulative 1 101298

table scans (short tables) 64 6943

table scans (long tables) 64 344

table scans (rowid ranges) 64 0

redo entries 2 1126226

redo size 2 816992940

redo buffer allocation

retries 2 1461

redo wastage 2 5874784

……

The results shown are only a partial display of the output.

Class ların anlamıda şu şekildedir.

• Class 1 refers to general instance activity.

• Class 2 refers to redo log buffer activity.

• Class 4 refers to locking.

• Class 8 refers to database buffer cache activity.

• Class 16 refers to OS activity.

• Class 32 refers to parallelization.

• Class 64 refers to tables access.

• Class 128 refers to debugging purposes.

Tabiî ki tek başına bu tabloya bakmak bize hiçbir anlma ifade etmiyecektir.

SQL> SELECT * FROM v$sgastat;

POOL NAME BYTES

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

fixed_sga 46136

db_block_buffers 409600

log_buffer 524288

shared pool free memory 8341616

shared pool SYSTEM PARAMETERS 42496

shared pool transaction 64800

shared pool dictionary cache 156524

shared pool library cache 358660

shared pool sql area 551488

Bu viewları etkin kullanmak ve doğru raporlar almak istiyorsak ararlındaki ilşkiyi iyi kurmak gerekir

SQL> SELECT sid, username, type, server FROM v$session;

SID USERNAME TYPE SERVER

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

1 BACKGROUND DEDICATED

2 BACKGROUND DEDICATED

3 BACKGROUND DEDICATED

4 BACKGROUND DEDICATED

5 BACKGROUND DEDICATED

6 BACKGROUND DEDICATED

9 SYSTEM USER DEDICATED

10 HR USER NONE

11 SH USER SHARED

Örneğin SGA da 30.000 byte tan daha fazla memory harcıyan sessionları görmek istersek,

SQL> select username,name,value

2 from v$statname n, v$session s, v$sesstat t

3 where s.sid=t.sid

4 and n.statistic#=t.statistic#

5 and s.type=’USER’

6 and s.username is not null

7 and n.name=’session pga memory’

8* and t.value > 30000;

USERNAME NAME VALUE

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

SYSTEM session pga memory 468816

Örneğin bekleyen sessionları görmek istiyorsakta,

SQL> select sid, event

2 from V$SESSION_WAIT

3* where wait_time = 0;

SID EVENT

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

1 pmon timer

2 rdbms ipc message

3 rdbms ipc message

9 rdbms ipc message

16 rdbms ipc message

17 rdbms ipc message

10 rdbms ipc message

4 rdbms ipc message

5 smon timer

STATSPACK

Performansla ilgili görebileceğimiz asıl toll lardan biride statspack raporlarıdır.Bu raporları

başlatabilmek için öncelğikle birkaç işlem yapmamız gerekmektedir.

Statspack yüklemek için

$ORACLE_HOME/rdbms/admin/spcreate.sql cümlesini çalıştırmamız gerekir.

İstatistik toplamak için

execute STATSPACK.snap çalıştırmamız gerekir.

İstatistikleri otomatik toplamak istiyorsak,

$ORACLE_HOME/rdbms/admin/spauto.sql çalıştırmamız gerekir.

Rapor üretmek istiyorsak

$ORACLE_HOME/rdbms/admin/spreport.sql çalıştırmamız gerekir.

Zamanlama işlemleri içinde ağağıdaki parametreyi ayarlamamız gerekir.

TIMED_STATISTICS = true

Statspack başladıktan sonra otomatik olarak Perfstat isimli bir kullanıcı oluşur.

StatSpack raporlarıyla sistemimiz hakkında her türlü çıktıya sahip olabiliriz.En önemlilerinden biride

TOP 5 Wait events dediğimiz,sistemde fazla bekliyen 5 aktiviteyi çıkarmasıdır.

UTLBSTAT ve UTLESTAT

Performansla ilgili görebileceğimiz diğer tollardan biride utlbstat ve utlestat dır.Bu raporları

başlatabilmek için öncelğikle birkaç işlem yapmamız gerekmektedir.

Zamanlama işlemleri içinde ağağıdaki parametreyi ayarlamamız gerekir.

TIMED_STATISTICS = true

Daha sonra raporları alabilemmeiz için

$ORACLE_HOME/rdbms/admin altındaki ,

utlbstat.sql ve utlestat.sql cümlelerini SQLPLUS’ta sysdba olarak çalıştırmamız gerekir.Ama başlangıç

olarak utlbstat.sql cümleciğini,bitiş olarakta utlestat.sql cümlesini çalıştırmalıyız.

Sistemin bekleme ve event bilgileri ile ilgili bi kaç sql çalıştırmak gerekir,

SQL> SELECT name, parameter1, parameter2, parameter3

FROM v$event_name;

NAME PARAMETER1 PARAMETER2 PARAMETER3

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

PL/SQL lock timer duration

alter system set mts_dispatcher waited

buffer busy waits file# block# id

library cache pin handle addr pin address 0*mode+name

log buffer space

log file switch

(checkpoint incomplete)

transaction undo seg# wrap# count

...

286 rows selected.

V$SYSTEM_EVENT: Tüm Sessionlar için bir eventin toplam bekleme süresini toplu olarak verir,

V$SESSION_EVENT: Herbir Session için bir eventin toplam bekleme süresini verir,

V$SESSION_WAIT: Session bazlı aktif bekliyen sessionları gösterir,

SQL> SELECT event, total_waits, total_timeouts,

time_waited, average_wait

FROM v$system_event;

EVENT TOTAL_ TOTAL_ TIME_ AVERAGE_

WAITS TIMEOUTS WAITED WAIT

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

latch free 5 5 5 1

pmon timer 932 535 254430 272.993562

process startup 3 8 2.66666667

buffer busy waits 12 0 5 5

...

34 rows selected.

• EVENT: Bekleyen event’in ismi

• TOTAL_WAITS: Bekleyen Eventlerin sayısı

• TOTAL_TIMEOUTS: Event için bekleyen timeout ların sayısı

• TIME_WAITED: Bekleyen event için toplam zaman miktarı, 1 dakikada yüzdelik olarak

• AVERAGE_WAIT: Bekleyen event için ortalama zaman miktarı, 1 dakikada yüzdelik olarak

SQL> select sid, event, total_waits,average_wait

from v$session_event where sid=10;

SID EVENT TOTAL_WAITS AVERAGE_WAIT

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

10 buffer busy waits 12 5

10 db file sequential read 129 0

10 file open 1 0

10 SQL*Net message to client 77 0

10 SQL*Net more data to client 2 0

10 SQL*Net message from client 76 0

SQL> SELECT sid, seq#, event, wait_time, state

FROM v$session_wait;

SID SEQ# EVENT WAIT STATE

TIME

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

1 1284 pmon timer 0 WAITING

2 1697 rdbms ipc message 0 WAITING

3 183 rdbms ipc message 0 WAITING

4 4688 rdbms ipc message 0 WAITING

5 114 smon timer 0 WAITING

6 14 SQL*Net message from client -1 WAITED

SHORT

TIME

SHARED POOL AYARLARI

SGA Oracle ilk açıldığında instance’ın ilk yüklendiği ve başladığı yerdir.

SGA yı adım adım incelersek,

Shared pool Shared_pool_size parametresi ile düzenlenerek kullanılır.

İçinde Libraray cahe,data dictionary cache ve UGA barındırırır.Libaray cache de Execution plan,parse

edilmiş kodlar bulunur.

Data dictionary cache de,Tablo tanımaları ve privillege gibi bilgiler bulunur.

UGA ise Large pool configüre edilmemişse Oracle Shared Server Session bilgisini barındırır.

Shared Pool’un boyut ayarı SHARED_POOL_SIZE ile olmaktadır.

Shared pool size ‘ın default değeri 8 MB’dir.İstenirse değiştirilebilinir.

Library cache sahred SQl ve PL/SQL bilgilerini içerir.Örneğin compile edilmiş

Procedurler,Triggerlar..içerir.Bir LRU algoritmasına göre yönetimi gerçekleşir.Server’ın bir Sql’e

ihtiyacı olduğunda cache bulunan sql den bu işlemi gerçekleştirip tekrar parse etmesine gerek

kalmadan bu işlemi yapmaktadır.

Library Cache Tuning

Library cache ihtiyaç duyduğunda bir sql cümlesini cache ten alıp parse etmeden getirir ama istenen

cümle eğer cache te bulunmuyorsa ,ilgili cümle parse edilir ve daha sonra library cache’ e yerleştirilir.

Fragmentasyonu önlemek için Birkaç konuya dikkat etmek gerekir.

Large Memory için gerekli yer ayrılmalıdır.

Gerekli Large Objelerini pinlemek gerekir.

Bilinmeyen PL/SQL bloklarını elimine etmek gerekir.

Library cache ile ilgili bilgileri ağağıdaki sorgudan alabiliriz.

SQL > select namespace,gets,pins,reloads,gethits,pinhits from V$LIBRARYCACHE

NAMESPACE GETS PINS

RELOAD

S

GETHIT

S PINHITS

SQL AREA 12213 39244 16 12024 38846

TABLE/PROCEDUR

E 12796 12803 0 12536 12432

BODY 2 1 0 0 0

TRIGGER 5 5 0 0 0

INDEX 3783 3752 0 3741 3710

CLUSTER 193 258 0 186 250

OBJECT 0 0 0 0 0

PIPE 0 0 0 0 0

JAVA SOURCE 0 0 0 0 0

JAVA RESOURCE 0 0 0 0 0

JAVA DATA 0 0 0 0 0

Gets : Sorgu sonucu dönen uygun değerlerin toplamı,

Pins : Her bir area için ,SQL statemntların ve procedurlerin execute sayısını gösterir,

SGASTAT tüm SGA yapısının boyutunu gösterir.

V$SQLAREA bütün shared cursorların ilk 1000 karakterleriyle birlikte bilgisini verir.

V$SQLTEXT bütün sql ler için satır satır bilgileri kısaltmaksınız verir.

V$DB_OBJECT_CACHE cache lenmiş Tablo,Synonim bilgilerini gösterir.

Shared Pool için aktivite istatistiği ve efektif kullanım yüzdesi gösteren örnek bir sql yazmak istersek.

SQL> select gethitratio

from v$librarycache

where namespace = ‘SQL AREA’;

SQL> select sql_text, users_executing,

executions, loads

from v$sqlarea;

SQL> select * from v$sqltext

where sql_text like

’select * from hr.employees where %’;

Burada gethitratio parametresi bize cursurların share edilip edilmediğ hakkında kısa bir bilgi verir.Bu

bilgi % cinsindendir.Genelde bu değer % 90 ın üzerinde olmalıdır.

Yukarıda Bir porsedürün 4 defa çalışma bilgisi görünmektedir.

SQL> select sum(pins) "Executions", sum(reloads)

"Cache Misses", sum(reloads)/sum(pins)

from v$librarycache;

Executions

Cache

Misses SUM(RELOADS)/SUM(PINS)

71120 16 0.000224971878515186

Bu Örneğe baktığımızda Bilmemiz gereken reloadslar pinlerin % 1 den daha ufak olmalıdır.Eğer % 1

‘in üzerine çıkarsa,shared_pool_size parametresini büyütmeliyiz.

GEÇERSİZ KILANAN CÜMLELER

Bunun anlamı bazen SQL Areada bulunan cümleler geçersiz olabilmektedir.Bunu engellemenin yolu

ilgili cümlenin tekrar execute ve reparse edilmesidir.

SQL > select count(*) from hr.employees;

SQL > select namespace,pins,reloads,invalidations

from v$librarycache;

NAMESPACE PINS RELOADS INVALIDATIONS

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

SQL AREA 1616 12 0

SQL > ANALYZE TABLE hr.employees COMPUTE STATISTICS;

SQL > select count(*) from hr.employees;

SQL > select namespace,pins,reloads,invalidations

from v$librarycache;

NAMESPACE PINS RELOADS INVALIDATIONS

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

SQL AREA 1688 14 3

Bir tablo yada view alter edildiğinde yada bir procedur yada package recompile edildiğinde birbirine

bağlı sql areaları invalid duruma düşecektir.

LIBRARY CACHE SIZING

Stored objeler için global bir space Ayarlamak gerekir.

Çok kullanılan sql cümleleri için memory de bir size ayarlamak gerekir.

Çok kullanılan sql cümlelerini muhafaza etmek gerekir.

Mesela büyük Procedurleri parçalayıp daha ufak Package’ler haline geitrmek gerekir.

Çok büyük Sql cümleleri veya triggerlar için Shared Pool içinde belli bir miktar ayırarak,kullanıma

açabilirz.Genelde Sahred pool’un % 10 u kadar olmalıdır.

Cache üzerinde ne kadarlık bir sharable memory ihtiyacı var diye bakmak istersek,

SQL> select sum(sharable_mem)

from V$DB_OBJECT_CACHE;

SUM(SHARABLE_MEM)

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

379600

SQL> select sum(sharable_mem)

from V$SQLAREA where executions > 5;

SUM(SHARABLE_MEM)

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

381067

SQL > select * from V$SHARED_POOL_RESERVED; bize gerekli bilgileri vermektedir.

LARGE MEMORY GEREKSİNİMLERİ

PL / SQL operasyonları için ne kadarlık bir başlangıç değeri ayıracağımız

SHARED_POOL_RESERVED_SIZE gösterir.

Buradaki SHARED_POOL_RESERVED_SIZE normal olarak SHARED_POOL_SIZE’ın % 10’u kadar

olmalıdır.

SQL> select * from v$db_object_cache

where sharable_mem > 10000

and (type=‘PACKAGE’ or type=‘PACKAGE BODY’ or

type=‘FUNCTION’ or type=‘PROCEDURE’)

and KEPT=‘NO’;

Bu cümle bize libraray cache te saklanamamış sql cümleri hakkında bilgi verir.

SQL> EXECUTE dbms_shared_pool.keep(‘package_name’); Library cache te saklamak içinde bu

cümleciği kullanabiliriz.

Yukarıda execution ile bu sql cümlelerini saklamış oluruz.

SQL> select sql_text from v$sqlarea

where command_type = 47

and length(sql_text) > 500; yazarak sistemde büyük procedurleri bulmuş olururz.

Bunu istersek daha ufak parçalarda package haline getirebiliyorsak getirmeliyiz.

SQL> declare x number;

begin x := 5;

end;

SQL> declare /* KEEP_ME */ x number;

begin x := 5;

end;

SQL> select address, hash_value

from v$sqlarea

where command_type = 47 and sql_text like ’%KEEP_ME%’;

Dictionary Cache Tuning

Dictionary Cache Tuning’e tuning uygulamak içinde yapabileceğimiz şeyler vardır.Bu cache sistem

hakkında bilgi aldığımız viewları barındırmaktadır.

Gets:Objeler üzerindeki request sayısı

Getmisses:Cacheteki kayıp Request sonuçlarının sayısı

SQL> select parameter, gets, getmisses

from v$rowcache;

PARAMETER GETS GETMISSES

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

dc_objects 143434 171

dc_synonyms 140432 127

getmisses ların toplamının getslerin toplamına oranı % 15 leri geçmemelidir.Geçerse shared pool size

parametresi arttırılmalıdr.

UGA Tuning

Eğer Large pool konfigure edilmediyse,kullanıcı session ve cursor state bilgisi Burada depolanacaktır.

Aşağıdaki Sql Kullanıcının UGA kullanımları hakkında bilgi verir.

SQL> select SUM(value) ||’bytes’ "Total session memory"

from V$MYSTAT, V$STATNAME

where name = ’session uga memory’

and v$mystat.statistic# = v$statname.statistic#;

Aşağıdaki Sql Shared Server Kullanıcının UGA kullanımları hakkında bilgi verir.

SQL> select SUM(value) ||’bytes’ "Total session memory"

from V$SESSTAT, V$STATNAME

where name = ’session uga memory’

and v$sesstat.statistic# = v$statname.statistic#;

Aşağıdaki Sql Tüm Kullanıcının UGA kullanımları hakkında bilgi verir.

SQL> select SUM(value) ||’bytes’ "Total max memory"

from V$SESSTAT, V$STATNAME

where name = ’session uga memory max’

and v$sesstat.statistic# = v$statname.statistic#;

Eğer yeterli miktar yoksa bunuda Sahred Pool Size parametresi arttırlırak çözebiliriz.

LARGE POOL

Sistem ve kullanıcı işlemleri için tanımlanan isteğe bağlı bir alandır.Örneğin bu alan backup ya da

restore işlemlerinde fazladan alan ihtiyacı için kullanılabilir.LRU gibi bir listesi

yoktur.LARGE_POOL_SIZE parametresi ile büyüklüğü düzenlenebilir.RMAN bu parametreyi

kullanarak BAckup ve Recovery yapar.Minimum 300k,Max 2 Gb olabilir.

SQL > SELECT *

2 FROM v$sgastat

3 WHERE pool = ’large pool’; sorgusu ile kontrol edilebilir.

DBWR_IO_SLAVES parametresi ile ARCN proseslerinin disk üzerinde ne kadara (kaç DBWn) IO

yapacağını gösterir default olarak 0 dır,eğer RMAN kullanılacaksa 4 yapılır.

BACKUP_TAPE_IO_SLAVES ise backup tapelerinin kullanımı içindir.Değeri True yapılırsa ,tapeler

üzerinden okuma yazma yapılır.Yine aynı şekilde RMAN içindir.

DATABASE BUFFER CACHE

Datafile’dan okunan veriler SGA içersinde bu alanda tutulur. Mantıksal olarak kendi içinde parçalara

ayrılarak kullanılır.Veritabanı üzerinde işlem yapan tüm kullanıcılar burayı kullanırlar.Bu durumda

yapılan işlemlerin belli bir sistematikte yapılması gerekmektedir.Bunu sağlamak için database buffer

cache’te “yazma listesi(Write List)” ve “en son kullanılanları tutan liste(Last Recenlty Used-LRU- list)”

olmak üzere 2 ayrı liste tutulur.

“Write List” , “dirty buffer” olarak adlandırılan üzerinde değişiklik yapılmış ama diske(datafile’a) henüz

yazılmamış tampon alanları tutar.LRU listesi ise boş tampon alanları (free buffers) ,henüz “write list”’e

gönderilmemiş “dirty buffer” alan bilgilerini ve “pinned buffer” denilen o an işlem gören alanları tutar.

Kullanıcının veri okuma isteği olduğunda önce bu cache’te varmı diye bakılır.Var ise(cache hit) veri

hafızadan direk okunur.Eğer yok ise (cache miss) veri ilgili data bloktan buraya okunur.Ama bunu

yapabilmesi için önce hafızada boş alan bulunması gerekir.Bunun için LRU listesine bakılır. Boş bir

alan bulunana ya da tanımlı bir eşik değere ulaşıncaya kadar arama sürer. LRU listesinde ”Dirty

buffer” bulunca bu alan “write liste” alınır ve arama işlemi sürdürülür, boş alan bulununca burası LRU

listesinin en sonuna atılarak ,veri , bulunan boş alana okunur.Boş alan bulunamadığı esnada

belirlenen eşik değerine ulaşılınca LRU listesinde arama bitirilir ve DBW0 arka plan işlemcisine

(background process) bir takım “dirty buffer” alanını diske yazması için sinyal gönderilir.

DB_CACHE_SIZE : Varsayılan buffer pool’un byte cinsinden değeridir.

DBA_KEEP_CACHE_SIZE :Korunan buffer pool’un sizdıdır.

DBA_RECYCLE_CACHE_SIZE : Geçici buffer pool’un byte cinsinden değeridir.

DB_BLOCK_SIZE : Database blokalrının sayısını göstermektedir.

SGA OPTİMİMAZYONU

Sga asıl olarak granül adı verdiğimiz yapılardan oluşur. V$BUFFER_POOL görüntüsü ile granüllerin

yerleşimlerini ve tahsis edilen alanlarını görebiliriz.

Granüller genellikle 16 MB dir.Ama SGA değeri 128 civarıysa 4MB olabilir.Minimum SGA

konfigirasyonu için 3 adet granül gerekir.Biri redo buffer için,biri buffer cache için,biri shared pool

için.SGA’nın size ı SGA_MAX_SIZE ile ayarlanabilir.

Örneğin DB_CACHE_SIZE için memory kullanıını arttıralım,

SQL> show parameter db_cache_size;

NAME TYPE VALUE

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

db_cache_size big integer 4194304

SQL> alter system set db_cache_size=8M;

System altered.

SQL> show parameter db_cache_size;

NAME TYPE VALUE

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

db_cache_size big integer 8388608

Bu parametrelerin değişimi ve SGA size’ının artırımı ile ilgili bir örnek verecek olursak,

SGA_MAX_SIZE = 128M,

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

DB_CACHE_SIZE = 96M

SHARED_POOL_SIZE = 32M

Şu an bir sorun yok ama,Shared pool size ını arttırmak istedik diyelim.

SQL > ALTER SYSTEM SET SHARED_POOL_SIZE = 64M;

Sistem bu cümleye hata verir niye,çünkü db cache size ve shared pool toplamı 128’i geçemez.

O zaman,

SQL > ALTER SYSTEM SET DB_CACHE_SIZE = 64M;

SQL > ALTER SYSTEM SET SHARED_POOL_SIZE = 64M;

Sistem bu cümleyede hata verir niye çünkü,aynı anda bu değişim yapılamaz.Ama DB_CACHE SIZE

yalnız değiştikten sonra,

SQL > ALTER SYSTEM SET SHARED_POOL_SIZE = 64M;

Yazarsak sistem hata vermez ve istediğimiz sonucu alırız.

DATABASE BUFFER CACHE’IN YÖNETİLMESİ

1-)ilk olarak server buffer cache üzerinde kullanılabilir blokları bir hash fonkiyonu kullanarak kontrol

eder.Eğer blok bulunursa LRU listesinde LRU’nun sonundan başka bir noktaya taşınır.Eğer

bulumazsa server server datafile dan blok okuyamaz.

2-)Data file dan okunmadan önce server LRU listesinde boş olanları arar.

3-)LRU listesinde arama yapılırken,server bozuk blokları dirt liste yerleştirir.

4-)Eğer kirli bloklar belli bir eşik değerini geçerse ,Server sinyal verir ve kirli blokları buffer cache ten

boşaltır.

5-)Eğer boş blok bulunursa server gerekli blokları datafile dan okur.

6-)Blok tutarlı değilse,server bloğun önceki versiyonunu rollback segmentlere bakarak yeniden

oluşturur.

MULTİPLE BUFFER POOLS

İstenirse birden fazla buffer pool kullanılabilir.3 tip buffer pool vardır.

RECYLE : Yeniden kullanılabilir blokları elemek için kullanılır.

KEEP : Yeniden kullanılabilir blokları saklamak için kullanılır.

DEFAULT :Bu pool her zaman vardır.Single buffer cache eşittir.

Her bir bağımsız pool için DB_CACHE_SIZE, DB_KEEP_CACHE_SIZE, ve

DB_RECYCLE_CACHE_SIZE vardır.

Bunların kullanımıda şu şekilde olmaktadır.

SQL > CREATE INDEX cust_idx …

STORAGE (BUFFER_POOL KEEP …);

SQL > ALTER TABLE customer

STORAGE (BUFFER_POOL RECYCLE);

SQL > ALTER INDEX cust_name_idx

STORAGE (BUFFER_POOL KEEP);

Keep Pool için,

SQL> ANALYZE TABLE hr.countries ESTIMATE STATISTICS; ile her bir objenin size bilgisi elde

edilir.

SQL> SELECT table_name, blocks

FROM dba_tables

WHERE owner = ’HR’

AND table_name = ’COUNTRIES’;

TABLE_NAME BLOCKS

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

COUNTRIES 14

Recylce Pool için,

Transactionlar tamamlandıysa bunları memory den atar.

SQL> SELECT owner#, name, count(*) blocks

FROM v$cache

GROUP BY owner#, name;

OWNER# NAME BLOCKS

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

5 CUSTOMER 147

SQL> SELECT *

FROM v$buffer_pool;

ID NAME LO_SETID HI_SETID SET_COUNT BUFFERS LO_BNUM HI_BNUM

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

1 KEEP 3 3 1 14000 0 13999

2 RECYCLE 4 6 3 2000 14000 15999

3 DEFAULT 1 2 2 4000 16000 19999

Aşağıdaki dictionat viewlar buffer pool kolonuna sahiptir.

• USER_SEGMENTS, DBA_SEGMENTS

• USER_CLUSTERS, ALL_CLUSTERS, DBA_CLUSTERS

• USER_INDEXES, ALL_INDEXES, DBA_INDEXES

• USER_TABLES, ALL_TABLES, DBA_TABLES

• USER_OBJECT_TABLES, ALL_OBJECT_TABLES, DBA_OBJECT_TABLES

• USER_ALL_TABLES, ALL_ALL_TABLES, DBA_ALL_TABLES

TABLOLARIN CACHELENMESİ

Server full table scan yaparak blokları sorgulamışsa ,LRU listesinde az kullanılanlar sırasına

gider,Bloklar ileride kullanılam için ihtiyaç duyulursa ,Diğer prosesler için kullanımda

olmayacaklardır.Bu yüzden en çok kullanılanları seçmek gerekir.

SQL> SELECT name, value

FROM v$sysstat

WHERE name = ’free buffer inspected’;

NAME VALUE

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

free buffer inspected

SQL> SELECT event, total_waits

FROM v$system_event

3 WHERE event in

4 (’free buffer waits’, ’buffer busy waits’);

EVENT TOTAL_WAITS

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

free buffer waits 337

buffer busy waits 3466

REDOLOG BUFFER TUNİNG

INSERT,UPDATE,DELETE,CREATE,ALTER ve DROP işlemleri sonucu meydana gelen değişiklikleri

hafızada tutulduğu kısımdır.Yapılan değişikliklerin geri alınmasında ve gerektiğinde “recovery”

işlemleri için kullanılır.Sıralı ve doldugunda başa dönecek şekilde bir yapısı vardir.

Bu alanda tutulan bilgiler “Log Writer Process(LGWR)” ile redo log dosyalarına yazılır.LOG_BUFFER

parametresi redo log alanının büyüklüğünü belirler.Büyük değer alması I/O mailiyeti

düşürür.Gennellikle 500 K ile değeri belirlenir.

SQL> select 'V$PARAMETER' "Table name", name,

to_number(value,'9999999') "Value"

from v$parameter

where name = 'log_buffer'

UNION

select 'V$SGASTAT' "Table name", name, bytes

from v$sgastat

where name ='log_buffer';

Table name NAME VALUE

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

V$PARAMETER log_buffer 120320

V$SGASTAT log_buffer 120320

Bilindiği gibi makinelerin CPU ları hızlı fakat diskleri yavaştır bu yüzden birden fazla işlemi yapmakta

disk üzerinde belli bir I/O gerektirir.Birden fazla redo gerekitren işlemin daha performnaslı olması

isteniyorsa LOG BUFFER parametresi arttırılmalıdır.

Log buffer larla ilgili çeşitli sorgular alabiliriz.

SQL> select sid, event, seconds_in_wait, state

from v$session_wait

where event = ’log buffer space%’;

SID EVENT SECONDS_IN_WAIT STATE

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

log buffer space 110 WAITING

SQL> SELECT name, value

FROM v$sysstat

WHERE name = ’redo buffer allocation retries’;

SQL> select name, value

from v$sysstat

where name=’redo log space requests’;

Aşağıdaki sorgunun sonucunda herhangi bir değer dönmemeisi gerekmektedir.

SQL> SELECT sid, event, seconds_in_wait, state

FROM v$session_wait

WHERE event = ‘log buffer space’;

Aşağıdaki sorguda ise ‘redo buffer allocation retries’ değeri 0 a yakın olmalıdır. ‘redo entries’ değeri ise

%1 in altında olmalıdır.

SQL> SELECT name, value

FROM v$sysstat

WHERE name IN (‘redo buffer allocation retries’,

‘redo entries’);

Bu sorunları çözmek için redo buffer değeri arttırılabilir yada redologlar için daha hızlı bir disk

kullanılabilir.