Uygulama Performans Optimizasyonu
Giriş
Küçük veya orta boyutlu QlikView uygulamalarında, performans açısından uygulamanın tasarımıyla ilgili endişe duymanız genellikle gerekmez. Uygulamanın tasarımı zayıfsa, veri miktarı arttıkça zaman ve bellek kısıtlamaları çok belirgin olabilir. Bazı basit tasarım değişiklikleri performansı ciddi oranda iyileştirebilir. Bu ek, birkaç yaygın hataya dikkat çekmekte ve bunlara çözümler sunmaktadır.
Genellikle, "sorun" uygulama nesnelerinden kod temelli veritabanına taşınarak performans iyileştirilir. Bu genellikle bir dengeleme durumudur. Yanıt süresi iyileştirilir ve geçici kabiliyet azaltılır. Aşağıdaki öneriler genel anlamda her durum için faydalı olarak algılanmamalıdır. Bu önerileri, uygulamanın genel durumunu iyileştirdiklerinde veya batma-çıkma durumları arasında ufak bir fark oluşturduklarında kullanın.
Yukarıda belirtilen sorunların ele alınması için uygulanan örnek yöntemlerin bir listesi aşağıda yer almaktadır. Bunlar, sorunu açıklamak ve faydalı QlikView özelliğine işaret etmek üzere hazırlanmıştır. Hangi yöntemin en iyi olduğuna dair genel bir öneri sunmak mümkün değildir; ancak örneklerin sıralaması bir gösterge olabilir.
If ( Condition(Text),....)
Metin karşılaştırması içeren if cümleleri genellikle pahalıdır. Çözümler örneğin, autonumber kullanarak (bkz. önceki bölümdeki örnekler) ve/veya kod içinde test gerçekleştirerek metni sayılarla eşleştirme şeklinde olabilir.
Metin dizelerinin test edilmesi, sayısal testlerden daha yavaştır. Şu ifadeyi gözden geçirin:
If (Alfa= ‘ABC’, ‘ABC’, left (Alfa, 2))
Test işlemi esneklikten herhangi bir şey kaybetmeden, doğrudan kod içinde yapılabilir.
Yükle
*,
If (Alfa = ‘ABC’, 1, 0) as Flag
resident table_1 ;
İfade şu hale gelir:
If ( Flag = 1,’ABC’, left (Alfa, 2))
ve test işlem çok daha basittir.
Sum ( If (Condition, ‘FieldName’…))
Burada, toplam tablo boyutlarından bağımsızdır ve sonuç tablonun boyutları üzerine dağıtılır. Sorun, test işlemi kod içinde yapılarak ve tabloda toplanarak veya işlemin tamamını kod içinde gerçekleştirerek çözülebilir. Bunun için çok sayıda teknik bulunmaktadır; örneğin interval match, group by, peek, if....then....else.
Bu durum iki aşamayı, yani "Koşul"'un test edilmesini ve sonucun toplanmasını içerir. Önceki örneği sürdürürsek ve toplamayı eklersek
Sum ( If (Alfa= ‘ABC’, Num*1.25 , Num) )
Yükle
*,
If (Alfa = ‘ABC’, 1, 0) as Flag
resident table_1 ;
İfade şu hale gelir:
Sum ( If ( Flag = 1, Num* 1.25 , Num ) )
Toplama, aynı zamanda aşağıdaki gibi doğrudan kod içinde de yapılabilir:
table_2:
Yükle
*,
If (Alfa = ‘ABC’, 1, 0) as Flag
resident table_1 ;
table_3:
Yükle
Alfa,
If ( Flag = 1, Num* 1.25 , Num ) as NewNum
resident table_2 ;
table_4:
Yükle
Alfa,
Sum( NewNum ) as SumNum
resident table_3
group by Alfa ;
If ( Condition, Sum(‘FieldName’)..)
Bu yapı burada yalnızca bir önceki durumla farkı vurgulamak için dahil edilmiştir. Bu toplama işlemi tamamen bağlamsaldır ve, genel anlamda, performans sorunlarına neden olmaz.
If ( Condition1, Sum(‘FieldName’), If (Condition2, Sum(‘FieldName’)……..
İç içe girmiş If...then else... mantığı kavramsal olarak kolaydır; bununla birlikte, yönetici için sıklıkla sorun yaratabilir. Bugüne kadar yüzlerce iç içe girmiş seviyenin olduğu durumlar gördük. Bu, hem bellek için hem de CPU için yoğunluk yaratır. "Koşullar" genellikle dönüştürülerek değiştirilir. Tipik örnek, fiyatın bir değişken olduğu quantity*price toplamasıdır. Bu, "genişletilmiş aralık eşleşmesi" ile çözülebilir. İki koşul da, yani “A VE B” yerine getirilecekse, testin bir “C“ koşuluyla değiştirilmesi gerekebilir.
Örnek:
sum((GAC12_STD_COST * GAC15_EXCHANGE_RATE) * GIV24_DISP_QTY)
Replaces
Sum(
If((GAC12_EFCT_DT<= GIV23_REJ_DT and
GAC12_EXPIRE_DT>GIV23_REJ_DT) and
(GAC15_EFCT_DT<= GIV23_REJ_DT and GAC15_EXPIRE_DT>GIV23_REJ_DT),
GAC12_STD_COST * GAC15_EXCHANGE_RATE) * GIV24_DISP_QTY,
Null()))
ve
Sum(
If(GAC12_EFCT_DT<= GIV23_REJ_DT,
If(GAC12_EXPIRE_DT>GIV23_REJ_DT,
If(GAC15_EFCT_DT<= GIV23_REJ_DT,
If(GAC15_EXPIRE_DT>GIV23_REJ_DT,
(GAC12_STD_COST * GAC15_EXCHANGE_RATE) * GIV24_DISP_QTY,
Null())))))
boyutlar yavaşça değiştirilirken, GAC12_STD_COST ve GAC15_EXCHANGE_RATE alanlarını okunur.
Yavaşça değişen boyut sorunlarını çözmek için genişletilmiş intervalmatch söz dizimini kullanma
Metni Sıralama
QlikView, bir Alan'nın sayı, metin veya genel olarak işlenmesi gerektiğini otomatik olarak değerlendirir. Metin olarak değerlendirilen alanlar, metin olarak sıralanır; bu, en yavaş sıralama işlemidir. Bu işlem, yükleme sırasına göre sıralamak için manuel olarak değiştirilebilir. Liste kutularının vb.nin sıralanması gerekmiyorsa bunu kapatın.
QlikView, karışık karakter ve sayılardan oluşan dizeleri alfasayısal sıraya göre sıralar. Yani, geleneksel olan yalnızca ASCII sıralama düzeninin aksine, sayılar değer sırasına göre sıralanırken; sayı olmayanlar ASCII sırasına göre sıralanır. Örnek:
ASCII sıralaması | Alfasayısal sıralama |
---|---|
A1 | A1 |
A10 | A4 |
A11 | A5 |
A30 | A6 |
A4 | A10 |
A5 | A11 |
A6 | A30 |
Dinamik Başlıklar ve Metin Nesneleri
Dinamik olarak hesaplanmalı ifadeler, metni girebildiğiniz hemen hemen her yere girilebilir. Bununla birlikte, bir ifadenin değerlendirilmesi için gereken kaynaklar ortamına bağlıdır. İfadeler diyalog penceresinde tanımlanan grafik ve tablolardaki ifadeler, yalnızca nesne görünür olduğunda ve veriler değiştiğinde hesaplanır. Bunlar, örneğin nesne en küçük duruma getirildiğinde hesaplanmaz.
Diğer yandan, nesne başlığı hesaplanırsa, bu hesaplama herhangi bir değişikliğin meydana geldiği her defasında gerçekleştirilir. Ayrıca, gösterme koşullarını, hesaplama koşullarını vb. tanımlamanın birçok yolu vardır. Bu testler de her zaman gerçekleştirilir.
Bazı ifadeler diğerlerinden daha pahalıdır ve ne kadar sık değerlendirilmeleri gerekirse o kadar pahalı hale gelirler. Zaman uyumsuz hesaplamanın getirilmesi, bu davranışı değiştirmiştir ve belki de bunun etkileri uygulamalarınızda daha dikkat çekici bir hal almıştır.
Zaman fonksiyonları, örneğin Now() ve Today(), yeniden hesaplamanın gerektiği her seferinde değerlendirilir. Her saniye uygulamanın yeniden hesaplanmasına neden olacağından, özellikle Now() fonksiyonu oldukça maliyetli olabilir.
Örneğin:
If ( ReloadTime()+3>Now(), 'Old Data', 'New Data')
Dikkate alınabilecek başka bir örnek de aşağıdadır:
If ( ReloadTime()+3>Today(), 'Old Data', 'New Data')
Basit bir test olarak, ifadeleri metin kutularına koyun. Ardından, bunun içinde Now() ile metin kutusunu boyutlandırmayı deneyin.
Makro Tetikleyicileri ("on change")
Makrolar, uygulamada meydana gelen neredeyse her türlü olayla tetiklenebilecek şekilde ayarlanabilir. Bir olayın dönüşümlü olarak diğer bir olayı tetiklediği basamaklı veya özyinelemeli olaylara dikkat edin.