8. listopadu 2019

Jak obejít omezení Power BI u live connection

Na různých konferencích a přednáškách jsem již mnohokrát říkal, proč používáme ve firmě pro většinu Power BI reportů metodu živého připojení do Analysis Services a proč používáme
Multidimensionální kostky.
Důvody pro živé připojení jsou například počet aktualizací za den, centralizace business logiky pro všechny reporty ze stejné kostky.
U Power BI Pro v neposlední řadě velikost datového modelu (1GB u Pro).
Na druhou stranu tento přístup má i stinné stránky. Dlouhodobě mi u Analysis Services vadila vázanost PBIX reportu na Dataset.
Když jste chtěli přemapovat report na druhý server, museli jste stáhnout PBIX, změnit vevnitř připojení a přenasadit report.
U jednoho reportu z kostky není problém. Ale pokud jich máte 20, 30.. 100 ze stejného datového modelu... Failover ručně dělat nechcete.
Tento problém se dá řešit Power Shellovým skriptem (popíšu někdy příště).
Druhý problém který mi vadí a nad kterým jsem se vyplakal v samostatném článku a pro větší dosah článku raději rovnou v angličtině je nemožnost dělat DAX výpočty u živého připojení do SSAS Multidimensional.
To je problém například v případech, kdy potřebujete měřítko, které už v kostce máte. Například „Částka bez DPH“ a uživatel v reportu chce vidět tu stejnou částku ale v tisících v rozpadu v tabulce.
Momentálně není jiné cesty, než rozšířit calculate skript kostky (korporátního enterprise datového modelu).
A přidat tam kalkulaci, kterou potřebujete do jednoho reportu. To je trochu nepoměr měnit datový model určený pro celou firmu kvůli reportu pro pár uživatelů.
Jaktože to nejde... A nebo?
Ve dnešním článku popíšu jak oba problémy když ne vyřešit, tak aspoň obejít a to bez nutnosti cokoliv skriptovat, nebo programovat.
Kouzlo spočívá ve sdílených datasetech. 
Stačí vytvořit první report s živým připojením do Analysis Services Multidimensional.
Dialog vypadá podobně jako na obrázku
Po pravé straně v seznamu polí když chci přidat novou measure, nemůžu viz další obrázek.
Můžu buď expandovat, nebo kolabovat.
A po pravdě poslední 3 roky jsem byl chvíli před kolapsem pokaždé když se nezobrazovaly správně formáty z kostky, nebo chtěl někdo vidět číslo v 1000
, nebo někdo chtěl něco jednoduchého, co nebylo v kostce.
 
Report ukládám a publikuji do Power BI služby pod názvem SD_PRD_Main. 
SD = Share Dataset 
PRD = Production (jen abych předešel spekulacím)
Vytvořím nový prázdný report a použiji Power BI dataset jako zdroj.
V seznamu datasetů vyberu název reportu z předchozího kroku.
A hle... Tvorba nového měřítka je již možná :)
Závěr

Co jsem tímto získal? Jednak možnost tvořit měřítka nad SSAS Multidimensional živým připojením.
Za druhé centrální bod odkud spravuji připojení do kostky Main.
Kdybych nyní udělal 100 reportů nad datasetem SD_PRD_MAIN, stačilo by změnit tento jeden zdrojový report s datasetem a přemapovat jej na druhý server
místo toho abych přiklikával
jednotky, desítky, stovky reportů :)
Mě tento objev udělal radost, doufám že i Vám. Momentálně stojím před problémem jak přemapovat stávající obsah nad tento sdílený dataset bez nutnosti kopírovat jednotlivé objekty.
Zatím ale narážím buď na možnosti API, nebo své schopnosti v PowerShellu (které jsou velmi omezené). Takže pokud se podařilo někomu v PowerShellu
přemapovat stávající objekty z jednoho typu zdroje na druhý u živého připojení, dejte prosím vědět.

18. září 2019

Záznamy přednášek SQL Server Bootcamp 2019

