Blog Corner

SAP Sistem Performansı Otomatik Olarak Nasıl Artırılır ?


SAP sisteminizi hızlandırın

Yavaş bir SAP sistemi, tüm şirket çalışanlarınız için konforsuz bir çalışma ortamına sebep olur.
Ancak aslında SAP sisteminizi kolayca hızlandırabilirsiniz.

Sistem performansı bir çok konuya bağlı ve karmaşıktır ; CPU hızı, veritabanı hızı, sunucu hafıza boyutu, veritabanındaki data boyutu, ABAP kod performansı ve hatta internet / ağ bağlantı hızına bile bağlıdır.

Ancak tüm bunlara rağmen yavaş bir SAP ABAP raporunu % 30 – 40 gibi gözle görülür seviyelerde hızlandırmak, sadece ABAP optimizasyon teknikleri ile mümkündür. Aynı yöntemleri kullanarak HANA veritabanı in-memory yüksek performans özelliklerinden de maximum seviyede faydalanabilirsiniz.

“ABAP Optimizer” aracımızda bu ABAP kod optimizasyonu tekniklerini otomatikleştirdik, ZIP dosyası içerisinde hızlandırıcı servis sayfasına yüklediğiniz bir ABAP programına bu teknikleri otomatik olarak uygulamakta ve hızlanma sağlamaktadır.

Bu blog’da bu tekniklerin neler olduğunu, neden & nasıl performans artırdığını ve ABAP Optimizer aracımızın bunları nasıl kullandığını paylaşıyoruz.


SAP Performans Problemleri Neden Oluşur ?


SAP implementasyon projenizi tamamlayıp canlı kullanıma geçtikten sonra , SAP sisteminizin ilk yıllarında genellikle performans problemleri yaşamazsınız, çünkü veritabanı boyutunuz küçüktür.

Aynı sebepten dolayı yazılımcılar da performans problemi yaratacak kodları ilk yıllarda fark edemez, çoğunlukla daha çok iş süreçlerinin tümüyle SAP’ye aktarılması ile meşgul olurlar.

Ancak zamanla veritabanınız büyür ve optimize edilmemiş olan ABAP kodlarınız performans sıkıntıları yaratmaya başlar.

Yıllara göre SAP ABAP performansı

ABAP Optimizer Aracında Kullanılan Optimizasyon Teknikleri Nelerdir ?


ABAP performans optimizasyonu için bir çok teknik vardır, özet bilgi için alttaki wiki sayfasına göz atabilirsiniz : https://wiki.scn.sap.com/wiki/display/ABAP/ABAP+Performance+and+Tuning

Bu blog'da sadece ABAP Optimizer servisinin otomatik olarak yaptığı yani manuel olarak bir programcının kodlaması gerekmeyen tekniklerden bahsedeceğiz.

Blog’un kalan kısmını okumak için temel programlama bilgisine sahip olmanız gerekmektedir.

Performansa etki etme oranına göre sırayla inceleyelim :


Otomatik ABAP Optimizasyonu 1:
Döngü içindeki veritabanı erişimlerini azaltır – Ara bellek kullandırır


ABAP’da SELECT , UPDATE gibi veritabanı erişim komutları döngüler içinde ( LOOP deyimi ) kullanıldığında, bu durum çok sayıda ve tekrarlayan veritabanı erişimine sebep olur ve yavaşlama yaratır.

Şöyle bir kodlama hayal edin :

ABAP döngü içerisinde SELECT - ABAP Yavaş Performans Sorunu

Veritabanı tablosu AFPO , ABAP dahili tablosu (internal table) IT_CAUFV içerisindeki her bir kayıt için tekrar tekrar okunmaktadır. Yani buradaki döngünün her adımında SAP uygulama sunucunuzdan bir talep veritabanı sunucunuza gönderilmekte ve sadece bir adet kayıt okunmaktadır.

