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
Yorum Gönder