Na letošním SQL Server Bootcampu jsem měl 3 přednášky v krátkém sledu před odjezdem na dovolenou. Pokud jste se náhodou akce nemohli zůčastit. Nebo jste se akce zůčastnili a chtěli byste si informace připomenout, záznamy ze dvou přednášek jsou již na stránkách WUGu.

Personalizovaný reporting - pojednává zejména o Row Level Security v Power BI a SSAS.
https://www.wug.cz/zaznamy/526-SQL-Server-Bootcamp-2019-Jak-na-personalizovany-reporting

Optimalizace Power BI a SSAS datových modelů - má řekl bych samopopisný název :) Dozvíte se něco o tom, jak funguje vertipaq engine a jak využít znalosti ve svůj prospěch. Stejně tak se dozvíte o nástrojích, které můžete využít pro troubleshooting a ladění
https://www.wug.cz/zaznamy/527-SQL-Server-Bootcamp-2019-Optimalizace-Power-BI-a-SSAS-datovych-modelu
Intradenní reporting - přednáška pojednávala o požadavcích na reporting v průběhu dne. Jak se k tomuto problému postavit s Power BI a SSRS.
https://www.wug.cz/zaznamy/534-SQL-Server-Bootcamp-2019-Intradenni-reporting

10. září 2019

Měřítko v dimenzi aneb vlastní layout v Matrixu

K napsání tohoto článku jsem byl inspirován na SQL Server Bootcampu 2019 paní Leonou. Posílám pozdravy. Řešení jsme nakousli již na konferenci po přednáškách, ale možná se bude hodit i někomu jinému. Takže dobrá příležitost pro článek, ve kterém jsem snad ještě trošku vylepšil to, o čem jsme se bavili.
Vizualizace Matrix v Power BI Desktopu má následující sekce. Co na řádky, co na sloupce a která měřítka jsou hodnoty.
Představme si, že máme 3 základní měřítka Částka, Marže a Marže v % a potřebujeme pro ně zobrazit následující scénáře. Skutečnost, Plán a variance proti plánu.
Požadovaný layout:
Dostat ale některá měřítka na řádky a jiná na sloupce je v Power BI trochu problém. Vizualizace Matrix totiž umožňuje defaultně zobrazit data buď na sloupcích
 
Nebo v řádcích díky přepínači ve vlastnostech matrixu „Show on rows“ v sekci „Values“
Řešením je tvorba pomocné dimenze se seznamem toho, co chcete zobrazit na řádcích. V modelu jsem pojmenoval jako „Measure list“ přes zdroj „Enter data“
Poté můžete pomocí funkce SWITCH vytvořit tři metriky Skutečnost, Plán, Variance
Skutečnost = SWITCH(sum('Measure list'[ID]),1,[Castka],2,[Marze],3,FORMAT([Marze %],"0.0%"))

Plán = SWITCH(sum('Measure list'[ID]),1,[Castka Plan],2,[Marze plan],3,FORMAT([Marze % plan],"0.0%"))

Variance = SWITCH(sum('Measure list'[ID]),1,[Castka]-[Castka Plan],2,[Marze]-[Marze plan],3,FORMAT([Marze %]-[Marze % plan],"0.0%"))

A vytvořit požadovaný layout
Přikládám demo soubor pro inspiraci https://bit.ly/2maJZw9 

3. července 2019

Paginated Report Builder a vlastní dataset z Power BI služby

