Posts Tagged ‘ CacheLookup

Dynamics AX 2012 Caching 2

Merhaba

Ön bellek yapısından bahsetmeye CacheLookup özelliği ile devam edelim. Tablo özelliği olan CacheLookup bir verinin nasıl ön bellekleneceğini belirler. 5 farklı tip mevcut tek tek inceleyelim.

  1. None : Bu tipteki tablolarda veri ön belleğe alınmaz. Çok nadir durumlar dışında tabloda kullanılmamalıdır.  Eğer tabloda çok sık veri güncellemesi oluyorsa düşünülebilir. CustTrans gibi bir tablonun bile None olmadığını burada belirtmem gerekiyor.
  2. NotInTTS : Bütün anahtarlar için ön bellekleme çalışır. Bir işlem kümesinin dışında (TTSBegin öncesinde) oluşan ön bellek kullanılmaz. İşlem kümesinde bir kere okunan veri öne belleğe alının ve küme içerisinde bellekten kullanılır. Kayıt Select-Locked olarak çekildiği için işlem kümesinde güncellenmesi engellenir. Ax’taki bir çok hareket tablosu bu tiptedir. CustTrans gibi.
  3. Found :  Bütün anahtarlar için ön bellekleme yine çalışır. Kayıt çekildiğinde eğer ön bellekte varsa ön bellekten gelir. Yoksa veri tabanına bakılır. Eğer Forupdate ile select yapılırsa yine veri tabanına bakılır. Genelde ana tablolar bu tiptedir. CustTable gibi.
  4. FoundAndEmpty : Found ile aynı işi yapar ek olarak sorgu  ile gelmeyen veri tabanında olmayan kayıtları da ön bellekte tutar bu sayede olmayan bir kayıt için sürekli veri tabanına sorgu göndermez. CustInterestVersion gibi.
  5. EntireTable : Set-Base Caching te ayrıntılı anlatacağım. Kısaca bütün veriyi sunucuda ön belleğe alır.  Çok nadir güncelleme olan tablolarda kullanılabilir.  InventModelGroup gibi.

Inside Microsoft Dynamics Ax 2012 kitabından bazı örnekleri inceleyelim: Öncelikle NotInTTS

static void NotInTTSCache(Args _args)
{
CustTable custTable;
;
select custTable where custTable.AccountNum == '1101';
// Ön belleğe bakılır yoksa veri tabanından  getirilir.

ttsBegin; // İşlem Kümesi başlatıldı
select custTable where custTable.AccountNum == '1101';
// Ön bellek geçerli değili.  Veri tabanından getirilir ve ön belleğe alınır.

select forupdate custTable where custTable.AccountNum == '1101';
// Yine veri tabanından getirlir. Forupdate kullanıldığı için

select custTable where custTable.AccountNum == '1101';
// Ön bellek kullanılır

select forupdate custTable where custTable.AccountNum == '1101';
// Ön bellek kullanılır çünki önceden  forupdate kullanıldı.

ttsCommit; // işlem kümesi sonu.
select custTable where custTable.AccountNum == '1101';
// Ön bellek kullanılır.
}

Eğer tablo tipi Found veya FoundAndEmpty olsaydı işlem kümesinin hemen altındaki sorgu ön bellekten gelecekti. İlk forupdate içeren sorgu yine veri tabanından gelecekti. Başka bir örnekle devam edelim.

static void UtilizeCache(Args _args)
{
CustTable custTable;
;
select custTable where custTable.AccountNum == '1101';
// Ön bellek kullanılır çünki birincil anahtar kriter olarak verilmiş.

select custTable; // Where ifadesi olmadığı için ön bellek kullanılmaz.

select custTable where custTable.AccountNum > '1101';
// (==) kullanılmadığı için ön bellek kullanılmaz.

select custTable  where custTable.AccountNum == '1101'
                            && custTable.CustGroup == '20';
// Ön bellek kullanılır.
}

Tekil dizine ek olarak verilen kriterlerde Ax 2012 nasıl davranıyor bakalım.

static void whenRecordDoesGetCached(Args _args)
{
CustTable custTable,custTable2;
;
// CustTable found olduğunu hatırlatayım.
// Aşağıdaki sorgu sonucunda veri tabanında böyle bir kayıt olmadığı için
// ön belleğe alınamayacak.
// Eğer CustTable FoundAndEmpty tipinde olsaydı
// bulunamayan kayıtta ön belleğe alınacaktı.

select custTable where custTable.AccountNum == '1101'
                           && custTable.CustGroup == '20';
// Aşağıdaki ifade kayıdı ön belleğe alır.
select custTable  where custTable.AccountNum == '1101';
// Bu ifade kaydı ön belleğe alacaktır.
select custTable2 where custTable2.AccountNum == '1101'
                                && custTable2.CustGroup == '10';
// Eğer kodu tekrar çalıştırırsak bütün kayıtlar ön bellekten gelecek.
}

Şimdilik bu kadar.

Selamlar.

Kaynaklar : Inside Microsoft Dynamics Ax 2012 ve MSDN

Dynamics AX 2012 Caching 1

Merhaba,

