Práticas Recomendadas

Veja a seguir algumas práticas recomendadas para projetar regras de negócios, inclusive o uso de comandos adequados, uso de sintaxe, diretrizes de otimização, níveis de cálculos recomendados, opções de agregação e metodologia de depuração.

Configuração do Ambiente

Considere as práticas recomendadas a seguir ao usar comandos que instruem uma regra de negócios sobre como executar o cálculo.
  • SET UPDATECALC OFF desativa o cálculo inteligente, que é a prática recomendada para regras de negócios que usam operações entre dimensões e podem ter vários usuários acessando as mesmas combinações de blocos de dados. O uso deste comando é a prática recomendada para aplicativos em que vários usuários gravam no banco de dados. Se você usar o cálculo inteligente, certifique-se de que ele produza os resultados esperados.
  • SET AGGMISSG OFF deve ser definido para aplicativos em que as versões são o destino padrão ou em que regiões de dados que não são de folha são usadas e não podem ser excluídas durante o cálculo.

    O uso de SET AGGMISSG ON será benéfico se o design do aplicativo tiver uma configuração de versões de Baixo para Cima Padrão em que os dados são carregados no nível 0.

  • SET NOTICE e SET MSG SUMMARY só devem ser usados em ambientes de desenvolvimento para análises de cálculos individuais. Esses comandos devem ser removidos de ambientes de produção ou depois da conclusão da análise de cálculo.
  • SET EMPTYMEMBERSETS ON deve ser usado quando Solicitações de Tempo de Execução (RTP) forem incluídas em instruções FIX para que conjuntos vazios não sejam calculados. Isso impede que um cálculo seja executado em todos os membros quando o conjunto estiver vazio.

