DAX jako dotazovací jazyk
Cíle kapitoly
- Pochopit rozdíl mezi DAX jako kalkulačním jazykem a dotazovacím jazykem
- Psát a spouštět DAX dotazy s EVALUATE
- Používat funkce pro dotazování: SUMMARIZE, ADDCOLUMNS, TOPN, ORDER BY
- Vytvářet datové sady pro Paginated Reports (SSRS/Power BI Paginated)
- Analýza výkonu v DAX Studio — Server Timings
DAX jako dotazovací jazyk — rozdíly a rozdělení
DAX má dvě hlavní role: role kalkulační (v measures a sloupcích) a role dotazovací (pro načítání dat).
Kalkulační DAX (budete znát z GOC644)
- Vyhodnocuje se v kontextu measures nebo sloupců
- Odpovídá otázce: "Jaká je hodnota pro tento řádek/filtr?"
- Příklady: SUM, CALCULATE, FILTER v měře
- Výsledek: Skalár (číslo, text, datum) nebo agregace
Dotazovací DAX (nové v GOC6441)
- Vrací tabulku dat (narozdíl od skaláru)
- Odpovídá otázce: "Vyberte mi řádky s těmito sloupci"
- Spouští se s EVALUATE klauzulí
- Nejčastěji v DAX Studio nebo Paginated Reports datasetu
- Příklady: SUMMARIZE, FILTER na tabulku, TOPN
Kde se to používá?
| Scénář | Typ DAXu | Příklad |
|---|---|---|
| Measure v kartě vizualizace | Kalkulační | [Total Sales] — vrací číslo |
| Sloupec v tabulce | Kalkulační | Profit = Sales - Cost — vrací text/číslo |
| Dotaz v DAX Studio | Dotazovací | EVALUATE SUMMARIZE(...) ORDER BY ... |
| Dataset pro Paginated Report | Dotazovací | EVALUATE FILTER(FactSales, [Amount] > 100) |
EVALUATE Statement — základní syntaxe
Struktura DAX dotazu
EVALUATE <tabulka> ORDER BY <sloupec1> [ASC | DESC], <sloupec2> [ASC | DESC] -- Více sloupců = jedna ORDER BY, hodnoty odděleny čárkou
Jednoduchý příklad
{-- Vrátí všechny sloupce tabulky DimProduct --} EVALUATE DimProduct ORDER BY DimProduct[ProductName] ASC
S FILTER() — filtrování dat
{-- Vrátí jen produkty s cenou vyšší než 100 --} EVALUATE FILTER ( DimProduct, DimProduct[StandardCost] > 100 ) ORDER BY DimProduct[StandardCost] DESC
S TOPN() — omezení počtu řádků
{-- Vrátí prvních 10 produktů seřazených podle ceny --} EVALUATE TOPN ( 10, DimProduct, DimProduct[StandardCost], DESC )
Funkce pro dotazování dat
SUMMARIZE() — agregace podle skupin
Seskupí řádky a vrátí agregace.
{-- Vrátí součet tržeb po kategoriích produktů --} EVALUATE SUMMARIZE ( FactInternetSales, DimProduct[ProductCategory], "Total", SUM ( FactInternetSales[SalesAmount] ) ) ORDER BY [Total] DESC
ADDCOLUMNS() — přidání vypočítaných sloupců
Vezme tabulku a přidá nové sloupce s výpočty.
{-- Vrátí DimProduct s přidaným sloupcem "Price in EUR" --} EVALUATE ADDCOLUMNS ( DimProduct, "PriceEUR", DimProduct[ListPrice] * 24 )
SUMMARIZECOLUMNS() — flexibilnější alternativa
Kombinuje SUMMARIZE a ADDCOLUMNS — lepší pro složité dotazy s measure.
{-- Vrátí tržby a počet objednávek po měsících --} EVALUATE SUMMARIZECOLUMNS ( DimDate[MonthYear], "Sales", SUM ( FactInternetSales[SalesAmount] ), "Orders", COUNTROWS ( FactInternetSales ) ) ORDER BY DimDate[MonthYear]
GENERATEALL() — Cartesian product
Vytváří kombinace všech možných hodnot (kartézský součin).
{-- Všechny kombinace: Kategorie x Rok --} EVALUATE GENERATEALL ( VALUES ( DimProduct[ProductCategory] ), VALUES ( DimDate[Year] ) )
DAX dotazy pro Paginated Reports
Paginated Reports (SSRS/Power BI Paginated) používají DAX Dataset pro načítání dat. Toto se výrazně liší od interaktivních reportů.
Připojení Paginated Reportu na Power BI model
Jdete do Power BI Service → New → Paginated Report
Vyberte "Power BI dataset" a zvolte svůj model
Paste svůj DAX EVALUATE dotaz v designer okně
Příklad: Paginated Dataset s parametrem
-- DAX nemá DECLARE — proměnné v dotazu se definují přes DEFINE VAR DEFINE VAR __Category = "Bikes" -- výchozí hodnota pro testování v DAX Studio EVALUATE FILTER ( FactInternetSales, RELATED ( DimProduct[ProductCategory] ) = __Category ) -- V Paginated Report RDL datasetu se používá @Category přímo jako parametr -- (bez DECLARE) — Power BI Report Builder ho nahradí hodnotou z parametru reportu
Parametrizace — spojení s reportem
Paginated Report může mít "Report Parameters" (např. @FromDate, @ToDate). Tyto lze předat DAX dotazu:
{-- Dotaz s parametry FromDate a ToDate --} EVALUATE FILTER ( FactInternetSales, FactInternetSales[OrderDate] >= @FromDate && FactInternetSales[OrderDate] <= @ToDate )
DAX Studio — analýza výkonu dotazů
DAX Studio je nezbytný nástroj pro optimalizaci. Umožňuje vidět, jak se dotaz chová na úrovni Storage Engine a Formula Engine.
Stažení a instalace
- Jděte na
daxstudio.orga stáhněte si poslední verzi - DAX Studio se připojuje k Power BI Desktop, Analysis Services nebo Power BI Service
- Je to neoficiální, ale komunitou používaný standard v průmyslu
Server Timings — čtení výkonu
Jakmile spustíte dotaz v DAX Studio, kliknete na "Server Timings" tab. Vidíte:
| Metrika | Co znamená | Dobrá hodnota |
|---|---|---|
| Total Duration | Čas od startu do konce | < 1 s pro interaktivní reporty |
| Storage Engine Time | Čas strávený v SE (čtení z VertiPaq) | Měl by být vyšší než FE čas — SE pracuje efektivně na komprimovaných datech |
| Formula Engine Time | Čas v interpretaci DAXu | Měl by být < 50% Total Duration |
| SE vs FE poměr | Pokud SE >> FE, model je optimizovaný | SE/FE > 1.0 je dobré |
Čtení Query Planu
Query Plan ukazuje logické kroky, které DAX Engine provádí:
- CallbackDataID: FE volá SE pro data — znamená neoptimální dotaz
- Scan: SE čte všechny řádky — OK, pokud je to nutné
- SeekPredicate: SE filtruje přes dictionary encoding (vyhledání konkrétní kódované hodnoty) — DOBRÉ, efektivní filtrování bez skenování všech řádků
- Physical Scan: Fyzická operace v VertiPaq — podrobnější informace
Query: EVALUATE FactInternetSales Total Duration: 0.234 seconds SE Time: 0.150 seconds FE Time: 0.084 seconds Query Plan: ├ RelOp: SeekPredicate Batch=False │ └ Filter: FactInternetSales[OrderDate] >= @FromDate └ Output: 50000 rows