Je to již nějakou dobu, co vyšla varianta aplikace Report Builder pro Power BI Service. Jedná se o přebarvený Report Builder, ze kterého byly vyházeny věci, které nejsou relevantní pro Power BI Service. Jako například sdílené datové zdroje atd. Postupně do něj ale začnou přibývat nové funkce, které jsou naopak relevantní právě pro Power BI službu. Jedním z těchto vylepšení je možnost využít Power BI dataset jako zdroj (vytvořený metodou import). Originální blog post si můžete přečíst zde:
Jako člověk, který tráví v reporting services hodně času tvorbou reportů nad SSAS kostkami a Power BI je moje vášeň jsem si položil otázku, zda půjde vytvořit report s vlastním datasetem.
Datasety pro SSRS reporty si obvykle píšu v MDX jazyce (dá se pro Multidimensional i pro Tabular). Power BI služba má v pozadí tabular, tak by to neměl být problém.
Takže jak na to?
V prvé řadě si budete muset napsat vlastní dataset. Abyste vůbec mohli začít psát, musíte se připojit na “server”.
K tomu nám pomůže DAX Studio (ke stažení zde: https://www.sqlbi.com/tools/dax-studio/)
Pokud máte otevřený soubor s Data Importem vyberte jej, jako já na obrázku
V pravém dolním rohu se Vám zobrazí locaslhost:portnumber

Můžete otevřít management studio, vybrat typ serveru Analysis Services a napsat tam co jste se dozvěděli v DAX Studiu
V seznamu databází se objeví jedna se strašidelným GUID v názvu. Right click – new query – MDX (pokud preferujete DAX, stejný princip, jiná šablona dotazu).
Napíšete si Váš dotaz a odladíte v management studiu.
Otevřete Paginated Report Builder a mezi zdroji zvolíte Add Power BI Dataset Connection... Dialog Vás donutí přihlásit se do Power BI.
Najdete svůj dataset v seznamu a přidáte jej jako datový zdroj.
Right Click na datový zdroj, add dataset. Otevřete Query Designer (2 na dalším screenshotu)
Vyberete jazyk MDX (1) a přepnete z designeru do textového režimu (2)
Vložíte dotaz a pokud v dotazu nemáte parametry, nemáte problém :) Parametrizace reportu je nad rámec tohoto článku.
Dále jen pokračujete s tvorbou SSRS reportu, jako obvykle (tedy pokud s touto technologií pracujete) a může z Vás vypadnout i takováhle drilovatelná tabulka. 
Já vím, že není pěkná, ale tady šlo o proof of concept :)
Můžete publikovat report do Power BI služby (Premium feature). Pokud byste následně otevřeli vytvořený report v klasickém report builderu/Visual Studiu, můžete se podívat na connection string.
Report tam ale bez dalších zásahů spustitelný nebude. 
Jestli se nějak dá doinstalovat data extension PBIDATASET do klasických Reporting Services mi není známo.
Možná se zkusím poptat, protože by to bylo zajímavé.

5. června 2019

Power BI - Performance Analyzer

