Logo Passei Direto
Buscar
Material
páginas com resultados encontrados.
páginas com resultados encontrados.

Escolha uma das opções e acesse esse e outros materiais sem bloqueio. 🤩

Cadastre-se ou realize login

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

Escolha uma das opções e acesse esse e outros materiais sem bloqueio. 🤩

Cadastre-se ou realize login

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

Escolha uma das opções e acesse esse e outros materiais sem bloqueio. 🤩

Cadastre-se ou realize login

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

Escolha uma das opções e acesse esse e outros materiais sem bloqueio. 🤩

Cadastre-se ou realize login

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

Escolha uma das opções e acesse esse e outros materiais sem bloqueio. 🤩

Cadastre-se ou realize login

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

Escolha uma das opções e acesse esse e outros materiais sem bloqueio. 🤩

Cadastre-se ou realize login

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

Escolha uma das opções e acesse esse e outros materiais sem bloqueio. 🤩

Cadastre-se ou realize login

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

Escolha uma das opções e acesse esse e outros materiais sem bloqueio. 🤩

Cadastre-se ou realize login

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

Escolha uma das opções e acesse esse e outros materiais sem bloqueio. 🤩

Cadastre-se ou realize login

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

Escolha uma das opções e acesse esse e outros materiais sem bloqueio. 🤩

Cadastre-se ou realize login

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

Prévia do material em texto

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 quisermosapagar 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: 
 
 
 
 
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: 
 
 
 
 
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: 
 
 
 
CASAMENTO 
MONOGÂMICO 
CÔNJUGE CÔNJUGE 
1 1 
CONTRATO SETOR 
1 N EMPREGADOS 
MATRÍCULA N N DISCIPLINAS ALUNOS 
 
 
• 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: 
 
 
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. 
 
 
Fato
Dimensão
Dimensão
DimensãoDimensão
Dimensão
Fato
Dimensão
Dimensão
Dimensão
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(, , [, , ]…[, ]) 
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() 
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(,,…) 
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(,) 
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() 
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() 
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(, [, [, [, ]]]) 
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(,,,[[,, 
[]]…]) 
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([,]…,[]
…[, , ]…) 
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 (, [], [, ]… ) 
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(, , ) 
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(,,) 
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(,,,) 
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”, ) 
 
 
 
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 
 , 
 , 
 ... 
 
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 outrasexpressõ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 
 
 
o Comentários 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
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 
 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 then 
 
else 
 
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 = 
 
 var Nome2 = 
 
 ... 
 var NomeN = 
 
return 
função(,,...,) 
 
 
• 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(,) 
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(, [, ]…[, , 
]…) 
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(, [, ]…) 
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(, ) 
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(, [,]…) 
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(, ) 
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(, ) 
Parâmetrostable_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(, ) 
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(,,) 
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(,,) 
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(,,,) 
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, limitandoo 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

Mais conteúdos dessa disciplina