HANA gibi güçlü in-memory bir veritabanı üzerinde dahi bu kod düşük performans gösterir, çünkü aslında zaman kaybı SAP uygulama sunucunuz ile veritabanı sunucunuz arasındaki haberleşmede oluşmaktadır.

Tüm veriyi veritabanından tek bir defa da okuyup ara bellek olarak kullanılan yeni bir ABAP dahili tablosunda tutmak ve oradan okuyarak işlem yapmak gözle görünür bir performans artışı yaratır.

Altta basit adımlar ile gereken kodlamayı görebilirsiniz, temel olarak ABAP’ın “FOR ALL ENTRIES” seçeneği kullanılmıştır :

SAP ABAP performans artırımı - FOR ALL ENTRIES dönüşümü ile LOOP dışı

ABAP Optimizer bu işlemlerin tümünü ZIP dosyası olarak yüklediğiniz program kodu üzerinde otomatik yapar :

1- Programınızda arabellek olarak yeni bir dahili tablo ( internal table ) tanımlar ( Top Include içerisinde )

2- ABAP LOOP deyimi başlangıcından önce bu ara bellek tablosunu doldurmak çin FOR ALL ENTRIES opsiyonu ile bir SELECT komutu ekler

3- Ve döngü altındaki SELECT komutunu BINARY SEARCH seçeneğini kullanan bir READ TABLE komutuna çevirir

Belki de datanın tümü bir JOIN komutu ile veritabanında üretilmiş olsa ya da HANA CDS görünümleri ile tek adımda üretilmiş olsa bundan daha yüksek performans gösterebilirdi, ancak öyle bir değişiklik mevcut program kodunuz üzerinde de daha büyük bir kodlama değişikliği, hatta belki de raporun tümüyle yeniden kodlanmasını gerektirirdi.

Yukarıdaki şekilde program mantığı ile oynamadan sadece ara bellek eklemiş olduk, bu şekilde otomatik yapılması mümkün oldu.

Otomatik ABAP Optimizasyonu 2:
READ TABLE komutlarını BINARY SEARCH opsiyonunu kullanan şekle çevirir


ABAP dahili tablolarında yani uygulama sunucusundaki RAM üzerinde tuttuğumuz data sıralanmış (Sorted) ise , işlemci için bir kaydı bulmak çok daha kolaydır. Bunu , veritabanı indekslerini ABAP dahili tablolarında (RAM üzerinde) kullanmak gibi düşünebilirsiniz.

Şu örneğe göz atalım :

SAP ABAP performans artırımı BINARY SEARCH - nested loop

Kod basitçe SAP SD modülündeki siparişler için termin bilgilerini okumaktadır. GT_VBAK sipariş başlık tablosundaki her bir sipariş için GT_VBAP sipariş kalem tablosundaki kalemleri okur ve bunların her biri için GT_VBEP termin tablosundaki kayıtlara erişir.

Yukarıdaki örnekte 10.000 adet sipariş okunsun ve her bir sipariş için ortalama 10 adet sipariş kalemi var olduğunu hayal edelim, bu durumda GT_VBEP tablosu 100.000 defa okunacaktır.

Yani READ TABLE komutunda yapabileceğimiz bir performans artışı 100.000 kat etkili olacak anlamına gelir.

Kodu alttaki şekilde değiştirerek 20 dakikada çalışan bir kodun 2 dakikadan daha süreye düştüğünü görmeniz mümkündür :

SAP ABAP performans artırımı BINARY SEARCH in nested loops - optimize edilmiş

ABAP Optimizer bu işlemlerin tümünü ZIP dosyası olarak yüklediğiniz program kodu üzerinde otomatik yapar :

1- ABAP kodu üzerinde tarama yaparak tüm READ TABLE komutlarını tespit eder ve aynı dahili tablo için olanlarına ait ortak okuma anahtarlarını ( key ) tespit eder.
2- Henüz okuma komutları ( READ TABLE / LOOP gibi ) başlamadan önce uygun bir yerde SORT komutunu ekler
3- Ve en son adım olarak READ TABLE komutlarını BINARY SEARCH opsiyonunu kullanacak hale getirir


