V predchádzajúcom článku sme si sľúbili, že sa pozrieme na to, ako funguje režim DirectQuery voči externým dátovým modelom, keď kombinujete viaceré dátové modely v jednom reporte. Takže poďme na to.
DAX alebo SQL?
Režim DirectQuery štandardne používa jazyk SQL, a na externé dátové modely sa dá dotazovať len v jazykoch DAX a MDX. Na prvý pohľad to vyzerá tak, že sa Microsoftu podaril husársky kúsok, a spravil preklad jazyka SQL na DAX a opačne. Čo sa mi nechcelo veriť, keďže za 9 rokov nevedeli spraviť ani plnú podporu jazyka DAX pre režim DirectQuery. Čiže ani len jeden smer prekladu z DAX-u do SQL. Preto som to zdebugoval.
Keď sa pozrieme na to, čo a ako sa volá voči dátovým modelom, tak si najprv zopakujeme, ako sme vyskladali kontingenčku v predchádzajúcom článku. Do oblasti riadkov použili pole CalendarYear z tabuľky Cas (z druhého dátového modelu), a do oblasti hodnôt sme dali merítko Obrat (z prvého dátového modelu) a zosumovaný stĺpec „Planovany obrat“ (z druhého dátového modelu). Výsledná kontingenčka vyzerala takto:
V prípade takejto kontingenčky to zavolá na pozadí takéto dotazy, aby ju to zobrazilo:
// DAX Query
DEFINE
VAR __DS0Core =
SUMMARIZECOLUMNS(
ROLLUPADDISSUBTOTAL('Cas'[CalendarYear], "IsGrandTotalRowTotal"),
"Obrat", 'Objednávky'[Obrat],
"SumPlanovany_obrat", CALCULATE(SUM('Planovacia tabulka'[Planovany obrat]))
)
VAR __DS0PrimaryWindowed =
TOPN(502, __DS0Core, [IsGrandTotalRowTotal], 0, 'Cas'[CalendarYear], 1)
EVALUATE
__DS0PrimaryWindowed
ORDER BY
[IsGrandTotalRowTotal] DESC, 'Cas'[CalendarYear]
// SQL Query
DEFINE
TABLE _T145 = UNION(SELECTCOLUMNS(_Var0, "Value", [Value]),SELECTCOLUMNS(_Var1, "Value", [Value1]))
VAR _Var0 = {3,4,5,6}
VAR _Var1 = {(3,DATE(2004,9,1)),(3,DATE(2004,9,2)),....(vypis skrateny kvôli velkosti).....,(6,DATE(2003,12,31))}
EVALUATE
GROUPCROSSAPPLYTABLE(
_T145[Value],
TREATAS(_Var0, _T145[Value]),
"L1",
CALCULATETABLE(
GROUPCROSSAPPLY(
TREATAS(DEPENDON(_Var1, EARLIER(_T145[Value], 1)), 'Objednávky'[SaleDateKey]),
"__Agg0", [Obrat]
),
ALL(_T145[Value])
)
)
// SQL Query
DEFINE
VAR _Var0 = VALUES('Cas'[CalendarYear])
EVALUATE
GROUPCROSSAPPLY(
'Cas'[CalendarYear],
_Var0,
"__Agg0", SUMX('Planovacia tabulka','Planovacia tabulka'[Planovany obrat])
)
// SQL Query
EVALUATE
GROUPCROSSAPPLY(
"__Agg0", [Obrat]
)
// SQL Query
EVALUATE
SUMMARIZE(
VALUES('Cas'),
'Cas'[CalendarYear]
)
// SQL Query
DEFINE
VAR _Var0 = VALUES('Cas'[CalendarYear])
EVALUATE
GROUPCROSSAPPLYTABLE(
'Cas'[CalendarYear],
_Var0,
"L1",
SUMMARIZE(
VALUES('Cas'),
'Cas'[DateKey]
)
)
Ako vidíte, tak v kóde je viackrát zobrazený komentár „// SQL Query“, ale v skutočnosti to pod tým volá daxové dotazy. Za normálnych okolností tam v režime DirectQuery naozaj vidieť SQL dotazy spúšťané voči dátovým zdrojom, ale v tomto prípade sú tam viaceré dotazy v jazyku DAX. V skratke – zoberie dáta z jedného dátového zdroja, a postupne aplikuje všetky filtrovacie hodnoty z neho na druhý dátový zdroj. Podobne ako to robí operátor CROSS APPLY v jazyku SQL. Výsledné DAX dotazy nie sú zrovna pekné, ale takto to zvyčajne vyzerá pri zložených dátových modeloch. Takisto aj výkon toho nie je zrovna dobrý, ale budeme optimisti, a snáď sa k tomu dostanú niekedy za uhorský rok a vytunia to tiež.
Na záver
Takže, páni a dámy, režim DirectQuery po novom vie používať aj SQL, aj DAX. A rozhoduje sa podľa toho, voči akému dátovému zdroju potrebuje spustiť dotaz. Takže ak ste si mysleli, že Microsoft konečne dokončil preklad z jazyka DAX do SQL a naopak, tak vás sklamem. Na druhej strane to aspoň nie je taký mačkopes, ako keby to naozaj takto spravili. Lebo udržiavať to a ladiť to ďalšie roky by pre nich bolo asi na mašľu.
To je teda všetko k záhade, ako to funguje na pozadí. Pravdepodobne bude potrebné aktualizovať veľmi veľa dokumentácie, aby to bolo všade po novom takto podchytené. Ale v tomto momente je podstatné to, že to už ako-tak funguje, a že nám to otvára obrovské možnosti pre dátové modelovanie aj reporting. A za takýto vianočný darček môžeme byť tímu Power BI naozaj vďační. ĎAKUJEME! 🙂
Autor, tréner a expert na PowerPivot, Power BI a jazyk DAX. Založil som tento web, aby som pomohol dostať PowerPivot a Power BI do širšieho povedomia, a aby som ľuďom ukázal, že aj komplexné analytické problémy idú riešiť jednoducho. Po nociach vzývam Majstra Yodu a tajne plánujem ovládnutie vesmíru.

