karthikbi.dev

Karthik BI · Senior BI Engineer

Beyond the Dashboard

18 years turning data into decisions across manufacturing, finance, and tech. Here I share what I learn.

PBIP Gave Us Git. Skills Made Everyone Use It the Same Way.

Most of my team were new to Git. So we packaged the PBIP workflow — branch, change, commit, push, PR — as skills and scripts, with the ticket number carried through to promotion.

Power BI2 min read

We Built a Tool to Find Unused Measures. Then the Platform Kept Shrinking It.

Hundreds of unused measures, found once a quarter by uploading files. Then PBIP, Git and a metadata database turned cleanup into a query.

Power BI2 min read

A Year on PBIP: The Model Stopped Being a File

One year on Power BI Projects (PBIP): version control, multiple developers, pull requests from other teams and AI agents reading the model for context.

Power BIData Modeling3 min read

How I Built a Fabric App on 1,851,282 Flights

1,851,282 US flights, a semantic model and Claude Code. How I went from New item to a deployed Fabric App with a map, filters and animation.

Microsoft FabricPower BI3 min read

Direct Lake Gave Me the Right Number. It Just Didn't Use Direct Lake.

A table based on a SQL view in a Direct Lake on SQL model returned the right total and still showed Direct Lake. Performance Analyzer showed it had gone through DirectQuery.

Microsoft FabricPower BI3 min read

What Direct Lake Actually Is: I Added a Row and Never Refreshed the Model

I inserted one row into a Fabric Warehouse table and watched a Power BI report pick it up without a manual model refresh, and what that says about how Direct Lake works.

Microsoft FabricPower BI3 min read

18 Fields in One Flat List, Half of Them Nobody Should Touch

Raw lat/long, an internal system flag, a vendor ID — all sitting in the field list next to the measures people actually need. Hiding and foldering it costs five minutes once.

Power BIData Modeling3 min read

Copilot Ignored a Real Field Twice. A Description Didn't Help. Synonyms Did.

'Extra' is an ambiguous field name. Copilot grabbed the wrong field, then grabbed another wrong one after I added a description. Synonyms were the only lever that worked.

Power BICopilot4 min read

The Total Row Said $111,270.85. The Real Answer Was $146,626.18.

A measure's total row doesn't sum what's on screen — it re-evaluates in its own filter context. For a table of daily maximums, that's a different number, and it's wrong for what it claims to be.

Power BIDAX3 min read

One Calculated Column Cost 1.4MB on a 10.9M-Row Table. The Measure Cost Nothing.

On sample data the difference is invisible. At 10.9 million rows, a single calculated column added over a megabyte to the file — and the identical logic as a measure added zero.

Power BIDAXPerformance4 min read

I Built the Same View-Switcher Two Ways: Bookmarks vs Field Parameters

Bookmarks won on setup speed. Field parameters won on object count, on what actually gets swapped, and on every view I added afterward.

Power BIData Modeling4 min read

One Checkbox, 55KB, and Only Two Date-Heavy Tables

Auto Date/Time builds a hidden Year/Quarter/Month/Day hierarchy for every date column whether you ask for it or not. On a two-table model that was 55KB — about 15%.

Power BIPerformance4 min read

Sum of UnitPriceDiscount Showed $8.4 — A Number That Means Nothing

Drag a discount rate into a table and Power BI sums it by default. The total row read $8.4, formatted as currency, looking exactly like something you would trust.

Power BIDAXData Modeling3 min read

A Text-Typed Date Column Doesn't Announce Itself as Broken

OrderDate came in as text. Nothing errored — the line chart just sorted Aug → Jul → Jun, and Relative date was missing from the filter pane entirely.

Power BIPower Query3 min read

Auto-Detect Guessed My Cardinality, and Guessed It Wrong

Power BI's auto-detected relationship looked right for weeks — 1-to-1, bidirectional — until a customer placed a second order and refresh failed outright.

Power BIData Modeling4 min read