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.