report je pomalý slyšel pravděpodobně každý vývojář reportů. Minimálně z těch, jejichž tvorba je používána koncovými uživateli :)
Což zjistíme díky logování a monitorování využití (psal jsem zde http://www.neoral.cz/2018/02/power-bi-monitoring-vyuziti-reportu.html).
Datovým modelováním a optimalizací datového modelu jsem se zabýval mimo jiné na WUG Days v této přednášce
(přetočte zhruba na 1:10:00). Pro ladění bylo potřeba v DAX Studiu zapnout tracing, vymazat cache, klikat, analyzovat atd.
Nyní se ale proces ladění Power BI reportů zjednodušuje díky Performance Analyzeru přímo v Power BI Desktopu (představeno v updatu květen 2019) a tom je právě dnešní blog post.
Performance analyzer zobrazíte na záložce view jako jedno ze zatržítek
Objeví se lišta s následující nabídkou
Pokud zapnete nahrávání, můžete provádět libolné interakce na reportu. Kliknul jsem refresh visuals a vypadlo tohle
Nejvyšší čas v milisekundách nemusí nutně znamenat největší problém.
Když rozbalím vizualizace s časem přes 3 vteřiny, uvidím rozpad na DAX Query, Visual Display a Other.
Nabízí se otázka, co který tento čas znamená. DAX query je doba pro vyhodnocení DAX dotazu. Visual display doba na zobrazení vizualizace záludně se tváří Other.
Dokumentace tvrdí, že Other pokrývá čas pro přípravu dotazu, čekání na ostatní vizualizace až doběhnou a cokoliv dalšího.
Takže z posledního obrázku je zřejmé, že Improvers a Decliners vizualizace dlouho trval DAXový dotaz, dalo by se s tímto něco dělat.
Tlačítko Copy query umožňuje dotaz vykopírovat do notepadu (kde toho moc neuděláte) nebo do DAX Studia, kde můžete ladit.
Najít například measure, která způsobuje problémy a řešit její optimalizaci.
U kategorie other bude ladění komplikovanější, protože se může jednat i o čas čekání, než doběhnou všechny ostatní vizualizace a to může být dáno jen počtem vizualizací na straně.

Každopádně je dobré, že se rozšiřují možnosti pro ladění přímo v Power BI Desktopu

26. dubna 2019

DAX for SSAS Multidimensional


One of my major developer pains using Power BI is inability to create report level calculations in Power BI reports live connected to SQL Server Analysis Services Multidimensional. This affects my development for 2+ years and after trying to persuade product team as MVP with no success I decided to go public to support my cause and hopefully fix the problem for me and others by setting up Power BI Idea and let it vote up by public.
First, I would like to bring little bit of context. Currently I work on a project that started prior I joined the company approximately 5 years ago. Solution was built in SSAS multidimensional and is still extended even now. From SSAS we’re reporting using different technologies on Microsoft platform SSRS, ad hoc analysis in Excel and Live Connected Power BI reports.
Why live connection to cube?
Because of data size and shared business logic, that can be used in different reporting tools. Specifically measure definitions for Measures, Time related calculations, Time and Target Variances etc. Security model with Row Level Security. I don’t want to duplicate this logic in multiple data models using data import, because it would be a huge pain to maintain if logic changes for any of these. I need central definition, this is top to bottom BI Delivery.
Why not (yet) tabular?
As stated above, project started 5 years ago and Tabular by the time wasn’t there where it is now (not as Multidimensional). I agree, there were great improvements in Tabular in last 5 years and if I would stand in front of new project, I would probably take it as my first choice. But... The solution is already built. One of main motivators were time calculations stored as utility dimension (one definition working for all measures) and I know this is coming to SQL Server 2019, but I must use what I have in production now.
Truth is there is no straight forward way to migrate Multidimensional solution to Tabular without months of developer resources which we don’t have available, because new business requirements are coming. Even if we had time and resources, current solution contains a lot of logic in calculate script and I’m not 100% sure how I would model it in Tabular without refactoring DWH layer as well.
I’m sure there are other companies/consultants doing Top to Bottom BI Delivery and are stuck now with multidimensional. Please prove me right :-)
Why DAX doesn’t work against Multidimensional cubes?
And that is the point. DAX works against Multidimensional. Thanks to BISM (Business Intelligence Semantic Model) you can query Tabular and Multidimensional using MDX and you can query them by DAX as well. I’m personally using MDX against Tabular data models a lot when developing SSRS reports. And I know I can do it the other way around. It works.
So why it doesn’t work in Power BI?
Tabular works on totally different principals then Multidimensional. Multidimensional doesn’t understand concept of table and relationships as tabular interprets them. So totally different semantics of languages. Some DAX functions won’t work for Multidimensional as tabular. So Power BI team is blocking the functionality of DAX measures against SSAS Multidimensional on purpose from the beginning and had to implement UI changes to achieve that.
Problems with Power BI live connected to SSAS MD
I won’t cover here all the problems I have, just few examples. Even though formats work alright in Excel when connected to cube (Excel is client issuing MDX queries), measure is formatted in Excel correctly, but not in some Power BI visuals. Have a look at this percentage example (which is still valid by the way) https://community.powerbi.com/t5/Desktop/SSAS-Live-Connection-Formatting-Issue/td-p/413419
Chart displays numbers as decimal, data preview table correctly as percentage. This doesn’t happen every time and that is why it is painful. If formatting works or not can be impacted by logic inside of calculate script.
Second for multidimensional live connected models you can’t +/- expand matrix visual.
And the main one for me is, you can’t create measures and this is what this whole blog post is about.
If I need something simple like “Sales Ex Vat in Thousands” and I have in my cube Measure Sales Ex Vat only. I must create calculated member in cube (enterprise data model), divide the number there by 1000 for sake of one Power BI report.
This is wrong!
What would help?
Ability to create report level DAX measures.
I could create [Sales Amount Ths] = [Sales Amount] / 1000
If I have problem with [Margin %], I could create measure [Margin %_] = [Margin %] and format it on report level.
If I need to create variance [Actual]-[Target], I could do it without side effects.
Why not?
If I would need to write complex DAX, with function that could potentially not work or provide incorrect results (which is the assumed concern here). It is my responsibility as developer to dev and test the functionality.
If intellisense won’t work here, I don’t mind. I can write the formula outside of Power BI Desktop, copy and paste.
Even if it is feature which needs to be explicitly enabled to avoid misuse by random user, I’m happy with that.
Some functionality is better than no functionality.
Changing enterprise data models for sake of one report if the calculation could be derived from data in the report is wrong.

