Používa režim DirectQuery v Power BI jazyk DAX alebo SQL voči externým dátovým modelom?

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! 🙂