Otomatik ABAP Optimizasyonu 3:
SELECT * komutları ile seçilen alanları azaltır


Basitçe bir örnek ile EKPO tablosu lojistik modüllere ait bir standart SAP veritabanı tablosudur ve 250’den fazla sayıda alanı vardır. SAP’nin kompleks yapısından dolayı bir çok tablo bu şekilde fazla sayıda alana sahiptir.

Bir ABAP fonksiyonunda kod mantığında sadece 5 alan gerekli iken SELECT komutunda bu 5 alanı özel seçmek yerine “SELECT *” yazıldığını düşünelim. Diğer 245 alan programın her çalışmasında veritabanı sunucusundan uygulama sunucusuna gereksiz olarak transfer edilecektir.

Bu durumun SAP sistemindeki bir çok program kodunda olduğunu düşünürsek tabi ki sistem kaynaklarını tüketen ve ekstra bir yük etkisi yaratan bir duruma dönüşecektir.

ABAP SELECT komutlarında kullanılan alanları sadece gerekli olan alanlara dönüştürmek performansa yardımcı olur, ama tabi ki bunu yapmak için önce tüm program kodunu okuyarak hangi alanların gerekli olduğunu tespit etmek gerekir. MOVE-CORRESPONDING komutu, CALL FUNCTION gibi fonksiyon çağrılarına verilen tablolar gibi durumları da hesaba katarsak, bu zaman alan bir çalışmadır.

SAP ABAP performans artırımı SELECT * yıldız

ABAP optimizer bu çalışmayı otomatik olarak saniyeler içerisinde yapmaktadır.


Otomatik ABAP Optimizasyonu 4:
FOR ALL ENTRIES deyimi için ek kontrol ekler


Bazen sadece unutulan çok basit bir kontrol ABAP kodunun donmasına sebep olmaktadır.

Alttaki resimde gördüğünüz kod basitçe lojistik tablosu LIKP’den ABAP – FOR ALL ENTRIES deyimi ile veri okumaktadır :

SAP ABAP performans artırımı FOR ALL ENTRIES

Ancak sadece spesifik belirli bir durumda , her zaman oluşmayan bir durumdan dolayı IT_VBFA2 dahili tablosu boş olabilir. Bu durumda ABAP bunu “aralık tablosu (range) boştur, bu durumda tüm tablo okunmalıdır” şeklinde yorumlar ve veritabanı tablosundaki tüm veriyi okumaya çalışır.

Şirketinizin günlük işlem sayısına göre bu tablolarda milyonlarca kayıt olabilir , tablo boyutu GB seviyesinde çok büyüyebilir ve ABAP tüm bu datayı uygulama sunucusuna transfer etmeye başladığında donmalar yaşanabilir.

Buraya basitçe aralık ( range ) tablosunun boş olup olmadığını kontrol eden bir IF yada CHECK kontrolü eklenmelidir.

SAP ABAP improve performance FOR ALL ENTRIES - Optimized

ABAP optimizer bu durumdaki SELECT komutlarını tespit eder ve eklemeyi otomatik olarak yapar.

Sistem Genelinde ABAP Kodlarını Taramak ve Performans Zayıflıklarını Tespit Etmek


ABAP Optimizer aracı ile bir defa sistem geneli tüm ABAP geliştirmelerinizi tarayarak performans zayıflığı gösterebilecek kodları tespit edebilirsiniz.
Tespit edilenler bu aracın otomatik olarak düzeltebileceği, manuel olarak zaman harcamanızı gerektirmeyen kodlamalar olacaktır.

HANA migrasyonu için hazırlanıyor iseniz
tüm kodlarınızı optimize ederek HANA in-memory performans özelliklerinden en iyi şekilde faydalanabilirsiniz.


Author : Bulent BALCI