If you agree with me. If you miss the functionality. If you would like to help me from my pain. Please support this idea and share


Thank you
Jiri

20. prosince 2018

Tabular a Power BI - velikost modelu

Úvod
Power BI uživatelé, vydržte, článek bude relevantní i pro Vás :) Možná :)
Poměrně častou otázkou, kterou dostávám na konferencích a školení týkající se analytických služeb je: Kdy použít Multidimensional, kdy použít Tabular (Power BI běží na Tabularu).
Rychlá odpověď úplně neexistuje (a možná si to zaslouží samostatný blog post). Jedním z faktorů vstupujících do rozhodování je architektura úložiště.
Multidimensional drží data na disku, Tabular v paměti. Sami si odpovězte na otázku, čeho mají vaše servery více :)
Je ale opravdu třeba se obávat nedostatku paměti? Tabular a Power BI do paměti data komprimuje.
O tom, jak komprese ve Vertipaq úložišti funguje jsem mimo jiné povídal na WUG Days a záznam můžete shlédnout zde
Konkrétně popis enginu na přednášce vychází z knihy od Alberta Ferrari a Marca Russa:
Deffinitive Guide To DAX
Bude vycházet druhá edice, chcete-li komplet přehled, počkejte si.

Priority vývojového týmu Analytických služeb jsou zřejmé. V Tabularu je budoucnost, Multidimensional se více nerozvíjí
(průlomových novinek v Multidimenzionalu jsme se nedočkali od verze 2008) a podpora ze strany klientských aplikací, zejména Power BI, pokulhává.
A to je to, co mě v poslední době vadí nejvíce a přehodnocuji, zda držet se multidimenzionalu je dobrý nápad (a to jsem velký fanda).
Multidimenzional byl pro stávající řešení ve firmě vybrán hlavně s ohledem na funkci. Tabular nesplňoval všechny funkční požadavky, po pár letech je ale situace již trochu jiná.
Na co však v Multidimenzionalu marně čekám a začíná se z toho stávat skutečná bolest jsou session level výpočty na úrovni reportu při živém připojení. Bolestí je víc.
Udělám z toho samostatný blog post v angličtině, protože jeden moudrý člověk mi řekl ohledně mých MVP aktivit. “Chceš-li něco změnit, musí se to dostat k produktovému týmu”.
Takže přemýšlím i nad tím, jestli budu psát česky, střídat jazyky, nebo přejít komplet do angličtiny (abych lépe ovlivnil vývoj produktu). To je ale jiný příběh.
Suma sumárům, začínám ve firmě silně uvažovat nad předělání stávajícího multidimenzionálního řešení na Tabular
(pokud nebudou mé prosby vyslyšeny, nic jiného mi asi nezbyde).
Předělat něco, co vznikalo cca 4 roky nebude ale na den. Takže se můžete těšit i na návazné blog posty.

