SQL Server Analysis Services: The Complete DBA Guide
SQL Server Analysis Services (SSAS) is the analytical engine built into SQL Server. It sits between the relational database and BI tools like Power BI, Excel, and SSRS, delivering fast query responses over large volumes of data by storing pre-aggregated or compressed analytical models. SSAS runs as a separate Windows service from the Database Engine and is installed and managed independently.
Understanding SSAS means understanding the two distinct modes it supports, the query languages each mode uses, the compatibility level system for tabular models, how SSAS integrates with Power BI and Excel, and where SSAS fits in Microsoft’s current analytics roadmap versus Azure Analysis Services and Microsoft Fabric.
Contents
Two Modes: Tabular and Multidimensional
BeginnerSQL Server Analysis Services installs in one of two server modes: Tabular or Multidimensional. The mode is selected during installation and cannot be changed afterward without uninstalling and reinstalling. Each SSAS instance runs in exactly one mode. To run both modes, install two separate SSAS instances on the same server — though this is resource-intensive and only recommended on high-end hardware.
| Attribute | Tabular Mode | Multidimensional Mode |
|---|---|---|
| Default mode at installation | Yes | No (must be explicitly selected) |
| Storage engine | VertiPaq (in-memory columnar compression) | MOLAP (pre-aggregated multidimensional storage) |
| Primary query language | DAX (Data Analysis Expressions) | MDX (Multidimensional Expressions) |
| Supported in Azure Analysis Services | Yes | No — cloud deployment requires tabular or Azure VM |
| Supported in Power BI Premium | Yes (compatibility level 1500+) | No |
| Model development tool | Visual Studio with Analysis Services Projects extension | Visual Studio with Analysis Services Projects extension |
| Write-back (users modify cell values) | Not supported | Supported |
| Microsoft’s strategic direction | Primary investment area | Mature, maintained, no new cloud path |
Storage Engines: VertiPaq, MOLAP, ROLAP, DirectQuery
Intermediate| Engine | Mode | How Data Is Stored | Query Speed |
|---|---|---|---|
| VertiPaq | Tabular (default) | Columnar in-memory compression. Data is loaded from the source and stored in a highly compressed columnar format in RAM. Queries are processed entirely in memory. | Fastest — sub-second on billions of rows in sufficient RAM |
| MOLAP | Multidimensional (default) | Pre-aggregated multidimensional data stored on disk in SSAS proprietary format. Aggregations are computed during processing, not at query time. | Very fast for pre-defined aggregation paths; slower for ad-hoc queries outside pre-built aggregations |
| ROLAP | Multidimensional (optional) | No local storage — queries go directly to the relational source at query time. Configured per-partition or per-storage group. | Slower — relational query performance at query time; no pre-aggregation benefit |
| DirectQuery | Tabular (optional) | No local in-memory storage — queries translated to SQL and sent to the relational source at query time. Model metadata is stored in SSAS but data lives in the source. | Source database query performance; useful for real-time data requirements or models too large for RAM |
Query Languages: DAX and MDX
Beginner| Language | Full Name | Primary Use | Supported By |
|---|---|---|---|
| DAX | Data Analysis Expressions | Calculations and queries against tabular models. Also used in Power BI and Excel Power Pivot. Relational-style syntax familiar to Excel formula users. | Tabular models (calculations and queries); Multidimensional models (queries only, read-only) |
| MDX | Multidimensional Expressions | Queries and calculations against multidimensional cubes. Used by Excel PivotTables connecting to SSAS, SSRS MDX query designer, and many third-party BI tools. | Multidimensional models (calculations and queries); Tabular models (queries only) |
| TMSL | Tabular Model Scripting Language | Scripting and management of tabular models: creating, altering, processing, and backing up databases. Used over XMLA. Available from compatibility level 1200+. | Tabular models at compatibility level 1200 and higher |
| ASSL | Analysis Services Scripting Language | Scripting multidimensional models and older tabular models (compatibility levels 1050–1103). Used over XMLA. | Multidimensional models; Tabular models at compatibility levels 1050–1103 |
Tabular Model Architecture
IntermediateA tabular model organizes data into tables, columns, relationships, and measures — a structure familiar to anyone who has worked with relational databases or Power BI Desktop. Tabular models are developed in Visual Studio using the Analysis Services Projects extension, then deployed to an SSAS Tabular instance where they run as a database.
The core objects in a tabular model:
| Object | Description |
|---|---|
| Table | Holds columns and rows of data, sourced from one or more data source partitions. Analogous to a relational table. |
| Column | A typed column within a table. Stored in VertiPaq as a compressed columnar segment. |
| Relationship | Defines how tables join to each other. Supports one-to-many, many-to-many (from compatibility level 1400+), and bidirectional cross-filter. |
| Measure | A DAX formula that computes a value at query time based on current filter context. Measures are the primary calculation mechanism in tabular models. |
| Calculated Column | A DAX formula evaluated at process time and stored in the model. Increases model size; use sparingly compared to measures. |
| Partition | Divides a table into independently processable segments, typically by date range. Allows incremental refresh of large tables without full reprocessing. |
| Calculation Group | A collection of calculation items (for example, Year-to-Date, Prior Year) that modify how measures calculate. Available from compatibility level 1500. |
| Perspective | A named subset of the model’s tables and measures, used to simplify the model surface for specific user groups. |
| Role | Defines access permissions and row-level security (RLS) filters for the model. Users and groups are assigned to roles. |
Compatibility Levels
IntermediateTabular models have a compatibility level that determines which features are available. The compatibility level is set when the model project is created in Visual Studio and can be upgraded — but not downgraded — after deployment. Higher compatibility levels unlock modern features but reduce backward compatibility with older SSAS server versions.
| Compatibility Level | Supported In | Key Features Introduced |
|---|---|---|
| 1700 | SQL Server 2025, Power BI Premium, Azure Analysis Services | Horizontal Fusion query optimization, DAX LINEST/LINESTX regression functions, selection expressions in calculation groups |
| 1600 | SQL Server 2022, Power BI Premium, Azure Analysis Services | MDX Fusion (improved MDX query performance), QueryMemoryLimit applies to MDX queries |
| 1500 | SQL Server 2022, SQL Server 2019, Power BI Premium, Azure Analysis Services | Calculation groups, many-to-many relationships, DirectQuery improvements, enhanced metadata |
| 1400 | SQL Server 2022, SQL Server 2019, SQL Server 2017, Azure Analysis Services | Get Data (M queries) for data sources, bi-directional cross-filtering, detail rows expressions |
| 1200 | SQL Server 2022, SQL Server 2019, SQL Server 2017, SQL Server 2016, Azure Analysis Services | Tabular metadata (TMSL scripting replaces ASSL), JSON-based object model |
| 1100/1103 | SQL Server 2017 and earlier only | Original tabular format. Discontinued in SQL Server 2022. Must be upgraded to 1200+ before migrating to SSAS 2022. |
DirectQuery Mode
IntermediateIn DirectQuery mode, the tabular model stores no data locally. When a client queries the model, SSAS translates the DAX query into SQL and sends it to the source relational database. The source executes the SQL and returns results to SSAS, which assembles the final response.
DirectQuery is appropriate when:
- The dataset is too large to fit in server RAM in VertiPaq mode
- Real-time or near-real-time data freshness is required (no processing latency)
- The source database has its own caching and performance optimization
DirectQuery has trade-offs: query performance depends entirely on the source database, some DAX functions and model features are not supported in DirectQuery mode, and every user query results in a relational query against the source. For mixed scenarios, SSAS supports hybrid partitions where some table partitions use VertiPaq and others use DirectQuery.
Multidimensional Model Architecture
IntermediateMultidimensional models have been the foundation of enterprise OLAP analytics since SQL Server 2000. They organize data using a cube metaphor: a central fact table (measures) is surrounded by dimension tables that provide context. The model is processed — queries are run against the source, aggregations are pre-computed — and the result is stored in SSAS’s MOLAP format for fast query response.
Multidimensional models are the correct choice when:
- Complex MDX calculations are required: named sets, custom rollups, many-to-many dimension relationships using intermediate measure groups
- Write-back capability is needed (users write values back to specific cells for what-if analysis or budgeting)
- The organization has an existing multidimensional estate that would be cost-prohibitive to redesign as tabular
- Large volumes of pre-aggregated data need to be served consistently to many concurrent users
Cubes, Dimensions, and Measures
Beginner| Object | Description |
|---|---|
| Cube | The top-level multidimensional database object. Contains one or more measure groups and dimensions. Users connect to a cube to run MDX queries. |
| Measure Group | A collection of measures sharing the same granularity and fact table. A cube can have multiple measure groups from different fact tables. |
| Measure | A numeric value derived from the fact table: Sales Amount, Order Count, Profit Margin. Measures are evaluated in the context of dimension filter selections. |
| Dimension | Provides context for measures: Date, Product, Customer, Geography. Contains attributes and hierarchies used to slice and filter the cube. |
| Attribute | A property of a dimension member: Product Name, Product Category, Customer City, Order Date (year, quarter, month, day). |
| Hierarchy | An ordered structure of attributes within a dimension, enabling drill-down: Year → Quarter → Month → Day, or Country → Region → City. |
| Aggregation | Pre-computed summary values stored during processing. SSAS’s aggregation design determines which combinations of dimension attributes have pre-built summaries. |
| Partition | Divides a measure group into processable segments, typically by time period. Allows incremental processing of the current period without reprocessing historical data. |
| Named Set | A named MDX expression that defines a reusable set of dimension members: “Top 10 Customers”, “East Region Products”. A multidimensional-only feature. |
| Calculated Member | A MDX expression defining a virtual measure or dimension member: Gross Margin %, Moving Average, Year-over-Year Growth. Evaluated at query time. |
Installation and Server Mode
BeginnerSSAS is installed through the SQL Server installation wizard as a separate feature from the Database Engine. On the Feature Selection page, select Analysis Services. On the Analysis Services Configuration page, choose the server mode and add the Windows accounts or groups that will be SSAS server administrators.
The mode selected at installation sets the DeploymentMode property in the msmdsrv.ini configuration file: 0 = Multidimensional, 2 = Tabular. This property must not be changed manually after installation — doing so is not supported and corrupts the server state. If the wrong mode was selected, uninstall and reinstall.
-- Verify SSAS server mode and version via DMV query
-- Connect to the SSAS instance in SSMS, open a new MDX or DAX query
-- For tabular instances, use DAX Studio or the SSMS DAX query window
-- Query server properties via XMLA (works for both modes in SSMS)
-- In SSMS: connect to Analysis Services > New Query > MDX or XMLA
SELECT * FROM $SYSTEM.DISCOVER_PROPERTIES
WHERE PROPERTYNAME = 'ServerMode'
-- Returns: 'Multidimensional' or 'Tabular'
-- Check SSAS version
SELECT * FROM $SYSTEM.DISCOVER_PROPERTIES
WHERE PROPERTYNAME = 'ProductVersion'
Security and Roles
IntermediateSSAS uses its own role-based security model at two levels: server level and database level. Server administrators are configured during installation and have full control. Database roles control access to model data.
| Security Level | Scope | How Configured |
|---|---|---|
| Server administrator | Full server management: create and delete databases, manage server properties, process any database | Configured at installation; managed through SSAS server properties in SSMS |
| Database role (Full Control) | Full control of one database: process, read, modify model | Created in the model project or SSMS; Windows users and groups added as members |
| Database role (Process) | Permission to process (refresh) the database without read access to data | Used for ETL service accounts that refresh the model |
| Database role (Read) | Query the model data; typically assigned to end users | The standard role for BI tool users connecting to SSAS |
| Row-level security (tabular) | DAX filter expressions on table rows within a role — users in the role only see rows matching the filter | Defined as DAX filter expressions on table objects within a Read role |
| Dimension security (multidimensional) | Restricts which dimension members are visible to a role | Configured on dimension objects within a role in the model project or SSMS |
-- Example tabular row-level security DAX filter
-- Applied to the Customer table within a Read role
-- Users in this role only see customers in their assigned region
-- In the model role definition, set the DAX filter on the Customer table:
[Region] = USERNAME()
-- Or map to a security table:
[CustomerID] IN SELECTCOLUMNS(
FILTER(SecurityMapping, SecurityMapping[UserPrincipalName] = USERNAME()),
"CID", SecurityMapping[CustomerID]
)
Processing Models
IntermediateProcessing is the operation that loads data from the source into the SSAS model. For tabular models this means refreshing the VertiPaq in-memory store. For multidimensional models this means re-reading fact and dimension data and recomputing aggregations.
| Process Type | What It Does | When to Use |
|---|---|---|
| Process Full | Drops all existing data and reloads from scratch. Clears all partition data and re-queries all source data. | Initial load, schema changes, corrupted data recovery |
| Process Data | Loads data into partitions without rebuilding aggregations (multidimensional) or recalculating calculated columns (tabular). | Faster than Process Full when only raw data has changed and aggregations will be rebuilt separately |
| Process Add | Appends new rows to existing partitions without reprocessing existing data. Multidimensional only. | Incremental load of new fact records when no existing records have changed |
| Process Recalc | Recalculates aggregations and hierarchies without reloading data. Multidimensional only. | After Process Data, to rebuild aggregations as a separate step |
| Process Clear | Removes all data from a partition or database without reloading. Leaves the structure intact. | Clearing test data; partition management |
| Process Default | Determines the minimum processing needed based on current state: unprocessed objects get full processing; already-processed objects may be skipped. | Efficient processing when the state is known and not all objects need full reprocessing |
Processing is typically scheduled through SQL Server Agent jobs that call SSAS processing via XMLA, TMSL, or PowerShell. The Analysis Services PowerShell module provides Invoke-ProcessASDatabase and related cmdlets for scripting processing operations.
Client Connectivity: Power BI, Excel, SSRS
Beginner| Client | Connection Type | Supported Model Types | Notes |
|---|---|---|---|
| Power BI Desktop / Service | Live Connection or DirectQuery to SSAS | Tabular (all compatibility levels); Multidimensional (read-only MDX) | From May 2022, Power BI supports DirectQuery connections to SSAS 2022 tabular models. Live Connection uses the SSAS model’s own DAX engine. |
| Microsoft Excel | PivotTable using Analysis Services data connection | Tabular (MDX queries generated by Excel); Multidimensional (native MDX) | Excel generates MDX queries against both model types. MDX Fusion in SSAS 2022 improves Excel performance against tabular models. |
| SQL Server Reporting Services | Analysis Services data source using MDX query designer | Tabular and Multidimensional | MDX query designer in SSRS provides drag-and-drop report building against SSAS cubes and tabular models. |
| Azure Analysis Services | Any SSAS-compatible client using XMLA endpoint | Tabular only | AAS does not support multidimensional models. Shares the same tabular engine as on-premises SSAS. |
| DAX Studio | Direct SSAS connection for DAX query development | Tabular | Community tool (daxstudio.org); essential for DAX query performance analysis and model exploration. |
SSAS Roadmap: On-Premises vs Azure vs Fabric
IntermediateMicrosoft’s analytical platform strategy has shifted toward cloud-native services. Understanding where SSAS fits versus Azure Analysis Services and Microsoft Fabric is important for both new project decisions and long-term planning.
| Platform | Model Support | Where It Runs | Strategic Direction |
|---|---|---|---|
| SQL Server Analysis Services | Tabular and Multidimensional | On-premises Windows Server; Azure VM | Supported and maintained through SQL Server lifecycle (SQL Server 2022 supported until 2033). New features added in SSAS 2025. No official end-of-life announced. Multidimensional innovation has slowed; tabular receives ongoing DAX and query engine improvements. |
| Azure Analysis Services | Tabular only | Azure managed service | Fully managed cloud SSAS tabular. Microsoft is steering customers toward Power BI Premium / Fabric for new projects. AAS remains supported but Fabric semantic models are the forward-looking path. |
| Power BI Premium / Fabric semantic models | Tabular only (compatibility level 1500+) | Microsoft cloud | Microsoft’s primary investment area. Uses the same tabular engine. Fabric semantic models are the successor to both AAS and Power BI Premium datasets for new analytical model development. |
SQL Server 2025 SSAS Changes
IntermediateSQL Server Analysis Services 2025 introduced the following changes, all verified against Microsoft Learn:
| Change | Details |
|---|---|
| Compatibility level 1700 | New tabular compatibility level for SSAS 2025, Power BI Premium, and Azure Analysis Services |
| Horizontal Fusion | Query execution plan optimization that fuses multiple smaller data source queries into fewer larger queries, reducing round trips and improving DAX performance in DirectQuery mode |
| Improved DirectQuery parallelism | Multiple data source queries are parallelized for a single DAX query, reducing the impact of source database latency on query response times |
| DAX LINEST and LINESTX | New DAX functions for linear regression using the least squares method — first regression functions natively available in DAX |
| Selection expressions in calculation groups | Additional control over calculation item behavior when multiple items are selected or no specific selection is made |
| Schema write operation encryption enhancement | Tabular and multidimensional model databases may need to be upgraded to ensure proper encryption compatibility |
| Windows Arm64 not supported | SSAS 2025 runs only on Intel and AMD x86-64 processors |
Workshop: Build and Query a Tabular Model
This workshop builds a minimal SSAS tabular model, deploys it to a local SSAS instance, and queries it with DAX. Prerequisites: SQL Server 2019 or later with SSAS Tabular installed, Visual Studio 2022 with the Analysis Services Projects extension, SSMS, and DAX Studio (optional but recommended).
Step 1: Create the tabular model project
- Open Visual Studio 2022. Select File → New → Project. Search for “Analysis Services Tabular Project” and select it.
- Name the project
SalesAnalysis. On the Tabular model designer dialog, select the compatibility level matching the SSAS instance (1600 for SSAS 2022, 1700 for SSAS 2025). Select the local SSAS workspace server. - In the model designer, right-click Model.bim in Solution Explorer and select Import from Data Source.
Step 2: Import data
- Connect to the AdventureWorksDW database (or any SQL Server database with fact and dimension tables). Import at minimum: FactInternetSales, DimProduct, DimDate, DimCustomer.
- In the model diagram view, verify that relationships are detected automatically. If not, create relationships manually by dragging between key columns.
Step 3: Create a measure
- Click the FactInternetSales table in the model designer. In the measure grid at the bottom, click in an empty cell.
- Type the following DAX measure and press Enter:
Total Sales := SUM(FactInternetSales[SalesAmount])
- Create a second measure for year-to-date:
Sales YTD :=
TOTALYTD(
[Total Sales],
DimDate[FullDateAlternateKey]
)
Step 4: Deploy and process the model
- Right-click the project in Solution Explorer and select Properties. On the Deployment Server tab, set the Server to the local SSAS Tabular instance name (for example,
localhost\TABULARor justlocalhostfor the default instance). - Select Build → Deploy SalesAnalysis. Visual Studio deploys the model to SSAS and processes it, loading data from the source.
- After deployment, connect to the SSAS instance in SSMS. Expand Databases to confirm SalesAnalysis appears.
Step 5: Query the model with DAX
- In SSMS, right-click the SalesAnalysis database and select New Query → MDX (or open DAX Studio and connect to the deployed model).
- Run the following DAX query to return total sales by product category:
EVALUATE
SUMMARIZECOLUMNS(
DimProduct[EnglishProductCategoryName],
"Total Sales", [Total Sales],
"Sales YTD", [Sales YTD]
)
ORDER BY [Total Sales] DESC
- Verify results return correctly. If using DAX Studio, the query execution pane shows server timings broken down by Formula Engine and Storage Engine time — useful for understanding query performance.
Step 6: Connect Power BI or Excel
- In Power BI Desktop: Home → Get Data → Analysis Services. Enter the SSAS server name. Select Live Connection. Browse to the SalesAnalysis model and connect. Build a report using the Total Sales and Sales YTD measures.
- In Excel: Data → Get Data → From Database → From Analysis Services. Enter the server name and select the SalesAnalysis database. Create a PivotTable connected to the deployed model.
The technical information in this article was verified against Microsoft documentation at the time of publication. SQL Server features, cloud service capabilities, licensing terms, and configuration requirements can change between versions and cumulative updates. Always validate implementation details against current Microsoft Learn documentation before deploying to production. References in this article link directly to the authoritative Microsoft sources.
References
- Microsoft Docs: SQL Server Analysis Services Overview
- Microsoft Docs: Comparing Tabular and Multidimensional Solutions
- Microsoft Docs: What’s New in SQL Server Analysis Services
- Microsoft Docs: Compatibility Level for Tabular Models
- Microsoft Docs: Install SQL Server Analysis Services
- Microsoft Docs: Determine the Server Mode of an Analysis Services Instance
- Microsoft Docs: Data Mining (Analysis Services) — Discontinued in SQL Server 2022
- Microsoft Docs: Roles in Tabular Models
- Microsoft Docs: Process Database, Table, or Partition
- SQLYARD: Power BI DirectQuery vs Import Mode
- SQLYARD: SQL Server 2022: Azure Integration, Query Intelligence, Security, and Data Virtualization
- SQLYARD: HA and DR Options for SQL Server 2025
Discover more from SQLYARD
Subscribe to get the latest posts sent to your email.


