Você está na página 1de 45

POWER BI

AVANÇADO
Índice
Power Query (tratamento de dados)

• Introdução às funções da linguagem M do Power Query


• Tabela Calendário Dinâmica e Completa
• Compreendendo objetos do Power Query (Table, Record, Binary, List)
• Diferença Entre Funções e Expressões e quando utilizá-las
• Criando Funções Personalizadas no M
• A incrível técnica de usar Etapas como Tabelas no Power Query
• Utilização de Parâmetros para melhorar a produtividade

Modelagem de dados

• Técnicas de Normalização de Dados


• Cardinalidade de Relacionamento de tabelas
• Esquema Estrela e Snowflake
• Conceito e aplicação de funções DAX:
o SWITCH
o VALUES
o CALCULATE (Aprofundamento)
o FILTER
o RELATEDTABLE
o HASONEVALUE
o RANKX
o TOPN
o SUMMARIZECOLUMNS
o GROUPBY
o CROSSFILTER
o DATESBETWEEN
o DATESINPERIOD
• Introdução à Performance de Funções DAX

Linguagem M (Power Query Formula Language)

• Introdução a Linguagem
o Visão Geral
o Expressões e Valores
o Evaluation
o Funções
• Vocábulos da Linguagem
o Convenções Gramaticais
o Comentários
o Tokens
• Conceitos Básicos
o Ambiente e Variáveis
o Ordem de Avaliação
o Princípio da Imutabilidade
• Tipos de Valores
o Nulo, Lógico, Tempo, Data, Duração, Texto, Binário
• Tipos de Objetos
o Lista, Registro,Tabela, Binário
• Operadores
• Condicionais
• Funções
o Escrever, Invocar
• Manipulação de Erros

Avançando em DAX:

• Variáveis no DAX
• Tabelas Virtuais em DAX com as funções: FILTER, SUMMARIZE, CROSSJOIN,
GENERATE, UNION, INTERSECT e EXCEPT
• Trabalhando com Hierarquias
• Inteligência de Tempo Avançada
• Análise de Propagação de Filtros e relacionamento bidirecional
• Contexto de Filtro Avançado
• Performance em DAX:
o Otimização da Performance em DAX
• Como Funciona a VertiPaq Engine
• Como Trabalhar com Muitos Dados
o Técnicas de Otimização
Power Query (tratamento de dados)
• Introdução às funções da linguagem M do Power Query

M é um nome informal para a Linguagem de fórmulas do Power Query (Power Query


Formula Language). Como o nome formal é muito longo, resumiram em M. Mas porque
M? Vem de Data Mashup, numa tradução livre, Mistura de Dados. Alguns também
dizem que é para Data Modeling, Modelagem de Dados.

Trata-se de uma linguagem funcional, com distinção de maiúsculas e minúsculas (case


sensitive), semelhante à F#.

Na linguagem de fórmula Power Query M, uma função é um mapeamento de um


conjunto de valores de entrada para um único valor de saída. Uma função é gravada
primeiro nomeando os parâmetros de função e, em seguida, fornecendo uma expressão
para computar o resultado da função. O corpo da função segue o símbolo de ir para (=
>). Opcionalmente, as informações de tipo podem ser incluídas em parâmetros e o
valor de retorno da função.

As funções podem ser construídas ou editadas no Editor Avançado do Power Query. As


etapas de tais funções podem ser também editadas através da barra de fórmula.

Uma função é definida e invocada no corpo de uma instrução let . As saídas sempre
ocorrem após a instrução in. Os parâmetros e/ou o valor de retorno podem ser
implícitos ou explícitos. Para adicionar comentários utiliza-se a barra dupla //

Exemplo1: Parâmetros explícitos e valor de retorno


let
AdicionarDois = (x as number) as number => x + 2,
Calc = AdicionarDois(7) //adiciona 7 a 2
in
Calc

Exemplo2: Parâmetros implícitos e valor de retorno


let
Adição = (x, y) => x + y,
AddResultados =
[
SeteComNove = Adição(7, 9), // igual 16
OitoComSeis = Adição(8, 6) // igual 14
]
in
AddResultados
• Tabela Calendário Dinâmica e Completa

Tabela Calendário dinâmica e completa