AX 2012′deki ön bellek (cach) yapısıyla ilgili bir kaç konuyu ele almayı planlıyorum.  Bir çok yapıda olduğu gibi ön bellek yapısı da AX 2012 ile birlikte geliştirilmiş ve yeni özellikler eklenmiş.

AX iki tip ön bellek yapısı destekliyor. Single-Recod Caching ve Set-Based Caching. AX ile çalışırken biz hangi ön bellek yapısının kullanıldığını önemsemeyiz sistem sizin yazdığınız koda göre en uygunu bulup kullanır. Bizim performanslı bir sistem kurabilmek için bu yapıları iyi kavramamız gerekiyor.

Single-Recod Caching (Kayıt bazlı ön bellekleme)

Üç tip kayıt bazlı ön bellek mevcut. Eski versiyondan da bildiğiniz gibi bunlar NotInTTS, Found, FoundAndEmpty. Tablo üzerindeki CacheLookup özelliğinden tanımlama yapıyoruz.  Ön belleğin  bir select ifadesinde çalışabilmesi için öncelike;

  1. CacheLookup tanımlı olmalı.
  2. Record-Buffer (Tablo değişkeni ) disableCache metodu false olmalı.
  3. Where ifadesinde tekil dizin (unique index) olmalı tekil dizin dışında bir karşılaştırma kullanılırsa ön bellek çalışmaz.
  4. Karşılaştırma “==” kullanılmalı. >=, <=,  >  gibi ifadelerde ön bellek çalışmaz.

Ön bellek hem istemcide (client) hem de sunucuda (server) olabilir. AX çalışma zamanında ön belleği duruma göre yeniler. istemcideki ön bellek sadece kendi tarafından kullanılabilir. İstemcideki  ön bellek  istemcide çalışacak bir select ifadesinde kullanılır. Sistem öncelikle istemciye bakar burada bulamazsa sunucuya orada da bulamazsa veri tabanına bakar. Kaç kaydın ön bellekte tutulacağını server configuration formundan tanımlayabilirsiniz. Eski versiyonlarda bu 100 olarak geliyordu ve değiştirilemiyordu. Forma System administration > Area page > Setup > System > Server configuration yolundan ulaştıktan sonra Performance Optimization > Performance Settings > Client record cache factor kısmından tanım yapabilirsiniz.

Sunucu ön belleği de sunucuda çalışan select ifadelerinde kullanılır. En çok kaç kaydın ön belleğe alınacağının tanımını Server configuration ‘daki  Cache Limits alanından yapabilirsiniz. 2000 tanımlı olarak geliyor.

Ön bellek tanımları tek bir AOS için yapılacağı gibi birden çok AOS olan durumlarda her bir AOS için farklı farklı da yapılabilir.

AX 2012 ile gelen özelliklere bakalım.

  • Select’te ifadesinde kullanılan where ifadesinde tekil dizine && ile ilave kriter eklenebilir. || ile yapılan eklemelerde ön bellek çalışmaz. select * from tabCustTable where tabCustTable.AccountNum == “4000″ &&tabCustTable.CustGroup == “Gold”;
  • Join de öne bellek çalışır. Where ifadesi yine tekil dizine uygun olmalı.  Select from tabCustTable join tabCustGroup
    where tabCustTable.AccountNum == “4000″ && tabCustTable.CustGroup == tabCustGroup.CustGroup;
  • Eğer tek bir şirket işin içindeyse CrossCompany anahatar sözcüğünde de ön bellek desteklenir.
  • Eğer Container bir alanınız tekil dizindeyse ön bellek desteklenir.
  • Tablo kalıtımında (Table inheritance ) ön bellek desteklenir.
  • Tarih kontrollü (Valid time state)  tablolarda ön bellek desteklenir.

Şimdilik bu kadar. Sonraki yazımda CacheLookup özelliğini anlatacağım.

Selamlar.

Kaynaklar :  Inside Microsoft Dynamics Ax 2012 ve MSDN

Dynamics Ax’ta eksik tablo özelliklerini kontrol etmek

Merhaba

Tablo özelliklerinin performan için ne kadar önemli olduğunu biliyorsunuz. Örneğin PrimaryIndex, ClusterIndex, Label, Securty key ve CacheLookup gibi. Bir tablo oluşturulduğunda bu alanların mutlaka tanımlanması gerekmektedir. Peki daha önce oluşturulmuş tablolarda bu alanların tanımlanıp tanımlanmadığını nasıl kontrol edebilirsin. Tabiki SysDictTable’ı kullanarak.

Örneğimizde sadece  PrimaryIndex, ClusterIndex ve  CacheLookup özelliklerini kontrol edeceğiz ve temp tabloları  atlayacağız.
static void TabloTara(Args _args)
{
    boolean         skipEmptyTables = true;
    boolean         result;
    treeNode        treeNode;
    SysDictTable    sdt;
    str             TableAndCound;
    int             recordCount;
    boolean         skipEmptyrecordCount = false;
    treeNodeIterator treeNodeIterator =TreeNode::findNode(“<a href=”file://\\Data”>\\Data</a> Dictionary\\Tables”).AOTiterator();
    ;
    treeNode = treeNodeIterator.next();
    setPrefix(“Tuning”);
    while (treeNode)
    {

Read more