Sempre vejo na internet um monte de informações erradas quando o assunto é o cache do Dynamics AX. O AX 4.0 apenas faz o cache se você fizer a pesquisa usando os valores dos índices. Veremos exemplos abaixo, tenha em mente que o índice da tabela CustTable é o campo AccountNum.

Exemplo 1: Colocaremos um registro no cache. No exemplo seguinte iremos ler os dados que estão no cache, já nos exemplos 3 e 4, isto não acontecerá.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
static void cachingTest(Args _args) 
{ 
  CustTable custTable; 
  CustTrans custTrans; 
 
  //example 1* 
  select custTable where custTable.AccountNum == "4001"; 
  info(strfmt("%1",custTable.wasCached())); //not cached 
 
  //example 2 
  select custTable where custTable.AccountNum == "4001"; 
  info(strfmt("%1",custTable.wasCached())); //cached 
 
  //example 3 
  select custTable where custTable.AccountNum == "4001" && custTable.Name == "The Glass Bulb"; 
  info(strfmt("%1",custTable.wasCached())); //not cached 
 
  //example 4 
  select custTable where custTable.AccountNum == "4001" join custTrans where custTable.AccountNum == custTrans.AccountNum; 
  info(strfmt("%1",custTable.wasCached())); //not cached 
}

* Nos casos onde os registros já estavam no cache da AOS, o status é SvrRecordCached.

Já no AX 2009 o mecanismo do cache foi melhorado! Qualquer índice pode ser usada para otimizar o cache. Então, vamos repetir o teste no AX2009. Nos exemplos seguintes, nós buscaremos duas vezes pelo mesmo registro. A primeira vez nós usaremos o índice PartyID que colocará o registro no cache, na segunda vez nós vamos procurar pelo índice AccountNum e encontraremos o registro já no cache.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
static void cachingTest(Args _args) 
{ 
    CustTable custTable; 
    CustTrans custTrans; 
 
    //example 1* 
    select custTable where custTable. PartyId== "215"; //PartyID também é um índice
    info(strfmt("%1",custTable.wasCached())); //not cached 
 
    //example 2 
    select custTable where custTable.AccountNum == "4001"; //same record like partyID == “215” 
    info(strfmt("%1",custTable.wasCached())); //cached 
 
   //example 3 
    select custTable where custTable.AccountNum == "4001" && custTable.Name == "The Glass Bulb"; 
    info(strfmt("%1",custTable.wasCached())); //not cached 
 
    //example 4 
    select custTable where custTable.AccountNum == "4001" join custTrans where custTable.AccountNum == custTrans.AccountNum; 
    info(strfmt("%1",custTable.wasCached())); //not cached 
}

FONTE: http://axstart.spaces.live.com/blog/