Considerações sobre Otimização e Desempenho

  • Use modelos em regras de negócios para evitar a repetição de seções de código e aproveitar melhor as RTPs.
  • Analise dependências em membros de cálculo dinâmico dentro de cada cálculo. Se possível, altere o cálculo para evitar a inclusão do uso repetido de cálculo dinâmico ou remova o cálculo dinâmico.
  • Use instruções FIX e IF para focar no cálculo e garantir que somente os dados necessários sejam calculados.
  • Evite a criação de um resultado com dados 0 (zero), a menos que queira ver um zero; por exemplo, para níveis de inventário. Isso criará um bloco, que será incluído em todas as instruções FIX e IF e será calculado. Se possível, remova zeros do carregamento de dados ou evite a criação de zeros em regras de negócios.
  • Tente evitar uma lógica booliana dentro da instrução IF usada para verificar se uma condição existe. Por exemplo, substitua
    IF (("Budget" ==#missing) OR ("Budget" ==0))
    pelo seguinte, o que produz o mesmo resultado, mas evita o uso da lógica booliana:
    IF ("Budget" +1==1) or IF (Budget/Budget ==#missing)
  • Quando possível, execute cálculos densos antes de executar cálculos esparsos. Os cálculos densos não criam blocos; os esparsos criam. Ao executar agregações; por exemplo, para obter um total de um cálculo de alocação, certifique-se de agregar somente a seção dos dados que é obrigatória para esse cálculo de alocação.
  • Minimize as passagens em um banco de dados.
  • Evite fórmulas recursivas. A recursão excessiva pode criar problemas de desempenho e exigir que você apague valores para produzir resultados consistentes.

Como Evitar o Erro de Recursão

O principal motivo do erro de recursão é cálculos dinâmicos densos não incluídos no cabeçalho da coluna, inclusive nos membros não incluídos na instrução FIX, serem calculados simultaneamente. A recursão ocorrerá se alguns dos membros calculados dinamicamente tiverem uma fórmula que inclua o membro denso na instrução FIX. Um erro de recursão ocorrerá se houver mais de 128 níveis de recursão.

O principal motivo para excluir membros de cálculo dinâmico é a melhoria do desempenho. Além disso, a exclusão de membros de cálculo dinâmico ajuda a evitar o erro de recursão garantindo que a exportação use o bloco compactado, em vez do bloco expandido. Também é possível evitar o erro de recursão alterando a dimensão densa usada como o cabeçalho da coluna. Para ele, cada coluna definida pela instrução FIX é calculada individualmente. A recursão não ocorre porque outros cálculos dinâmicos densos não incluídos na instrução FIX são ignorados, o que permite que a regra seja executada com sucesso.

Nota:

Você não poderá alterar o cabeçalho de coluna da dimensão densa se o arquivo exportado contiver mais de 256 colunas.

Por exemplo, pode ser que o erro Cannot calculate. Essbase Error(1200494): Error executing formula for [Yield%] (line 15): Recursion limit [128] reached ocorra se você usar o seguinte script de cálculo:

SET DataExportOptions
     {
     DATAEXPORTCOLFORMAT ON;
     DATAEXPORTDIMHEADER ON;
     DATAEXPORTDRYRUN OFF;
     DataExportRelationalFile OFF;
     DataExportNonExistingBlocks OFF;
     DataExportLevel ALL;
     DATAEXPORTCOLHEADER "Period";
     DATAEXPORTOVERWRITEFILE ON;
     DataExportDynamicCalc ON;
     };

FIX ("Yield%",@Relative("Change Over",0),@Relative("Currency",0),@Relative("Entity",0),@Relative("Product",0),@Relative("CostCentre",0),"Jan","Actual_Total",@Relative("View",0),"Working","Fy20")

DATAEXPORT "File" "," "/u03/inbox/data/ExportDataFile.txt"  "#";
 

Para evitar o erro, desative a opção Dinâmico alterando DataExportDynamicCalc ON; para DataExportDynamicCalc OFF;.

Uso de Instruções FIX

  • As instruções FIX são usadas para focar a regra de negócios (manter o número mínimo possível de blocos que estão sendo calculados) a fim de garantir que você só calcule os blocos necessários.
  • Uma instrução FIX é recomendada para dimensões esparsas porque ela reduz o número de blocos que são necessários para o cálculo.
  • Certifique-se de que os cálculos sejam feitos no nível 0 de todas as dimensões se o design do aplicativo tiver uma configuração de versões de baixo para cima.
  • Quando possível, use instruções FIX externas em dimensões esparsas e instruções IF internas em dimensões densas.
  • Todas as instruções FIX devem incluir membros de todas as dimensões, exceto os que estão dentro do cálculo. Se uma dimensão for excluída, todos os membros dela serão incluídos. Pode ser que isso não seja necessário.
  • Quando possível, aninhe instruções FIX para reduzir o número de passagens no banco de dados. Cada instrução FIX completa requer uma passagem no banco de dados. Por exemplo, você pode usar uma instrução FIX externa para Version, Scenario e qualquer outra seleção de dimensões que seja estática em toda a regra de negócios.
  • Para regras de negócios associadas a formulários da Web, aproveite a página selecionada e os membros PDV nas instruções FIX para reduzir o número de blocos calculados.

Uso de Instruções IF

  • A instrução IF pode ser usada na fórmula do membro; a FIX, não.
  • A instrução IF deve ser usada dentro das instruções FIX para reduzir o número de blocos que deverão ser acessados. A instrução IF traz todos os blocos existentes na instrução FIX para a memória.
  • Quando possível, use instruções FIX externas em dimensões esparsas e instruções IF internas em dimensões densas.
  • Quando possível, use ELSE, em vez de uma combinação de NOT e ELSEIF, para evitar uma análise desnecessária dos valores de membros durante o cálculo. Não use uma instrução ELSE caso ela não seja obrigatória.
  • Analise a opção de Bloco de Membro de Cálculo para determinar se é possível usar um membro esparso sem dependências de cálculo dinâmico.
  • Ordene as instruções IF, quando possível, quando o maior número de casos atingir a primeira instrução IF no bloco. Use NOT dentro da instrução IF para garantir isso, se aplicável.

    Considere o script de cálculo a seguir, que pressupõe que SalesYTD seja um filho de Ratios em Sample.Basic (onde Contas e Tempo são dimensões densas).

    SET UPDATECALC OFF;
    "SalesYTD"(
    IF(@ismbr("Jan"))
        "SalesYTD" = "Sales";
    Else
        "SalesYTD"="Sales" + @prior("SalesYTD");
    Endif)

    Neste exemplo, embora 11/12 avos dos dados atenda à condição ELSE, apenas 1/12 avos do dados atende à condição IF. Além disso, o membro SalesYTD é calculado no modo Célula, o que significa que o mês de janeiro, como aparece primeiro no outline, é calculado primeiro, independentemente da ordem da instrução IF. Você pode otimizar esse script usando NOT na instrução IF, como é mostrado no exemplo a seguir:

    SET UPDATECALC OFF;
    "SalesYTD"(
    IF(NOT(@ismbr("Jan")))
        "SalesYTD" = "Sales" + @prior("SalesYTD");
    Else
        "SalesYTD"="Sales";
    Endif)

Cálculo do Bloco

  • Use RTPs para garantir que apenas os dados obrigatórios sejam incluídos na regra de negócios.
  • Agregue ou calcule somente os dados que são obrigatórios em cada estágio do cálculo para garantir que o número de blocos incluído no cálculo seja o mínimo possível pelo máximo de tempo possível.

Níveis de Cálculo

  • Certifique-se de que os cálculos sejam feitos no nível 0 de todas as dimensões se o design do aplicativo tiver uma configuração de versões de baixo para cima.
  • Se for necessário apenas para o processo de aprovação, inclua agregações no Tipo de Plano BSO. Mova todas as outras agregações para o Tipo de Plano ASO.
  • Mantenha o número mínimo possível de blocos incluídos no cálculo pelo máximo de tempo possível.

Considerações sobre Sintaxe

  • Sempre utilize @LEVMBRS, em vez de @RELATIVE, se usado na dimensão inteira.
  • Se aplicável, use @CHILDREN, em vez de @RELATIVE.
  • Use @REMOVE e @LEVMBRS se quiser excluir alguns membros de uma instrução FIX.
Execução de Cálculos Usando Datas Armazenadas no Planning

O Planning permite que você insira valores de data. Por exemplo, quando se usa o formato MM/DD/AAAA, é possível inserir uma data de início como 11/01/2019 e uma data de término como 06/01/2020. O Essbase armazena os valores formatados de data como valores numéricos. Por exemplo, a data de início anterior é armazenada como 20191101 e a de término como 201200601. Você pode usar funções do Essbase, por exemplo, a função @ROUND, @INT ou @TRUNCATE, para calcular o número de meses entre qualquer data de início e qualquer data de término. O exemplo a seguir mostra como calcular o número de meses entre uma data de início e uma data de término usando a função @ROUND:

  1. Calcule o número de meses entre o ano da data de término e o ano da data de início, da seguinte maneira:
    (@ROUND ("End Date",-4) - @ROUND ("Start Date",-4))/10000*12
    O resultado deste cálculo (20200000 – 20190000)/10000 *12 é 12.
  2. Calcule o número de meses entre o início do ano da data de término e a data de término e some-o.
    (@ROUND ("End Date",-2) - @ROUND ("End Date",-4))/100
    O resultado do cálculo (20200600 – 20200000)/100 é 6.
  3. Calcule o número de meses entre o início do ano da data de início e a data de término e subtraia-o.
    (@ROUND ("Start Date",-2) - @ROUND ("Start Date",-4))/100
    O resultado do cálculo (20191100 – 20190000)/100 é 11.
  4. Combine as etapas anteriores na fórmula (12+6-11) para calcular o número de meses (7) entre qualquer data de início e qualquer data de término.
    (((@ROUND ("End Date",-4) - @ROUND ("Start Date",-4))/10000*12) + 
    ((@ROUND ("End Date",-2) - @ROUND ("End Date",-4))/100)-
    ((@ROUND ("Start Date",-2) - @ROUND ("Start Date",-4))/100))
Uso da Função @CURRMBR

A função @CURRMBR, que retorna o nome do membro da dimensão que está sendo calculado no momento, é muito útil para definir o escopo e gerenciar cálculos complexos. No entanto, considere o seu impacto no desempenho.

O desempenho não é afetado quando a função @CURRMBR é usada em uma dimensão esparsa porque o bloco corresponde a um membro de dimensão esparsa apenas. No entanto, o desempenho dessa função é mais lento quando ela é usada em dimensões densas porque ela executa cálculos no nível do bloco, e não no nível da célula. Por isso, essa função calcula todos os membros de dimensões densas, mesmo que um membro de dimensão densa específico não esteja presente na consulta. Consequentemente, use essa função moderadamente com dimensões densas.

Além disso, quando usada em dimensões densas, a dimensão @CURRMBR pode produzir erros ou resultados inesperados se utilizada juntamente com outras funções, como @CONCATENATE. Por exemplo, se um membro calculado dinamicamente em uma consulta contiver a fórmula "Actual"->@MEMBER(@CONCATENATE(@NAME (@CURRMBR ("Account")),"_Total")) e a dimensão Conta for esparsa, a consulta será executada sem erros desde que a conta na consulta gere um membro de outline válido. No entanto, se a dimensão Account for densa, a consulta resultará no erro a seguir, mesmo se a conta na consulta gerar um membro de outline válido.

Error executing formula for [member name] (line 0): attempt to cross a null @ member in function [@X]

Esse erro é gerado porque a função @CURRMBR faz cálculos no nível do bloco e, portanto, calcula todas as contas no bloco denso. Nem todas as contas no bloco geram um membro de outline válido, o que resulta na mensagem de erro anterior. Para obter mais informações sobre a função @CURRMBR consulte " @CURRMBR " em Referência Técnica do Oracle Essbase .

Use do Modo de Bloco e do Modo de Célula

  • Embora o uso do modo de bloco, em que as células são agrupadas no bloco e calculadas simultaneamente, em geral seja mais rápido, as dependências dos dados devem ser consideradas com cuidado. Por exemplo, SalesYTD = CurMth + PriorMth deve ser calculado no modo de célula para que cada mês seja calculado na ordem do outline.
  • No modo de célula, cada célula é calculada sequencialmente na ordem das dimensões densas no outline e, em geral, de modo mais lento do que no modo de bloco.
  • Use @CALCMODE para controlar manualmente se o modo de célula ou de bloco é usado.
  • Use logs do aplicativo no modo de depuração para verificar o modo de cálculo. Se um cálculo for executado no modo de bloco, nenhuma mensagem será exibida. Uma mensagem de log é mostrada quando os cálculos são executados no modo de célula.

Recomendações sobre Criação de Blocos e Tamanho de Blocos

O tamanho do bloco recomendado para desempenho ideal é entre 8 KB e 200 KB. Para manter o tamanho de bloco BSO ideal, a Oracle recomenda que você só adicione as contas usadas para planejamento e previsão para cubos BSO. Quando possível, use cubos ASO para relatório adicionando todas as contas de relatório aos cubos ASO. Além disso, para melhorar o tamanho do bloco, a Oracle recomenda que todos os níveis superiores nas dimensões densas que sejam agregações dos seus filhos sejam do tipo cálculo dinâmico (não armazenamento) ou rótulo apenas.

Em geral, os blocos são criados nas ações a seguir:

  • Carregamento de dados
  • DATACOPY
  • Cálculos esparsos; por exemplo, AGG or SparseMember = X * X/X;

Um cálculo esparso é disparado quando:

  • Os membros esparsos estão à esquerda do sinal de igualdade (=).
  • A fórmula está dentro de um bloco de membros de cálculo esparsos; por exemplo, "Budget"("Sales" = "Sales"->"Actual" * 0.95;) pressupondo que Cenário seja esparso e Medidas seja denso.

Os blocos podem ser criados usando os comandos de cálculo SET CREATEBLOCKONEQ, SET CREATENONMISSINGBLK ou a função de cálculo @CREATEBLOCK.

A Oracle recomenda que essas configurações sejam usadas de maneira esparsa e dentro de uma instrução FIX rígida. Teste para ver se você pode evitar o uso dessas instruções alterando o tipo de cálculo que está sendo feito.

Quando tiver um problema, antes de usar essa função ou esses comandos de cálculo, verifique se ele está relacionado à criação do bloco. Você pode determinar se um problema está relacionado à criação do bloco enviando um zero (0) para o bloco de destino e depois executando novamente o cálculo.

Ao desenvolver regras de negócios, sempre apague e recarregue dados (em vez de enviar #missing ou executar um script clearblock ou cleardata) ao testar regras que possam causar um problema de criação de bloco.

Uso de Cálculos de Baixo para Cima e de Cima para Baixo

  • Adicione a função de cálculo @CALCMODE(BOTTOMUP) ou o comando de cálculo SET FRMLBOTTOMUP para calcular somente blocos existentes (BOTTOMUP), em vez de calcular blocos possíveis (TOPDOWN).
  • Como os cálculos TOPDOWN calculam todos os possíveis blocos de dados com o membro, remova quaisquer membros irrelevantes existentes nas dimensões esparsas.
  • Ao usar @CALCMODE, teste os cálculos por completo usando BOTTOMUP para assegurar que os blocos sejam criados corretamente.
  • Ao usar o cálculo BOTTOMUP, teste o cálculo por completo apagando dados e executando de novo o cálculo para verificar se todos os blocos foram criados corretamente.
  • Use logs do aplicativo no modo de depuração para verificar o modo de cálculo. Se um cálculo for executado BOTTOMUP, nenhuma mensagem será exibida. Uma mensagem de log será exibida se os cálculos forem executados TOPDOWN.

Agregações

  • Para manter o número mínimo possível de blocos pelo máximo de tempo possível, uma agregação de dimensões esparsas deve ser ordenada começando pela dimensão que cria o menor número de blocos, e não pela que cria o maior número de blocos.
  • Não crie regras de negócios de usuário final para agregar dimensões esparsas inteiras.
  • Mova somente as agregações necessárias para reportar ao Tipo de Plano ASO.
  • Agregue os dados necessários apenas para o processo de aprovação de planejamento.

Uso de Comandos de Cálculo AGG, em vez de Comandos de Cálculo CALC DIM

  • CALC DIM executa qualquer fórmula de membro.
  • CALC DIM agrega dimensões densas ou esparsas.
  • AGG agrega com base na estrutura do outline.
  • AGG não executa uma fórmula de membro.
  • AGG agrega apenas dimensões esparsas.
Teste AGG e CALC DIM, pois o desempenho pode variar dependendo do nível de agregação envolvido no cálculo. Exclua dimensões com cálculo dinâmico em níveis superiores de todas as agregações. Só agregue os dados obrigatórios.

Uso dos Comandos de Cálculo SET CALCPARALLEL e FIXPARALLEL

  • Para aplicativos de vários usuários em que haja a possibilidade de regras serem executadas simultaneamente, execute as regras de negócios em modo serial.
  • Só use SET CALCPARALLEL ao redor de agregações de dimensões esparsas completas em cálculos em lote.
  • O cálculo paralelo não é recomendado para scripts pequenos; por exemplo, scripts cuja execução leva menos de 20 segundos porque a sobrecarga para criar paralelismo pode não compensar o benefício.
  • Sempre teste SET CALCPARALLEL para garantir que ele seja benéfico. Às vezes, cálculos seriais ou cálculos com níveis inferiores de paralelismo podem produzir resultados melhores.
  • Teste para verificar se FIXPARALLEL fornece melhores resultados do que SET CALCPARALLEL Use o Calculation Manager no modo de depuração para revisar logs.
  • Sempre considere a execução simultânea por parte de vários usuários ao usar SET CALCPARALLEL e FIXPARALLEL.

Para obter mais informações, consulte FIXPARALLEL...ENDFIXPARALLEL em Referência Técnica do Oracle Essbase .

Impacto da ativação de cubos híbridos em cálculos no Planning

Verifique seus resultados calculados em processos de negócios do Planning habilitados para Cubos Híbridos se você estiver usando constantes, e não valores de dados de outros membros (por exemplo, para fevereiro, dias do mês = 28) para atribuir valores nos cálculos.

Os resultados dos cálculos em processos de negócios do Planninghabilitados para Cubos Híbridos podem ser diferentes dos resultados observados em processos de negócios que não estão habilitados para Cubos Híbridos. A diferença nos resultados dos cálculos pode ser atribuída ao fato de que os processos de negócios do Planning habilitados para Cubos Híbridos usam uma configuração que ignora qualquer fórmula baseada apenas em constantes para atribuir um valor de dados. Para resolver esse problema, adicione um @CreateBlock à fórmula em um elemento denso da fórmula. Quando o @CreateBlock está em uma dimensão densa, essa adição cria os blocos para todos os outros elementos densos ao mesmo tempo. Além disso, use a instrução ELSE para cada instrução IF para garantir que todos os blocos necessários sejam criados.

Para obter informações sobre o usuário do Essbase no Oracle Enterprise Performance Management Cloud, consulte "Sobre o Essbase no EPM Cloud" em Introdução ao Oracle Enterprise Performance Management Cloud para Administradores .