let
DataMin = List.Min(Table1[Data] & Table2[Data],
DataMax = List.Max(Table1[Data] & Table2[Data],
QtdeDias= Duration.Days(DataMax – DataMin) + 1,
ListDate= List.Dates(DataMin,QtdeDias, #duration(1,0,0,0))
in
ListDate

• Compreendendo objetos do Power Query (Table, Record, Binary, List)

Objeto Refere-se a: Exemplo:


Table Tabela (Bidimensional) #table({“A”, “B”},{{3,2},{4,5}})
Record Registro (Unidimensional) [X = 10, Y = 20]
Binary Binário (Decisão) #binary(“Valdir”)
List Lista (Unidimensional) {3,4,5,6}

• Diferença Entre Funções e Expressões e quando utilizá-las

Expressões

Uma consulta de linguagem de fórmula Power Query M é composta de etapas de


expressão de fórmula que criam uma consulta de mashup. Uma expressão de fórmula
pode ser avaliada (computada), produzindo um valor. A expressão let encapsula um
conjunto de valores a serem computados, nomes atribuídos e, em seguida, usado em
uma expressão subsequente que segue a instrução in.

Funções

Uma função por sua vez é um valor que, quando invocado com argumentos, produz
um novo valor. Trata-se de um valor como um número ou um valor de texto e pode
ser incluído em linha, assim como qualquer outra expressão. Quando uma função é
chamada (invocada), um conjunto de valores é especificado, que são substituídos
logicamente pelo conjunto necessário de valores de entrada dentro da expressão do
corpo da função.
• Criando Funções Personalizadas no M

As funções são escritas listando os parâmetros da função entre parênteses, seguidos


pelo símbolo de ir para = >, seguidos pela expressão que define a função.

• A incrível técnica de usar Etapas como Tabelas no Power Query

Ao utilizarmos as ferramentas disponíveis no Power Query, estamos na verdade


construindo etapas que são armazenadas como expressões e podem ser acessadas por
meio da barra de fórmulas ou Editor Avançado. Ao acessá-las podemos transformar
tais etapas em expressões mais elaboradas, sofisticadas e construir funções para
podermos invocar de acordo com nossas necessidades.

• Utilização de Parâmetros para melhorar a produtividade

A utilização de parâmetros nos permite explorar o imenso universo de simulações. Para


cria-los através do Power Query basta acessar o seguinte caminho:

Exemplo:
Notas:
Modelagem de dados
• Técnicas de Normalização de Dados

A normalização de dados é uma série de passos que se segue no projeto de uma base
de dados que permite um armazenamento consistente e um eficiente acesso aos dados
numa base de dados relacional. Esses dados reduzem a redundância de dados e as
possibilidades dos dados se tornarem inconsistentes.

Inicialmente foram estabelecidas três formas normais:

❖ 1.ª Forma Normal (1FN);


❖ 2.ª Forma Normal (2FN);
❖ 3.ª Forma Normal (3FN).

PRIMEIRA FORMA NORMAL

A normalização de uma tabela na 1ª Forma Normal (1FN) exige que a tabela tenha
uma estrutura bidimensional correta, ou seja, cada linha deve corresponder a um só
registro e cada coluna a um só campo.

Além disso, cada campo deve conter dados atômicos, ou seja, um só dado por cada
registro. Cada dado só deve tomar um valor dentro do domínio definido para esse
campo.

Problemas das Tabelas na 1FN

As tabelas normalizadas apenas na 1FN podem apresentar problemas de


redundância de informação, bem como outros tipos de problemas ou anomalias,
nomeadamente:

• anomalias de inserção – em certas situações, a inserção de um novo registro


pode implicar um ou mais campos em branco;
• anomalias de atualização – dado que numa tabela pode existir repetição de
informação sobre um mesmo elemento, se quisermos atualizar um dado relativo
a um determinado elemento, teremos de efetuar tantas atualizações quantas as
vezes que esse elemento aparecer na tabela.
• anomalias de eliminação – pela mesma razão anteriormente apontada, ou
seja, a possibilidade de existir informação repetida sobre um mesmo elemento,
se quisermos apagar um determinado elemento da nossa base de dados, teremos
de o fazer a todos os registros em que ele figurar.

Os problemas de atualização e eliminação significam uma de duas coisas ou


ambas:

o trabalho repetitivo que pode ser evitado;


o possibilidade de erros em que a base de dados perde consistência.
Dependências Funcionais

A compreensão da 2ª e da 3ª formas normais implica a percepção do conceito de


dependência funcional.

Quando um atributo ou conjunto de atributos identifica de modo unívoco os registros


de uma tabela, diz-se que determina funcionalmente os outros atributos. Isso
acontece sempre com a chave primária de uma tabela. Mas também pode acontecer
em relação a outros campos.

SEGUNDA FORMA NORMAL

A 2ª Forma Normal diz que a tabela tem de estar na 1FN e que cada atributo não
chave tem de ser funcionalmente dependente da totalidade da chave primária e não
apenas de uma parte dessa chave.

Assim depois de identificarmos a chave primária de uma tabela, pode dar-se um dos
dois casos:

1. A chave primária é constituída por um só atributo (chave elementar) – neste


caso, a tabela está seguramente na 2FN (nenhum atributo depende de uma
parte da chave, visto que a chave não e composta por partes);
2. A chave primária é constituída por mais que um atributo (chave primária
composta) – neste caso, se existe algum ou alguns atributos que dependem de
uma parte da chave (ou seja, de algum atributo que constitui a chave), então
a tabela não está na 2FN.

PRIMEIRA FORMA NORMAL

A 3ª Forma Normal (3FN) diz que a tabela tem de estar na 2FN e que nenhum atributo
não chave pode depender funcionalmente de algum outro atributo que não seja a chave
primária.

Portanto, para normalizar uma tabela de acordo com a 3FN, devemos analisar todos os
atributos não chave e verificar se existem algumas dependências funcionais entre eles:

• se não existir nenhuma dependência funcional entre os atributos não chave, a


tabela está na 3FN;
• se existir alguma dependência funcional entre atributos não chave, então, é
necessário retirar esse conjunto de atributos da tabela e construir com eles uma
tabela à parte.
• Cardinalidade de Relacionamento de tabelas

Assim que se tem a base dos tipos de chaves a serem usados no projeto de um banco
de dados, torna-se necessário saber como os relacionamentos de tabelas serão
estabelecidos.

Existem três formas de relacionamento (Cardinalidade) que podem ser utilizadas,


sendo:

• Relacionamento de 1 para 1;
• Relacionamento de 1 para N ou de N para 1 quando for o caso;
• Relacionamento de N para N.

N (ou *) significa muitos.

O relacionamento de 1 para 1 representado pela cardinalidade (1:1) é a relação de um


campo-chave de um registro de uma determinada tabela com um campo-chave de
outro registro de outra tabela. Exemplo:

CÔNJUGE CASAMENTO CÔNJUGE


1 1
MONOGÂMICO

O relacionamento de 1 para N (um para muitos) representado pela cardinalidade (1:N)


é a relação de um campo-chave de um registro de uma determinada tabela com o
campo-chave de muitos registros de outra tabela. Exemplo:

SETOR
1 CONTRATO N EMPREGADOS

O relacionamento de N para N (muitos para muitos) representado pela cardinalidade


(N:N) é a relação de um campo-chave de muitos registros de uma determinada tabela
com o campo-chave de muitos registros de outra tabela. Exemplo:

ALUNOS N MATRÍCULA N DISCIPLINAS


• Esquema Estrela e Snowflake

ESQUEMA ESTRELA

As tabelas de fato e de dimensão são normalmente combinadas num esquema em


estrela. Este nome é usado, porque o modelo dos dados se assemelha a uma estrela.
Um exemplo de um esquema como este pode ser encontrado em baixo:

Dimensão

Dimensão Dimensão

Fato

Dimensão Dimensão

ESQUEMA SNOWFLAKE

A característica fundamental desse segundo tipo de modelo é que alguma(s)


dimensão(ões) não é(são) totalmente normalizada(s). Este esquema chama-se
SnowFlake por causa do seu aspecto.

Dimensão

Dimensão Dimensão

Fato
Dimensão Dimensão

Dimensão
• Conceito e aplicação de funções DAX

o SWITCH

Avalia uma expressão em relação a uma lista de valores e retorna uma das várias
expressões de resultado possíveis.

Sintaxe:
SWITCH(<expression>, <value>, <result>[, <value>, <result>]…[, <else>])
Parâmetros
expression Qualquer expressão DAX que retorne um
único valor escalar, em que a expressão
deve ser avaliada várias vezes (para
cada linha/contexto).
value Um valor constante a ser correspondido
com os resultados da expressão.
result Qualquer expressão escalar a ser
avaliada se os resultados
da expressão corresponderem ao valor
correspondente.
else Qualquer expressão escalar a ser
avaliada se o resultado
da expressão não corresponder a nenhum
dos argumentos de
Retorno
Um valor escalar proveniente de uma das expressões de resultado , se houver
uma correspondência com o valor ou da expressão else , se não houver nenhuma
correspondência com nenhum valor.

o VALUES

Quando o parâmetro de entrada é um nome de coluna, retorna uma tabela de coluna


única que contém os valores distintos da coluna especificada. Valores duplicados são
removidos e apenas valores exclusivos são retornados. Um valor em branco pode ser
adicionado. Quando o parâmetro de entrada é um nome de tabela, o retorna as linhas
da tabela especificada. Linhas duplicadas são preservadas. Uma linha em branco pode
ser adicionada.

Sintaxe:
VALUES(<TableNameOrColumnName>)
Parâmetros
TableName or ColumnName Uma coluna da qual os valores
exclusivos devem ser retornados ou uma
tabela da qual as linhas devem ser
retornadas.
Retorno
Quando o parâmetro de entrada é um nome de coluna, uma única tabela de
coluna. Quando o parâmetro de entrada é um nome de tabela, uma tabela das mesmas
colunas é retornada.
o CALCULATE

Avalia uma expressão em um contexto que é modificado pelos filtros especificados.

Sintaxe:
CALCULATE(<expression>,<filter1>,<filter2>…)
Parâmetros
expression A expressão a ser avaliada.
filter1, filter2,... adicional Uma lista separada por
vírgulas de expressão booleana ou uma
expressão de tabela que define um
filtro.
Retorno
O valor que é o resultado da expressão.

o FILTER

Retorna uma tabela que representa um subconjunto de outra tabela ou expressão.

Sintaxe:
FILTER(<table>,<filter>)
Parâmetros
table A tabela a ser filtrada. A tabela
também pode ser uma expressão que
resulta em uma tabela.
filter Uma expressão booleana a ser avaliada
para cada linha da tabela. Por
exemplo,[Resultado] > 0 ou [Instrutor]
= "Valdir"
Retorno
Uma tabela que contém apenas as linhas filtradas.

o RELATEDTABLE

Avalia uma expressão de tabela em um contexto modificado por determinados filtros.

Sintaxe:
RELATEDTABLE(<tableName>)
Parâmetros
tableName O nome de uma tabela existente usando
a sintaxe DAX padrão. Não pode ser uma
expressão.
Retorno
Uma tabela de valores
o HASONEVALUE

Retorna true quando o contexto de ColumnName é filtrado para um valor distinto


somente. Caso contrário, será false.

Sintaxe:
HASONEVALUE(<columnName>)
Parâmetros
columnName O nome de uma coluna existente, usando
a sintaxe DAX padrão. Não pode ser uma
expressão.
Retorno
True quando o contexto para ColumnName tiver sido filtrado para apenas um valor
distinto. Caso contrário, será false.

o RANKX

Retorna a classificação de um número em uma lista de números para cada linha no


argumento de tabela .

Sintaxe:
RANKX(<table>, <expression>[, <value>[, <order>[, <ties>]]])
Parâmetros
table Qualquer expressão DAX que retorna uma
tabela de dados sobre a qual a
expressão é avaliada.
expression Qualquer expressão DAX que retorne um
único valor escalar. A expressão é
avaliada para cada linha da tabela, a
fim de gerar todos os valores possíveis
para classificação.
value Adicional Qualquer expressão DAX que
retorna um valor escalar único cuja
classificação deve ser
encontrada. Quando o parâmetro Value é
omitido, o valor da expressão na linha
atual é usado.
order Adicional Um valor que especifica como classificar valor, baixo
para alto ou alto para baixo:
0 (Ou FALSE) Classifica em ordem decrescente de valores de
expressão. Se value for igual ao número mais alto
na expressão, RANKX retornará 1. Esse é o valor
padrão quando o parâmetro Order é omitido.
1 (Ou TRUE) Classifica em ordem crescente de expressão. Se
value for igual ao número mais baixo na expressão,
RANKX retornará 1.
ties Adicional Uma enumeração que define como determinar a
classificação quando há empates.
Retorno
O número de classificação do valor entre todos os valores possíveis
da expressão avaliada para todas as linhas de números de tabela .
o TOPN

Retorna as N linhas superiores da tabela especificada.

Sintaxe:
TOPN(<n_value>,<table>,<orderBy_expression>,[<order>[,<orderBy_expression>,
[<order>]]…])
Parâmetros
n_value O número de linhas a serem
retornadas. É qualquer expressão DAX
que retorne um único valor escalar, em
que a expressão deve ser avaliada
várias vezes (para cada
linha/contexto).
table Qualquer expressão DAX que retorna uma
tabela de dados de onde extrair as
principais “n” linhas.
orderBy_expression Qualquer expressão DAX em que o valor
de resultado é usado para classificar
a tabela e é avaliada para cada linha
da tabela.
order Adicional Um valor que especifica como classificar
orderBy_expression valores, crescente ou decrescente:
0 (Ou FALSE) Classifica em ordem decrescente de valores
de order_by. Esse é o valor padrão quando o
parâmetro Order é omitido.
1 (Ou TRUE) Classifica em ordem crescente de order_by.
Retorno
Uma tabela com as “n” linhas superiores da tabela ou uma tabela vazia
se n_value for 0 (zero) ou menos. As linhas não são necessariamente
classificadas em nenhuma ordem específica.
o SUMMARIZECOLUMNS

Retorna uma tabela de resumo sobre um conjunto de grupos.

Sintaxe:
SUMMARIZECOLUMNS(<groupBy_columnName>[,<groupBy_columnName>]…,[<filterTable>]
…[, <name>, <expression>]…)
Parâmetros
groupBy_columnName Uma referência de coluna totalmente
qualificada (tabela [coluna]) para uma
tabela base para a qual os valores
distintos são incluídos na tabela
retornada. Cada coluna de
groupBy_columnName é unida cruzada
(tabelas diferentes) ou de existência
automática (mesma tabela) com as colunas
especificadas subsequentes.
filterTable Uma expressão de tabela que é adicionada
ao contexto de filtro de todas as colunas
especificadas como argumentos de
groupBy_columnName. Os valores presentes
na tabela de filtro são usados para filtrar
antes da junção cruzada/a existência
automática é executada.
name Uma cadeia de caracteres que representa o
nome da coluna a ser usada para a expressão
subsequente especificada.
expression. Uma cadeia de caracteres que representa o
nome da coluna a ser usada para a expressão
subsequente especificada.
Retorno
Uma tabela que inclui combinações de valores das colunas fornecidas, com base
no Agrupamento especificado. Somente as linhas para as quais pelo menos uma das
expressões fornecidas retornam um valor não em branco são incluídas na tabela
retornada. Se todas as expressões forem avaliadas como em branco/NULL para uma
linha, essa linha não será incluída na tabela retornada.
o GROUPBY

Não faz um cálculo implícito para nenhuma coluna de extensão que ele
adiciona. GROUPBY permite que uma nova função, CURRENT (), seja usada dentro das
funções de agregação nas colunas de extensão que ele adiciona. GROUPBY tenta
reutilizar os dados que foram agrupados, tornando-os altamente com desempenho.

Sintaxe:
GROUPBY (<table>, [<groupBy_columnName1>], [<name>, <expression>]… )
Parâmetros
table Qualquer expressão DAX que retorne uma
tabela de dados.
groupBy_columnName O nome de uma coluna existente na tabela
(ou em uma tabela relacionada) pela qual
os dados serão agrupados. Esse parâmetro
não pode ser uma expressão.
name O nome dado a uma nova coluna que está
sendo adicionada à lista de colunas
GroupBy, entre aspas duplas.
expression. Qualquer expressão DAX que retorne um
único valor escalar, em que a expressão
deve ser avaliada para cada conjunto de
valores GroupBy.
Retorno
Uma tabela com as colunas selecionadas para os argumentos de groupBy_columnName
e agrupadas por colunas designadas pelos argumentos de nome.

o CROSSFILTER

Especifica a direção de filtragem cruzada a ser usada em um cálculo para uma relação
existente entre duas colunas.
Sintaxe:
CROSSFILTER(<columnName1>, <columnName2>, <direction>)
Parâmetros
columnName1, columnName2 Nome de colunas existentes, usando a
sintaxe DAX padrão e totalmente
qualificada, que geralmente representa
o lado muitos da relação a ser usada;
Se os argumentos forem fornecidos na
ordem inversa, a função os trocará
antes de usá-los. Este argumento não
pode ser uma expressão.
direction A direção do filtro cruzado a ser
usada.
Retorno
A função não retorna nenhum valor; a função define apenas a direção de filtragem
cruzada para a relação indicada, para a duração da consulta.
o DATESBETWEEN

Retorna uma tabela que contém uma coluna de datas que começa com
a start_date e continua até a end_date.

Sintaxe:
DATESBETWEEN(<dates>,<start_date>,<end_date>)
Parâmetros
Dates Uma referência a uma coluna de
data/hora.
Start date Uma expressão de data.
End date Uma expressão de data.
Retorno
Uma tabela que contém uma única coluna de valores de data.

o DATESINPERIOD

Retorna uma tabela que contém uma coluna de datas que começa com o start_date e
continua para o number_of_intervals especificado.

Sintaxe:
DATESINPERIOD(<dates>,<start_date>,<number_of_intervals>,<interval>)
Parâmetros
Dates Uma coluna que contém datas.
Start date Uma expressão de data.
Number_of_intervals Um inteiro que especifica o número de
intervalos a serem adicionados ou
subtraídos das datas.
Interval O intervalo pelo qual deslocar as
datas. O valor de Interval pode ser um
dos seguintes: year, quarter, month, day
Retorno
Uma tabela que contém uma única coluna de valores de data.

• Introdução à Performance de Funções DAX

Para análise de performance de funções DAX podemos utilizar o DAX Studio. Podemos
utilizar apenas funções de tabela. Logo, para avaliarmos demais funções DAX, devemos
tratá-las utilizando a seguinte expressão:

Tratamento de funções não tabulares no DAX Studio


EVALUATE
rows(“Nome da coluna”, <expressão não tabular>)
Notas:
Linguagem M (Power Query Formula Language)
• Introdução à Linguagem

o Visão Geral

A linguagem M, na verdade, é mais poderosa e compreensiva do que a interface gráfica


do Editor de Consultas. Prova disso é que há sempre atualizações na parte gráfica, ela
está em evolução, mas tudo que vem melhorando nesta interface já existe há anos na
Linguagem M.

E ainda falta muitas atualizações para a interface gráfica adquirir todas as


funcionalidades já existentes no código. Provavelmente não conseguirão colocar todas.
Daí uma das razões para se aprender mais sobre M. Sabendo mais você não precisa
esperar a próxima atualização da Microsoft para desenvolver seu trabalho.

o Expressões e Valores

Sintaxe
let
<expressão 1>,
<expressão 2>,
...
<expressão n>
in
Valor

o Evaluation e Evaluation Order

As expressões de membros de Lista, Registro e Tabela , bem como expressões


de let, são avaliadas usando avaliação lenta : são avaliadas quando
necessário. Todas as outras expressões são avaliadas usando uma avaliação ágil: são
avaliadas imediatamente, quando encontradas durante o processo de avaliação. Uma
boa maneira de pensar sobre isso é lembrar que a avaliação de uma lista ou expressão
de registro retornará uma lista ou valor de registro que sabe como seus itens de lista
ou campos de registro precisam ser computados, quando solicitado (por operadores de
pesquisa ou índice).

o Funções

Lista de funções M
=#shared
Exemplo:
• Vocábulos da Linguagem

o Convenções Gramaticais

Linguagem CaseSensitive

Quebra de linha: ,

"Enter" não representa quebra lógica

Nomes de variáveis, caso contenham espaço, devem iniciar


com # e serem escritas entre aspas

No caso anterior, podem ser inclusos caracteres especiais no


nome da variável

A última linha de input não deve conter quebra de linha

o Comentários

Comentário de uma linha: //Comentário

Comentário em mais de uma linha: /*Comentário*/


• Tipos de Valores

o Nulo, Lógico, Número, Texto, Data, Tempo, ..., Duração

Tipo Literal

Null null
Logical true, false
Number 1, 1.2, 1.2e-3, #infinity, #nan
Text “Hello world!”
Date #date(2019, 3, 8)
Time #time(15, 10, 0)
DateTime #datetime(2019, 3, 8, 15, 10, 0)
DateTimeZone #datetimezone(2019, 3, 8, 15, 10, 0, -8, 0)
Duration #duration(1, 13, 59, 12)

• Tipos de Objetos

o Tabela, Registro, Binário, Lista

Objeto Refere-se a: Exemplo:


Table Tabela (Bidimensional) #table({“A”, “B”},{{3,2},{4,5}})
Record Registro (Unidimensional) [X = 10, Y = 20]
Binary Binário (Decisão) #binary(“Valdir”)
List Lista (Unidimensional) {3,4,5,6}

Categorias de função

Categorias
Binária Data e Hora Linhas
Combinação Data, hora e fuso horário Tabelas
Tipo Duração Record
Substituição Tratamento de erros Numérica
Data Uri Texto
Separação Listas Lógica
• Operadores

A linguagem M inclui um grupo de operadores que podem ser usados em expressões.


Os operadores são aplicados a operandos para formar expressões simbólicas. Por
exemplo, na expressão 1 + 2 os números 1 e 2 são os operandos e o operador é o
símbolo ‘+’.

O significado de um operador pode variar dependendo do tipo de valores que os


operandos são. Por exemplo, o operador da soma ‘+’ pode ser utilizado para outros
tipos de valores diferentes de números, como mostra o exemplo seguinte:

Mesmo operador em contextos distintos


1+3 //Resultado = 4

#time(12,19,0) + #duration(0,0,3,0) // Resultado = #time(12,22,0)

Lista de operadores M:

Operador Descrição

& combinação (concatenação)


> maior
>= maior ou igual
< menor
<= menor ou igual
= igual
<> diferente
or ou lógico condicional
and e lógico condicional
not não lógico
[] Acesso a registro
{} Acesso a lista
+ soma
- diferença
* produto
/ quociente
• Condicionais

Sintaxe
if <teste lógico> then
<expressão 1>
else
<expressão 2>

Pode ser utilizado aninhado.

• Funções

o Escrever, Invocar

No “M” uma função é um mapeamento a partir de um conjunto de valores de entrada


para um único valor de saída. A função é escrita pelo primeiro nome que é requerido
no conjunto de valores de entrada (os parâmetros para a função) e em seguida
fornecendo uma expressão que irá computar os da função usando aqueles valores de
entrada (o corpo da função) seguidos pelo sentido mostrado no símbolo “=>”. Observe
o exemplo:

Seja aplicar a função anterior na seguinte base de dados:


Selecionar a coluna ‘Data’, Guia ‘Adicionar coluna’ e ‘Invocar função personalizada’:
Nomeie a coluna a ser adicionada e que será calculada por meio da função invocada (
que deve ser escolhida na mesma janela)

Automaticamente será chamada a coluna selecionada:

Clique em Ok.
• Manipulação de Erros

Um erro é a indicação que o processo de validação de uma expressão não pode produzir
um valor.

Erros são apresentados pelos operadores e funções que se deparam com uma condição
de erro ou então usando uma expressão de erro. Erros são tratados usando a expressão
‘try’ e quando são apresentados, um valor é especificado, que pode ser usado para
indicar por que o erro ocorreu. Veja o exemplo a seguir:

Tratamento de erro
try error "negative unit count" otherwise 41

Notas:
Avançando em DAX:
• Variáveis no DAX

Sintaxe
Medida =
var Nome1 =
<expressão 1>
var Nome2 =
<expressão 2>
...
var NomeN =
<expressão N>
return
função(<expressão 1>,<expressão 2>,...,<expressão N>)

• Tabelas Virtuais em DAX com as funções: FILTER, SUMMARIZE,


CROSSJOIN, GENERATE, UNION, INTERSECT e EXCEPT

o FILTER

Retorna uma tabela que representa um subconjunto de outra tabela ou expressão.

Sintaxe:
FILTER(<table>,<filter>)
Parâmetros
table A tabela a ser filtrada. A tabela
também pode ser uma expressão que
resulta em uma tabela.
filter Uma expressão booleana a ser avaliada
para cada linha da tabela. Por
exemplo,[Resultado] > 0 ou [Instrutor]
= "Valdir"
Retorno
Uma tabela que contém apenas as linhas filtradas.
o SUMMARIZE

Retorna uma tabela de resumo para os totais solicitados sobre um conjunto de


grupos.

Sintaxe:
SUMMARIZE(<table>, <groupBy_columnName>[, <groupBy_columnName>]…[, <name>,
<expression>]…)
Parâmetros
table Qualquer expressão DAX que retorne uma
tabela de dados.
groupBy_columnName Adicional O nome qualificado de uma
coluna existente a ser usada para criar
grupos de resumo com base nos valores
encontrados nele. Esse parâmetro não
pode ser uma expressão.
name O nome fornecido a uma coluna total ou
de resumo, entre aspas duplas.
expression Qualquer expressão DAX que retorne um
único valor escalar, em que a expressão
deve ser avaliada várias vezes (para
cada linha/contexto).
Retorno
Uma tabela com as colunas selecionadas para os argumentos
de groupBy_columnName e as colunas resumidas projetadas pelos argumentos de
nome.

o CROSSJOIN

Retorna uma tabela que contém o produto cartesiano de todas as linhas de todas as
tabelas nos argumentos. As colunas na nova tabela são todas as colunas em todas as
tabelas de argumentos.

Sintaxe:
CROSSJOIN(<table>, <table>[, <table>]…)
Parâmetros
table Qualquer expressão DAX que retorne uma
tabela
Retorno
Uma tabela que contém o produto cartesiano de todas as linhas de todas as
tabelas nos argumentos.
o GENERATE

Retorna uma tabela com o produto cartesiano entre cada linha na tabela1 e a tabela
que resulta da avaliação de Table2 no contexto da linha atual de Table1.

Sintaxe:
GENERATE(<table1>, <table2>)
Parâmetros
table1 Qualquer expressão DAX que retorne uma
tabela
Table2 Qualquer expressão DAX que retorne uma
tabela
Retorno
Uma tabela com o produto cartesiano entre cada linha na tabela1 e a tabela que
resulta da avaliação de Table2 no contexto da linha atual da tabela1

o UNION

Cria uma tabela Union (join) de um par de tabelas.

Sintaxe:
UNION(<table_expression1>, <table_expression2> [,<table_expression>]…)
Parâmetros
table_expression Qualquer expressão DAX que retorne uma
tabela
Retorno
Uma tabela que contém todas as linhas de cada uma das duas expressões de tabela.

o INTERSECT

Retorna a interseção de linha de duas tabelas, retendo duplicatas.

Sintaxe:
INTERSECT(<table_expression1>, <table_expression2>)
Parâmetros
table_expression Qualquer expressão DAX que retorne uma
tabela
Retorno
Uma tabela que contém todas as linhas em table_expression1 que também estão em
table_expression2
o EXCEPT

Retorna as linhas de uma tabela que não aparecem em outra tabela.

Sintaxe:
EXCEPT(<table_expression1>, <table_expression2>)
Parâmetros
table_expression Qualquer expressão DAX que retorne uma
tabela
Retorno
Uma tabela que contém as linhas de uma tabela menos todas as linhas de outra
tabela.

• Trabalhando com Hierarquias

o PATH

Retorna uma cadeia de caracteres de texto delimitada com os identificadores de todos


os pais do identificador atual, começando com o mais antigo e continuando até o
atual.

Sintaxe:
PATH(<ID_columnName>, <parent_columnName>)
Parâmetros
ID_columnName O nome de uma coluna existente que
contém o identificador exclusivo para
linhas na tabela. Não pode ser uma
expressão. O tipo de dados do valor
em ID_columnName deve ser texto ou
inteiro e também deve ser o mesmo tipo
de dados que a coluna referenciada
em parent_columnName.
parent_columnName O nome de uma coluna existente que
contém o identificador exclusivo para
o pai da linha atual. Não pode ser uma
expressão. O tipo de dados do valor no
tipo de dados parent_columnName deve
ser texto ou inteiro e deve ser o mesmo
tipo de dados que o valor
em ID_columnName.
Retorno
Uma cadeia de caracteres de texto delimitada que contém os identificadores de
todos os pais para o identificador atual.
• Inteligência de Tempo Avançada

o PARALLELPERIOD

Retorna uma tabela que contém uma coluna de datas que representa um período
paralelo às datas na coluna datas especificadas, no contexto atual, com as datas
deslocadas para um número de intervalos que são encaminhados no tempo ou de
volta no tempo.

Sintaxe:
PARALLELPERIOD(<dates>,<number_of_intervals>,<interval>)
Parâmetros
dates Uma coluna que contém datas.
number_of_intervals Um inteiro que especifica o número de
intervalos a serem adicionados ou
subtraídos das datas.
interval O intervalo pelo qual deslocar as
datas. O valor de Interval pode ser um
dos seguintes: year, quarter, month.
Retorno
Uma tabela que contém uma única coluna de valores de data.

o DATEADD

Retorna uma tabela que contém uma coluna de datas, deslocada para frente ou para
trás no tempo pelo número especificado de intervalos a partir das datas no contexto
atual.

Sintaxe:
DATEADD(<dates>,<number_of_intervals>,<interval>)
Parâmetros
dates Uma coluna que contém datas.
number_of_intervals Um inteiro que especifica o número de
intervalos a serem adicionados ou
subtraídos das datas.
interval O intervalo pelo qual deslocar as
datas. O valor de Interval pode ser um
dos seguintes: year, quarter, month e
day.
Retorno
Uma tabela que contém uma única coluna de valores de data.
o DATEINPERIOD

Retorna uma tabela que contém uma coluna de datas que começa com
o start_date e continua para o number_of_intervals especificado.

Sintaxe:
DATESINPERIOD(<dates>,<start_date>,<number_of_intervals>,<interval>)
Parâmetros
dates Uma coluna que contém datas.
start_date Uma expressão de data.
number_of_intervals Um inteiro que especifica o número de
intervalos a serem adicionados ou
subtraídos das datas.
interval O intervalo pelo qual deslocar as
datas. O valor de Interval pode ser um
dos seguintes: year, quarter, month e
day.
Retorno
Uma tabela que contém uma única coluna de valores de data.

• Análise de Propagação de Filtros e relacionamento bidirecional

Ao filtrar tabelas para criar a exibição de dados apropriada, os criadores de relatório (e


modeladores de dados) enfrentam desafios ao determinar como a filtragem é aplicada
a um relatório; o contexto de filtro de uma tabela foi mantido em um lado da relação,
mas não no outro, exigindo, muitas vezes, fórmulas DAX complexas para obter os
resultados desejados.

Com a filtragem cruzada bidirecional, os criadores de relatório (e modeladores de


dados) agora têm mais controle sobre como os filtros são aplicados ao trabalhar com
tabelas relacionadas, permitindo que eles sejam aplicados em ambos os lados de uma
relação de tabela. Isso é realizado com a propagação do contexto de filtro em uma
segunda tabela relacionada do outro lado de uma relação de tabela.

Habilitando a filtragem cruzada bidirecional para o DirectQuery

Para habilitar a filtragem cruzada, na caixa de diálogo Editar Relação de uma relação,
selecione o seguinte:

• A Direção do filtro cruzado deve ser definida como Ambos


• A opção Aplicar filtro de segurança em ambas as direções também deve ser
selecionada
• Contexto de Filtro Avançado

Você pode se conectar a modelos multidimensionais no Power BI e criar relatórios que


visualizem todos os tipos de dados dentro do modelo. Ao trabalhar com modelos
multidimensionais, o Power BI aplica regras de como processar dados, com base na
coluna que é definida como o membro padrão.

Ao trabalhar com modelos multidimensionais, o Power BI trata os dados do modelo


com base em onde é usada a coluna que contém DefaultMember. O
atributo DefaultMember é definido em CSDL (Linguagem de Definição de Esquema
Conceitual) para uma coluna específica em um modelo multidimensional.

Ao criar um cartão de filtro em um campo com um membro padrão, o valor do campo


do membro padrão é selecionado automaticamente no cartão de filtro.
Consequentemente, todos os visuais que forem afetados pelo cartão de filtro mantêm
os modelos padrão no banco de dados. Os valores nesses cartões de filtro refletem esse
membro padrão.

Se o membro padrão é removido, desmarcar o valor o limpa de todos os visuais aos


quais o cartão de filtro se aplica e os valores exibidos não refletem o membro padrão.
• Performance em DAX:

• Otimização da performance em DAX

Os problemas de desempenho do Power BI geralmente resultam da linguagem DAX


(Data Analysis Expressions) não ideal . DAX é uma coleção de funções, operadores e
constantes que você pode usar em uma fórmula ou expressão para calcular e retornar
um ou mais valores. Em termos mais simples, o DAX ajuda a criar novas informações
a partir dos dados já existentes no seu modelo.

O DAX otimizado fornece informações detalhadas, lançando uma nova luz sobre dados
complexos. O DAX ineficiente reduz o tempo de processamento, obstrui a capacidade
premium, aumenta o tempo de espera e dificulta a atualização e o tempo de
carregamento do relatório.

1. Use variáveis em vez de repetir medidas dentro da ramificação IF


o DAX incorreto:
Ratio = IF([Total Rows] > 10, SUM(Revenue) /[Total Rows], 0)
o DAX correto:
VAR totalRows = [Total Rows];
Ratio = IF(totalRows > 10, SUM(Revenue) / totalRows,0)
o Explicação:
1. Na primeira expressão, como as medidas são calculadas em tempo
real, a expressão [Linhas Total] é calculada duas vezes. [Total de
linhas] é calculado primeiro para a verificação da condição e depois
para a expressão da condição verdadeira.
2. Em vez de calcular a mesma expressão várias vezes, você pode
armazenar o valor da medida resultante em uma variável. Você pode
usar uma referência variável sempre que necessário.
3. O mesmo processo variável se aplica a todas as instâncias em que
você chama a mesma medida em vários locais.

2. Use DIVIDE () em vez de /


o A função DIVIDE () possui um terceiro parâmetro (extra) retornado se o
denominador for zero.
o A função DIVIDE () realiza internamente uma verificação para validar se o
denominador é zero.
o Para casos de denominadores inválidos, use a condição SE enquanto estiver
usando o operador “/”.
o Nota: Se você tiver certeza de que o valor do denominador não é zero, é
melhor usar o operador “/” sem uma verificação IF. A função DIVIDE ()
sempre executará uma verificação IF internamente.
3. Não altere os valores BLANK para zeros ou outras strings
o É uma prática comum substituir espaços em branco por zeros ou outras
strings.
o O Power BI filtra automaticamente todas as linhas com valores em branco.
o Ao exibir resultados de tabelas com grandes quantidades de dados, o Power
BI filtra as linhas de valor em branco, limitando o conjunto de resultados e
impedindo um desempenho ruim.
o Se os espaços em branco forem substituídos, o Power BI não filtrará as
linhas indesejadas, afetando negativamente o desempenho.

4. Use (ab) / b junto com as variáveis em vez de a / b - 1 ou a / b * 100–


100
o Usar a / b - 1 é a abordagem preferida para calcular uma razão e evitar
cálculos de medidas duplicadas.
o Você pode obter o mesmo desempenho usando variáveis e usando (ab) / b
para calcular a proporção.
o Você deve usar (ab) / b pelo seguinte motivo:
Se a e b forem valores em branco, (a-b) / b retornará um valor em branco
e o Power BI filtrará os valores. a / b - 1 retornaria -1 como resultado,
porque a e b são números inteiros.

5. Use SELECTEDVALUE () em vez de HASONEVALUE ()


o Atualmente, usamos a função HASONEVALUE () para verificar se há apenas
um valor presente para uma coluna após a aplicação de barras e filtros. Em
seguida, usamos a função DAX VALUES (ColumnName) para recuperar o
valor único.
o A função SELECTEDVALUE () executa as etapas acima internamente e
recupera o valor se houver apenas um valor distinto presente para a
coluna. A função SELECTEDVALUE () retorna um espaço em branco se
houver vários valores disponíveis.

6. Pare de usar IFERROR () e ISERROR ()


o As funções IFERROR () e ISERROR () foram amplamente usadas no Excel
ao aplicar as funções FIND () e SEARCH (). As funções IFERROR () e
ISERROR () eram necessárias porque FIND () e SEARCH () retornavam
erros se a consulta não obtivesse o resultado necessário.
o As funções IFERROR () e ISERROR () forçam o mecanismo do Power BI a
executar uma execução passo a passo de cada linha para verificar se há
erros. No momento, não há método para indicar diretamente qual linha
retornou o erro.
o As funções FIND () e SEARCH () DAX fornecem um parâmetro extra que a
consulta pode passar. O parâmetro será retornado se a sequência de
pesquisa não estiver presente.
o As funções FIND () e SEARCH () DAX também são usadas para garantir que
nada seja dividido por zero. Além disso, as funções FIND () e SEARCH ()
verificam se mais de um valor é retornado. Você pode evitar o uso das
funções DAX FIND () e SEARCH () usando as funções DAX corretas, como
DIVIDE () e SELECTEDVALUE (). As funções DIVIDE () e SELECTEDVALUE
() executam a verificação de erros internamente e retornam os resultados
esperados.
o Você sempre pode retornar expressões DAX de forma que elas nunca
retornem um erro.

7. Não use variáveis escalares em SUMMARIZE ()


o A função SUMMARIZE () é tradicionalmente usada para agrupar colunas e
retornar as agregações resultantes.
o Em vez de usar a função SUMMARIZE () dessa maneira, você deve usar a
função DAX SUMMARIZECOLUMNS (). A função SUMMARIZECOLUMNS () é
mais recente e otimizada.
o Você só deve usar a função SUMMARIZE () para resumir os elementos
agrupados de uma tabela sem medidas ou agregações associadas. Por
exemplo:
SUMMARIZE(Table, Column1, Column2)

8. Use = 0 em vez de verificar ISBLANK () || = 0


o O valor BLANK no Power BI está associado ao valor base do tipo de dados
de uma coluna.
o O valor BLANK corresponde a zero para números inteiros, “(string vazia)”
para colunas de string e “1–1–1900” para campos de data.
o Em vez de ter duas verificações (ISBLANK () e comparar com zero), você
pode usar diretamente = 0, que executa internamente as duas verificações.
o Para executar apenas a verificação de zero, você pode usar o operador IN.

9. Use FILTER (all (ColumnName)) em vez de FILTER (valores ()) ou FILTER


(T)
o Para calcular medidas que ignoram todos os filtros aplicados a uma
coluna, use a função All (ColumnName) junto com a função FILTER em
vez de Table ou VALUE (). Por exemplo:
CALCULATE([Total Sales], FILTER(ALL(Products[Color]), Color = ‘Red’))
o A aplicação direta de filtros usando expressões e não a função FILTER se
comporta da mesma maneira mencionada acima. Esse método é
traduzido internamente usando a função ALL no filtro. Por exemplo:
CALCULATE([Total Sales], Products[Color]= ‘Red’)) -> CALCULATE([Total
Sales], FILTER(ALL(Products[Color]), Products[Color]= ‘Red’))
o É sempre melhor aplicar filtros na coluna desejada do que em toda a
tabela.
o Sempre use ALL junto com a função FILTER, se não houver necessidade
de manter o contexto atual.
10. Use KEEPFILTERS () em vez de FILTER (T)
o A função FILTER normal substitui qualquer conjunto de filtros existente
para uma coluna aplicada por slicers com os mencionados no parâmetro
FILTER.
o A função KEEPFILTER não substitui o conjunto atual de filtros. Em vez disso,
usa a interseção dos valores presentes em ambos, mantendo assim o
contexto atual.
o Sempre que você precisar manter o conjunto de filtros aplicados usando
barras de corte ou filtros no nível do relatório ao executar qualquer cálculo,
recomendamos o uso da função KEEPFILTERS ().

11. Use ISBLANK () em vez de = Cheque em branco ()


o Use a função interna ISBLANK () para verificar se há valores em branco em
vez de usar o operador de comparação = Blank ().

12. Use SEARCH () com o último parâmetro


o A função SEARCH () DAX aceita o último parâmetro como o valor que a
consulta deve retornar se a cadeia de pesquisa não for encontrada.
o Você sempre deve usar a função SEARCH () em vez de usar as funções de
erro junto com SEARCH ().

13. Use SELECTEDVALUE () em vez de VALUES ()


o A função VALUES () retorna um erro se encontrar vários
valores. Normalmente, os usuários corrigem o erro usando as funções de
Erro, que afetam negativamente o desempenho.
o Em vez de usar a função VALUES (), use a função SELECTEDVALUE (). A
função SELECTEDVALUE () é mais segura e retorna um espaço em branco
se encontrar vários valores.

14. Use as funções DISTINCT () e VALUES () de forma consistente


o O Power BI adiciona um valor em branco a uma coluna se encontrar uma
violação de integridade referencial.
o Para uma consulta direta, o Power BI adiciona um valor em branco às
colunas porque não pode verificar violações.
o As funções DISTINCT () e VALUES () diferem da seguinte maneira:
1. DISTINCT (): não retorna um espaço em branco adicionado devido a
uma violação de integridade. A função DISTINCT () inclui o espaço
em branco somente se fizer parte dos dados originais.
2. VALORES (): inclui qualquer espaço em branco que o Power BI
adiciona devido a violações de integridade referencial.
o Mantenha o uso consistente das funções DISTINCT () e VALUES () durante
todo o relatório.
o O Power BI recomenda o uso da função VALUES () em todo o relatório se
os valores em branco não forem um problema.
15. Evite usar a função AddColumns () dentro de expressões de medida
o As medidas são calculadas iterativamente por padrão.
o Se as definições de medida usarem funções iterativas, como AddColumns
(), o Power BI criará iterações aninhadas, que afetam negativamente o
desempenho do relatório.

• Como Funciona a VertiPaq Engine

O mecanismo de banco de dados tabular do SSAS pode obter solicitações do cliente,


quer pela consulta MDX ou DAX. Dentro do banco de dados Tabular, ele contém duas
camadas de mecanismos de cálculo,

Mecanismo de fórmula: sempre que uma nova solicitação vem do cliente, apesar do
DAX / MDX, do Analysis Services, ele é analisado e transformado em planos de consulta
e, finalmente, executado pelo mecanismo de fórmula.

Mecanismo de armazenamento: para executar cálculos, a partir do mecanismo de


fórmula, ele executa uma ou mais solicitações ao mecanismo de armazenamento
em que os dados estão armazenados, que podem ser o mecanismo na memória
(Vertipaq) ou o mecanismo relacional externo (directQuery), dependendo do modo em
que você está usando para construir o modelo. Neste post, estou focado principalmente
no Vertipaq Engine. Ele possui uma cópia dos dados lidos da fonte de dados quando
você executa uma atualização.

Vertipaq Engine

O Vertipaq / storage é um mecanismo de banco de dados colunar na memória que


recebe solicitações no formato binário interno. Nesse armazenamento, todos os dados
no modelo residem na memória ou na RAM. Dentro do mecanismo Vertipaq, os dados
são armazenados em formato colunar, uma estrutura especial que mantém os dados
em formato de coluna, onde, como os mecanismos tradicionais de banco de dados SQL,
armazenam o formato de linha de dados. Isso é otimizado para varredura vertical e
não possui estrutura adicional para otimizar consultas como índices no mecanismo de
banco de dados relacional. Os dados aqui são compactados na memória usando
algoritmos para permitir verificações rápidas. Isso reduzirá o tempo de digitalização e
a memória necessária para armazenar dados.

Vertipaq Engine! = Mecanismo tabular na memória

Tecnicamente, o mecanismo vertipaq é o mecanismo de armazenamento que armazena


dados, compacta dados de E / S, aplica filtros, une tabelas e faz agregações básicas e
é parte integrante de todo o mecanismo de banco de dados tabular na
memória. Cálculos mais complexos são executados pelo mecanismo de fórmula após
resultado intermediário recebido do mecanismo Vertipaq.

Além disso, ao executar cálculos, o mecanismo de fórmula executa consultas em um


único encadeamento para cada consulta, mas executa o processamento paralelo com
base nas diferentes solicitações dos usuários, enquanto o mecanismo de
armazenamento usa vários núcleos (mínimo de 16 milhões de linhas por tabela).

Dentro do mecanismo Vertipaq

Mecanismo de armazenamento ou processamento de mecanismo Vertipaq com base


em alguns algoritmos.

Cada valor em uma coluna mapeada no valor inteiro de 32 bits. Esse mapeamento é
feito de duas maneiras. Codificação hash ou codificação de valor. A codificação de valor
usa cálculo matemático dinâmico para converter o valor real em valor inteiro de 32
bits. A codificação de hash sempre usa um novo valor para armazenar durante a
conversão. Esse valor de 32 bits compactado antes de ser armazenado na estrutura
colunar. Usando RLE ou codificação de comprimento de execução, classifique esses
valores antes de armazenar; valores semelhantes em colunas obterão um nível mais
alto de compactação.
• Como Trabalhar com Muitos Dados

• Técnicas de Otimização

Algumas práticas recomendadas:

• Remova tabelas ou colunas não usadas, sempre que possível.


• Evite contagens distintas em campos com alta cardinalidade, ou seja, milhões de
valores distintos.
• Tome medidas para evitar campos com precisão desnecessária e alta
cardinalidade. Por exemplo, você pode dividir valores datetime altamente
exclusivos em colunas separadas, por exemplo, mês, ano, data e assim por
diante. Ou, quando possível, use o arredondamento em campos de alta precisão
para diminuir a cardinalidade (por exemplo, 13,29889 -> 13,3).
• Use números inteiros em vez de cadeias de caracteres, sempre que possível.
• Fique atento a funções DAX que precisam testar cada linha em uma tabela, por
exemplo, RANKX. No pior dos casos, essas funções podem aumentar
exponencialmente o tempo de execução e os requisitos de memória devido ao
aumento linear no tamanho da tabela.
• Ao se conectar a fontes de dados por meio do DirectQuery, considere indexar
novamente as colunas que normalmente são filtradas ou segmentadas. A
indexação melhora muito a capacidade de resposta do relatório.

Notas:
Roteiro de aula
Aula1
Power Query (Tratamento de dados)
Aula2
Modelagem de Dados
Linguagem DAX
Aula3
Linguagem DAX
Linguagem M
Aula4
Avançando em DAX
Aula5
Avançando em DAX
Revisão

Você também pode gostar