SSAS Tabular interviews test DAX, model design, and performance tuning. Most candidates can define a measure. Fewer can explain why one is slow, or why a model's memory footprint doubled after adding a single column.
Interviewers use this gap on purpose. Expect questions on the VertiPaq engine, row context versus filter context, partitioning strategy, and row-level security, often followed by a scenario where a report is slow or the numbers look wrong and you have to say how you'd find out why.
These 20 questions cover that range, with sample answers specific enough to show real modeling and troubleshooting judgment instead of textbook definitions.
SSAS Tabular at a glance
| Item | Details |
|---|---|
| Typical employers | Enterprises running Microsoft BI stacks (SQL Server, Azure Analysis Services, Power BI), and BI consultancies |
| Median pay | BLS doesn't track SSAS or BI developer roles separately; the closest category, database administrators and architects, shows a combined median of $126,760 a year, with database architects specifically at $139,500 (BLS, May 2025) |
| Job outlook | 9% growth from 2025 to 2035 for database architects, versus 0% for database administrators as a separate BLS category |
| Education | A bachelor's degree in computer science or information systems is typical; many people move into this role from BI development or SQL Server DBA work |
| Certifications | Microsoft's PL-300 Power BI Data Analyst certification covers overlapping DAX and modeling content, though there's no certification specific to SSAS Tabular itself |
| Key tools | SQL Server Data Tools (SSDT), SQL Server Management Studio, DAX Studio, Tabular Editor, VertiPaq Analyzer, and Power BI |
| Interview format | A technical screen on DAX and modeling, often a live DAX exercise or model design scenario, sometimes a performance troubleshooting case |
How the interview usually works
- Recruiter screen, confirming your experience with Tabular specifically versus Multidimensional or Power BI alone.
- Technical interview, covering DAX, model design, and the VertiPaq engine.
- Hands-on exercise, often writing a DAX measure live or reviewing a slow model and describing how you'd fix it.
- Team or stakeholder round, sometimes with a report author or analyst who consumes the models you'd build.
General and background questions
1. What experience do you have building and maintaining SSAS Tabular models in production?
Why they ask: They want the real scope of what you've owned, not a list of features you can define.
How to answer: Name model size, refresh setup, and what you're responsible for day to day.
Sample answer: I've spent the last 5 years building and maintaining Tabular models for a manufacturing company, currently supporting a model with about 60 tables and 25 GB of compressed data in memory, refreshed nightly through SQL Server Agent. I designed the star schema for our sales and inventory subject areas, wrote the DAX measures the finance and operations teams use in Power BI, and I'm the person who gets paged when a report suddenly looks wrong or a refresh fails.
2. How does SSAS Tabular differ from SSAS Multidimensional, and why would you pick Tabular today?
Why they ask: They want to know you understand the distinction, not just that Tabular exists.
How to answer: Name the storage and query language difference, and give a reason to pick Tabular now.
Sample answer: Multidimensional stores data in MDX-queried cubes built around dimensions and hierarchies defined ahead of time, and it works well but has a steep learning curve. Tabular stores data in memory using the VertiPaq engine, is queried with DAX, and maps more directly to a relational model, which makes it faster to build and easier to hand off to someone who already knows SQL. I'd pick Tabular for nearly any new project today, since it's also what Power BI's own semantic models are built on, and Microsoft's investment has gone almost entirely into Tabular and DAX for years. I'd only reach for Multidimensional on a legacy system with years of MDX logic that isn't worth rebuilding.
3. What tools do you use day to day for developing and troubleshooting a Tabular model?
Why they ask: They want to know your actual toolkit, not just the ones everyone names.
How to answer: Name specific tools and what each one is for.
Sample answer: I build models in SQL Server Data Tools inside Visual Studio, and I use SQL Server Management Studio to manage the server, process the model, and run ad hoc queries. For anything performance-related, I use DAX Studio to capture query plans and server timings, and Tabular Editor for bulk changes to measures or renaming columns across a large model, which is faster than clicking through SSDT one object at a time. When I need to see exactly where the model's memory is going, I run VertiPaq Analyzer, which breaks down size by table and column so I can see which column is actually driving the model's size.
Technical questions
4. How does the VertiPaq engine store and compress data, and why does column cardinality matter?
Why they ask: This is core to understanding model size and performance, and a vague answer signals you haven't looked under the hood.
How to answer: Explain columnar storage and dictionary encoding, and give a concrete cardinality example.
Sample answer: VertiPaq stores data column by column instead of row by row, and it compresses each column with dictionary encoding: unique values get stored once in a dictionary, and the column itself stores small integer references to that dictionary instead of repeating the actual value. That's why cardinality matters: a column with a handful of repeated values, like a status flag, compresses to almost nothing, while a column with a unique value on every row, like a transaction ID or a timestamp down to the second, barely compresses at all. On one model, replacing a datetime column with second-level precision with a date key plus a separate time-of-day column cut that table's size by about 35%.
5. What's the difference between a calculated column and a measure?
Why they ask: This is a fundamental distinction, and they want to know you understand when each is appropriate, not just how to write one.
How to answer: Explain when each is computed and what that means for storage and behavior.
Sample answer: A calculated column is computed row by row when the model processes, and it's stored in memory like any other column, adding to the model's size. A measure is computed at query time, in the context of whatever's currently filtered or grouped in the report, and it isn't stored at all. I use a calculated column when I need a filterable attribute, like a price tier bucket, and a measure for anything aggregated, like total sales, since turning an aggregation into a calculated column would mean it can't respond to filters a user applies in a report.
6. What's the difference between Import mode and DirectQuery, and when would you use each?
Why they ask: This is a common architecture decision, and they want your reasoning, not just the definitions.
How to answer: State the tradeoff between performance and data freshness.
Sample answer: Import mode loads data into the model and compresses it with VertiPaq, giving the best query performance since everything's already in memory, but data is only as current as the last refresh. DirectQuery sends queries straight to the source database instead of storing a copy, so data stays current, but query performance depends entirely on the source system and can't use VertiPaq's compression. I default to Import for nearly everything, and I'd only reach for DirectQuery when the source data is too large to fit in memory economically or when a specific report genuinely needs to reflect changes within seconds, like an operations dashboard tracking live inventory counts.
7. How do row context and filter context differ in DAX, and why does that trip people up?
Why they ask: This is the concept most DAX beginners get wrong, and they want to see you actually understand it.
How to answer: Define both and name the specific point of confusion.
Sample answer: Row context exists when a formula evaluates one row at a time, like inside a calculated column or when an iterator function such as SUMX walks through a table. Filter context is the set of filters currently applied to a calculation, coming from slicers, rows and columns in a visual, or a CALCULATE function. What trips people up is that a calculated column only has row context by default, so referencing a measure inside it doesn't automatically behave the way people expect, since row context doesn't turn into filter context on its own. Converting one into the other is exactly what a function like CALCULATE does, which is the mechanic that confuses most people the first time they hit it.
8. What does CALCULATE actually do, and can you give an example where it changes the result?
Why they ask: CALCULATE is the most-used and most misunderstood function in DAX, and they want proof you can apply it, not just name it.
How to answer: Describe the filter context modification and walk through a real example.
Sample answer: CALCULATE evaluates an expression in a modified filter context, letting you override or add filters on top of whatever the report already applies. A common example is a year-over-year measure:
CALCULATE(SUM(Sales[Amount]), SAMEPERIODLASTYEAR(Calendar[Date]))takes the current filter context, say a specific month, and replaces the date filter with the same period a year earlier, while everything else in the filter context, like product category, stays the same. Without CALCULATE, a measure just inherits whatever filters are already active and can't shift the time period on its own.
9. How do you implement row-level security in a Tabular model, including a case where access should depend on who's logged in?
Why they ask: This is a common real requirement, and they want to know you can go beyond a static role.
How to answer: Contrast a static role with dynamic row-level security tied to the logged-in user.
Sample answer: Static row-level security uses a role with a DAX filter that returns the same rows for every member, like a role that only sees the Northeast region. For access that depends on who's actually logged in, I use dynamic row-level security: a filter expression like
[SalesRegion] = LOOKUPVALUE(UserRegion[Region], UserRegion[UserPrincipalName], USERPRINCIPALNAME()), which checks the logged-in user against a mapping table and filters the fact table to only their assigned region. I built this for a sales team where each rep should only see their own territory's numbers in the same shared report, rather than maintaining a separate static role for every one of 40 reps.
10. How do you decide on a partitioning strategy for a large fact table?
Why they ask: Partitioning is central to keeping refresh times manageable as data grows, and they want a real approach, not a general statement.
How to answer: Name the partition boundary you default to and a concrete before-and-after result.
Sample answer: I partition by date, usually monthly or quarterly depending on volume, so a refresh only has to reprocess partitions with new or changed data instead of the whole table. On a fact table with 400 million rows, switching from a single partition to monthly partitions cut the nightly refresh from about 3 hours to 25 minutes, since only the current month needed a full reprocess and older months stayed untouched using Process Add. I keep partition boundaries matched to how the business actually closes periods, like month-end, so a partition never straddles a boundary finance cares about for reporting.
11. What's the difference between Process Full, Process Data, and Process Add, and when do you use each?
Why they ask: Picking the wrong processing mode either wastes time or misses required updates, and they want to know you know the difference cold.
How to answer: Name what each mode touches and a scenario that calls for it.
Sample answer: Process Full drops all the data in an object and reprocesses it completely, including rebuilding relationships and recalculating calculated columns, which is required after a structural change like adding a column. Process Data loads data into a table or partition without touching hierarchies, relationships, or calculated columns, which is faster when the structure hasn't changed. Process Add incrementally adds new data to a partition, which is what I use for a nightly load of a date-partitioned fact table, since it only touches the new rows instead of reloading the whole partition. I run Process Full only after a real schema change, and Process Recalc afterward if I've changed a partitioning scheme, since that's what rebuilds relationships and calculated columns across the table without a full reload.
12. How do you troubleshoot a DAX measure that's slow?
Why they ask: Performance troubleshooting is a daily reality in this role, and they want your actual process.
How to answer: Name the tool and how you split formula engine time from storage engine time.
Sample answer: I capture the query in DAX Studio and look at the server timings breakdown between the storage engine and the formula engine. If most of the time is in the storage engine, the fix is usually about the model, like reducing column cardinality or adding a partition. If most of the time is in the formula engine, the measure itself is usually the problem, often an iterator like SUMX doing more row-by-row work than it needs to, or a CALCULATE with a filter that forces a full table scan. On one measure, replacing a nested SUMX-inside-SUMX pattern with a single CALCULATE and a simpler aggregation cut query time from about 8 seconds to under 1.
13. What's the difference between a star schema and a snowflake schema, and which does Tabular handle better?
Why they ask: This tests modeling fundamentals specific to how Tabular actually performs.
How to answer: Define both and name the performance reason to prefer one.
Sample answer: A star schema has a fact table connected directly to denormalized dimension tables, one join away from any dimension attribute. A snowflake schema normalizes a dimension further into multiple related tables, like splitting a product dimension into product and category tables. Tabular handles a star schema better, since each additional join it has to traverse at query time adds formula engine overhead a similarly sized star schema wouldn't have. I'll still use a light snowflake when a dimension is genuinely large and updates on its own schedule, but I flatten most dimensions into a single table rather than normalizing them the way I might in a transactional database.
14. How do you use DAX Studio or VertiPaq Analyzer to diagnose a model?
Why they ask: They want to know which tool you reach for and why, based on the actual symptom.
How to answer: Match the tool to the specific problem: a slow query versus a heavy model.
Sample answer: DAX Studio is what I run when a specific query or measure is slow. I capture the query, check the server timings tab for the formula engine versus storage engine split, and review the query plan for obvious inefficiencies. VertiPaq Analyzer is what I run when the whole model feels heavy or takes too long to refresh. It shows column size and cardinality for every table, which is how I find the specific columns actually driving the model's memory footprint, usually a handful of high-cardinality columns nobody's using in a way that justifies their size, like a GUID or a full timestamp that could be split into a date key instead.
15. How do you handle a many-to-many relationship in a Tabular model?
Why they ask: Many-to-many relationships are a common source of double-counted or hard-to-follow results, and they want your approach.
How to answer: Describe using a bridge table and why you prefer it to a native many-to-many setting.
Sample answer: I use a bridge table between the 2 tables that need a many-to-many relationship, rather than relying on Tabular's native many-to-many relationship setting, since a bridge table is more predictable and easier for other people on the team to follow. If a customer can belong to multiple sales territories, I'd build a bridge table with one row per customer-territory pair and relate both the customer dimension and the territory dimension to it. I've used the native many-to-many setting for a simple case, but for anything with real reporting weight behind it, I still prefer the bridge table since it makes filter propagation explicit instead of relying on a setting that's easy to misconfigure without noticing.
Behavioral questions
16. Tell me about a time you had to fix a Tabular model that was too slow for users.
Why they ask: They want a real troubleshooting story with a measurable result, not a general claim about caring about performance.
How to answer: Name the symptom, the diagnosis, and the concrete improvement.
Sample answer: A sales dashboard was taking 15 to 20 seconds to load for some users, and the business was ready to give up on it. I used DAX Studio to find the slowest measure, a running total calculated with a nested CALCULATE inside a FILTER over the entire sales table instead of a simpler time intelligence function. I rewrote it using DATESYTD and a single CALCULATE, and load time for that visual dropped to about 2 seconds. I also found one column with second-level timestamps eating a large share of memory that nobody used at that precision, so I replaced it with a date key, which brought the whole model's refresh time down too.
17. Tell me about a time you disagreed with a stakeholder's request for a data model change.
Why they ask: They want to see you push back on a real cost with a specific reason, not just have a preference.
How to answer: Name the request, the cost you saw, and the alternative you offered.
Sample answer: A stakeholder wanted a new calculated column added directly to a 200-million-row fact table for a one-off report he needed for a single meeting. I pushed back because a calculated column on a table that size gets recalculated on every full process and adds memory overhead permanently, for something used only once. I built the calculation as a measure instead, scoped to just his report, which gave him the number he needed without adding weight to the model everyone else uses daily. He agreed once I explained the model would carry that column's cost forever, not just for his one report.
18. Tell me about a mistake you made in a Tabular model and how you fixed it.
Why they ask: They want to see how you handle and correct a real error, not just that you've never made one.
How to answer: Describe the mistake plainly, what it caused, and the structural fix.
Sample answer: I once set up row-level security using a static role tied to a hardcoded list of usernames, which worked fine until 3 new sales reps joined and their manager assumed they'd automatically see their region's data since the role already existed. They didn't, since nobody had added their names to the role, and it took a support ticket for me to catch it. I rebuilt the security model around dynamic row-level security using a mapping table between users and regions instead, so adding a new rep to a region is a row in a table rather than a manual role edit I have to remember to make every time someone's hired.
Situational questions
19. A model's processing time has grown from 20 minutes to 3 hours as data grew. What do you do?
Why they ask: This is a common real problem, and they want your ordered approach.
How to answer: Check partitioning first, then look for unnecessary calculated columns.
Sample answer: I'd check whether the model is still using a single partition per table, since that's the most common reason processing time grows in a straight line with data volume. If so, I'd move the largest fact tables to date-based partitions, so a nightly refresh only reprocesses the current period with Process Add instead of the entire history every time. I'd also check for calculated columns that no longer earn their place on the model, since every one of those gets recalculated on a full process too. On a similar case, adding monthly partitions to 2 large fact tables and switching the nightly job to Process Add brought processing back down to about 30 minutes.
20. A report shows different totals depending on which slicer combination is used, and business users don't trust it. What do you do?
Why they ask: This tests your process for tracing a modeling bug that only shows up under specific conditions.
How to answer: Reproduce the exact combination, then check CALCULATE filters and relationship structure.
Sample answer: I'd reproduce the exact slicer combination that looks wrong and check the measure's DAX for a CALCULATE that's overriding a filter it shouldn't touch, since that's the most common cause of a total that doesn't add up the way people expect. I'd also check for a many-to-many relationship or a bridge table that might be double-counting rows when 2 specific filters combine. Once I find the cause, I'd verify the fix against a few different slicer combinations, not just the one that was reported, since a modeling bug like this often shows up in more places than the first person who noticed it realized.
Questions to ask the interviewer
- How large is the current Tabular model, and roughly how often does it need reprocessing?
- Is the model deployed to on-premises Analysis Services, Azure Analysis Services, or Power BI Premium?
- How is row-level security handled today, static roles or a mapping-table approach?
- What does the current partitioning strategy look like for the largest fact tables?
- Who owns DAX measure development, the BI team or report authors themselves?
- What's the biggest performance problem in the model right now?
How to prepare
- Practice explaining row context versus filter context out loud with a concrete example, since it's one of the most commonly misunderstood DAX concepts.
- Know the difference between Process Full, Process Data, and Process Add cold, and when each is required.
- Review VertiPaq compression basics, especially why column cardinality drives model size.
- Bring a specific story about diagnosing a slow measure or a heavy model, including the actual before-and-after numbers.
- Spend an evening with DAX Studio and Tabular Editor if you haven't used them directly, since interviewers often ask what tools you reach for first.
If you're preparing for adjacent data roles, our data architect interview questions and data pipeline interview questions guides cover related modeling and platform topics, and solution architect interview questions is useful if the role spans broader platform design as well as BI modeling.
Sources
- Microsoft Learn: learn.microsoft.com/en-us/analysis-services/tabular-models/directquery-mode-…
- Microsoft Learn: learn.microsoft.com/en-us/power-bi/connect-data/desktop-tutorial-row-level-s…
- Microsoft Learn: learn.microsoft.com/en-us/analysis-services/tabular-models/process-database-…
- Microsoft Learn: learn.microsoft.com/en-us/dax/dax-overview
- U.S. Bureau of Labor Statistics: bls.gov/ooh/computer-and-information-technology/database-adminis…
by