Hlavní část
Mám multidimenzionální kostku cca 11 measure groups, 27 dimenzí. Na disku v MOLAP storage zabírá 86 GB.
První základní otázka zní
Pokud bych stávající řešení chtěl předělat do Tabularu, kolik paměti si vezme model, ve kterém budu mít dostupná stejná data?
Vytvořil jsem model obsahující všechny Measure Groups. A většinu dimenzí.
Některé malé jsem vynechal, protože by cvičení trvalo zbytečně mnoho času a vliv na velikost by byl beztak minimální.
K analýze velikosti jsem použil Vertipaq Analyzer od SQLBI (https://www.sqlbi.com/)
Nástroj je ke stažení zde včetně tutorialu. V podstatě se jedná o Power Pivot model postavený nad metadaty SSAS. Dá se použít jak pro analýzu Tabularu, tak Power BI.
Stačí změnit connection string na vaše SSAS a aktualizovat data.
Výsledky měření bez jakékoliv optimalizace
Celková velikost databáze 65,6GB bez jakékoliv optimalizace. Nejvíce místa si vzaly 2 největší faktové tabulky.
31 GB availability stock (539 milionu záznamů velká tabulka týkající se dostupnosti zboží) a 27,3 GB stock
(1,8 miliardy záznamů velká snapshotová tabulka týkající se skladových zásob).
Fakta jsou za poslední 3 fiskální roky, u nás tedy nyní cca 2,5 roku dat. Delší historii držíme v datovém skladu. Tyhle dvě faktové tabulky si vzaly 88,76% celkové velikosti.
Význam vybraných sloupců ze screenshotu:
Cardinality - u tabulky počet řádků, u sloupce počet unikátních hodnot
Table size - celková velikost tabulky (Columns size+User Hierarchies Size+Relationship Size)
Columns total size - velikost dat ve sloupcích (Data size, Dictionary size, Columns Hierarchies Size)
Data size - velikost detailních dat
Dictionary size - velikost slovníku souvisí s kompresí detaily o kompresi můžete dozvědět v článku od Alberta a Marca zde

Z předchozího screenshotu je tedy zřejmé, že Availability stock zabírá skoro 31GB a z toho 22,5 GB tvoří slovník.
Tabulka je menší do počtu řádků, ale větší do konzumované velikosti v paměti.
Jak jsou na tom asi jednotlivé sloupce?
Všimněte si žlutých buněk. Tabulka 30,9 GB. Sloupec forecasted_sales_units 26,5 GB. Tedy 85,89%. Data ve sloupci 2GB, slovník pro kompresi k datům 21 GB.
To je trochu nepoměr a prostor pro optimalizaci.
Pokud vím, jak v tabularu funguje komprese, vím že velikost slovníku je dána ovlivněna datovým typem. Datový typ totiž ovlivňuje kardinalitu.
Zkontroluji datový typ u sloupce a vidím float. Můžu zachovat funkčnost modelu a při citlivé změně datového typu nepřijít příliš o přesnost?
Decimal (19,4) by mohl stačit. Provedu reload a podívejte na číla.
Změna datového typu srazila velikost tabulky z 30,9 GB na 5,8 GB. Databázi to dostalo z 65,6 GB na 40,5 GB.
Konkrétní sloupec forecasted sales units jsem dostal z 26,5 GB na 1,3 GB. To je slušné změnou datového typu u jednoho sloupce :)
Závěr

Jak bude velký model v Power BI, nebo Tabularu se nedá dopředu odhadnout jen na základě velikosti vstupních dat.
Bude záležet na množství faktorů, zejména schopnosti vertipaq engine data komprimovat. Tento článek by vám měl dát drobný návod jak na analýzu využitého místa.
Co se týká potenciální konverze stávajícího multidimenzionálního řešení do Tabularu.
Odpověď na první otázku, bude místo problém zní. Místo problém nebude. I rychlost výpočtů pro základní metriky nad tabulkou s 1,8 miliardou záznamů byla velmi slušná.
Je to ale běh na dlouhou trať a je třeba zodpovědět další dotazy. Jako například:
Půjde pokrýt celá funkčnost? Nepůjde rychlost do kytek, jak se začnou věci komplikovat složitostí byznys logiky? O tom někdy potom :)