Oracle Append Hint Kullanımı

Append hint'i insertlerde performansı arttırabilir ama her sorguya append yazmadan önce gelin bir inceleyelim: 

High water mark denilen işaret dosyanın sonunu göstermektedir. Append aslında sorgunun direct path insert yapmasını sağlar yani bu dosyanın sonuna ekleme yapılır. Halihazırda bulunan boş alanlar değerlendirilmez ve buffer cache atlanarak sona yazılır. Bu şekilde yazma işlemi esnasında herhangi bir constraint veya trigger kontrolü de yapılmaz. Bunlar sayesinde direct path insert yüksek hızlı yazma süreleri verebilir.

direct path insert yapıldığında normal insertteki gibi boş alanlar değerlendirilmez 

Ayrıca undo alanı da append ile daha az kullanılır. Bunun nedeni veri high watermark'tan sonraya yazıldığı için hem rollback hem de read consistency kolaylıkla sağlanır. Veri rollback edilirse high watermarktan sonrası direkt silinir veya consistency sağlanması için de diğer sessionlar o bölgeyi okuyamaz. Data geldiğinde undo az kullanılır ama tabloda indeks varsa bunlar normal undo kullanımı yapar. Yani hiç undo üretilmez diyemeyiz ama azalır diyebiliriz.
 
Peki bunu her yerde kullanalım mı? Hayır asla :) Bu yazma şeklinin default'ta olmamasının birkaç sebebi var:

Kullanılmaması Gereken Durumlar 

Öncelikle şu senaryoyu düşünelim: Her seferinde 10 satır insert yapıyoruz ve burada append kullanmış olalım. Her bir satırın büyüklüğü 100 byte ve DB blok boyutumuz 8 KB olsun. Bu durumda her insert geldiğinde 10 satır için 1000 byte gereklidir fakat hep dosyanın sonuna eklediğimizden 8 KB harcanacaktır. Bu şekilde 1 milyon satır gelirse 8 GB yer harcanır. Fakat bunun yerine append kullanmayıp ilerleseydik 8 KB alana 80 satır sığacağı için yaklaşık 1 GB yer kullanacaktık. Append hinti bu nedenle küçük veri insertlerinde büyük bir yanlış olacaktır.
 
Başka bir eksisi ise direct path insert çalıştırdığımız zaman commit atana kadar o tabloya o sessiondan sorgu atılamaz. Örnekleyelim:
 
Yukarıda append hinti vererek bir insert yaptık ve select deniyoruz alttaki sorgu ile.
 
Başka bir negatif yönü ise bu hint ile sadece bir session insert yapabilir diğer sessionlarda buna izin verilmez. Zaten çok mantıklı böyle olması diğer türlü herkes dosyanın sonuna yazacağı için birbirini ezme durumları yaşanabilirdi.
 
Constraint ve trigger ile çalışmadığını da söylemiştik bunu da örnekleyelim:
foreign key içeren bir tablo yarattık.
 
insert çalıştırıp sorgu planına bakarsak direct path insert edemediğini söylüyor.

Kullanılması Gereken Durumlar 

DWH ortamlarında genellikle büyük yüklemeler yapılır tek seferde milyonlarca satır eklenir. Bu gibi durumlarda kullanılması performansımızı arttıracaktır. Tabi ki yukarıdaki anlatılan sorunların yaşanmayacağından emin olmalıyız. 
 

Yorumlar