You open a colleague's measure and spot REMOVEFILTERS where you would have typed ALL. Is it just ALL with a new name? You swap one for the other, refresh the report, and your "percent of total" now shows 100% on every row. Or worse, the grand total looks right but the rows are off.
That moment is why this comparison matters. The two functions overlap heavily, but they are not identical, and the differences hide in places like iterators, variables and filters that arrive from related tables. This article covers ALL vs REMOVEFILTERS from the ground up: syntax, behavior, pros and cons, pitfalls, best practices and 20 worked examples.
One note before we start. Anything that depends on your Power BI version, your SSAS compatibility level, or evaluation details I can't guarantee is flagged. Wherever I say "test it", open the DAX query view and run the query yourself. Ten minutes of testing beats an hour of guessing.
The Sample Data Model Used in This Article
Every example uses the same small star schema, so you can focus on the DAX rather than the data.
- Customer (dimension): CustomerKey, CustomerName, Segment, City, State, Country, Region and more.
- Product (dimension): ProductKey, ProductName, Category, Subcategory, Brand, Color, UnitCost, ListPrice and more.
- Date (dimension, marked as the date table): Date, Year, Quarter, MonthName, FiscalYear and more.
- Sales (fact, one row per order): SalesOrderID, CustomerKey, OrderDate, ShipDate, SalesChannel, Freight, TaxAmount.
- Sales Order Details (fact, one row per product per order): SalesOrderLineID, SalesOrderID, ProductKey, Quantity, UnitPrice, DiscountPct, SalesAmount, TotalCost.
All relationships are one-to-many with single-direction filtering. Customer and Date filter Sales, and Sales filters Sales Order Details. Product filters Sales Order Details directly. Header-level amounts such as Freight and TaxAmount are not filtered by Product, so never slice them by Product columns.
The base measures are used exactly as defined:
Total Sales = SUM ( 'Sales Order Details'[SalesAmount] )
Sales All Products =
CALCULATE ( [Total Sales], REMOVEFILTERS ( Product ) )
% of All Products =
DIVIDE ( [Total Sales], [Sales All Products] )
Other base measures, such as [Total Cost], [Total Profit] and [Order Count], follow the same conventions. Any extra measure or calculated table is named before it is used.
Concepts: Filter Context and "Removing a Filter"
What is filter context?
Filter context is the set of filters active when a measure is evaluated. Slicers, rows and columns in a visual, page filters and filter arguments in CALCULATE all contribute. Think of it as the filter chips at the top of a report: Category = Bikes, Year = 2025, Country = Germany. The measure only "sees" the rows that survive all those chips.
What does "removing a filter" mean?
Removing a filter means clearing the chips for a table or column before the calculation runs. If a row in your visual says Category = Bikes, a measure that clears the Category filter calculates as if the row had no Category chip at all. That is how you build a denominator: the number for this row divided by the number for everything.
ALL in one paragraph
ALL is a table function. It returns every row of a table, or every distinct value of one or more columns, ignoring existing filters. Because it returns a table, you can use it in two ways. Inside CALCULATE it acts as a filter modifier that clears filters. Anywhere else it is an ordinary table expression you can iterate, count, store in a variable or pass to other table functions.
REMOVEFILTERS in one paragraph
REMOVEFILTERS is a CALCULATE filter modifier. It clears filters from a table, from specific columns, or, with no arguments, from the whole filter context. It does not return a table, and that single fact is the source of most of the practical differences.
How they are typically used
Both show up in denominators: percent of total, share of parent, grand totals and rankings. The pattern is always the same. Evaluate the measure in the current context for the numerator, then evaluate it again with some filters cleared for the denominator.
Syntax
ALL
ALL ( [table | column [, column [, ...]]] )
- Table form:
ALL ( Product )returns all rows of the table, ignoring filters, and clears every column filter on that table when used in CALCULATE. - Column form:
ALL ( Product[Category] )returns the distinct values of that column. You can list several columns, and they must all come from the same table. - No-argument form:
ALL ()clears filters on every table in the model. It is limited to use as a CALCULATE filter modifier. - Arguments must be references to an existing table or column, not expressions. Check the current documentation for any further restrictions in your version.
REMOVEFILTERS
REMOVEFILTERS ( [table | column [, column [, ...]]] )
- Table form:
REMOVEFILTERS ( Product )clears all filters on that table. - Column form:
REMOVEFILTERS ( Product[Category] )clears the filter on one or more columns of the same table. - No-argument form:
REMOVEFILTERS ()clears all filters across the model. - It is valid only as a filter modifier in CALCULATE or CALCULATETABLE. It cannot return a table for other functions to use.
Version support
REMOVEFILTERS is newer than ALL. I am not going to quote a specific release, so check that your Power BI Desktop version, service or SSAS Tabular instance supports it. If you maintain models on older SSAS versions or compatibility levels, check support before standardizing on it.
Key Behavioral Differences
1. Return value
ALL returns a table, so it works anywhere a table is expected: SUMX ( ALL ( ... ), ... ), COUNTROWS ( ALL ( ... ) ), ADDCOLUMNS ( ALL ( ... ), ... ), or VAR t = ALL ( ... ). REMOVEFILTERS returns no table, so in any of those places it is invalid. This is the one situation where you have no choice.
2. Behavior as a CALCULATE modifier
When both are used purely to clear filters inside CALCULATE, they produce the same filter-clearing effect. The real difference is readability. REMOVEFILTERS says "I only want to clear filters", while ALL leaves the reader wondering whether a table is being used somewhere. In a code review, REMOVEFILTERS communicates intent faster.
3. Table vs column scope
Clearing a table removes filters on all its columns. Clearing a column removes the filter on that column only, and other columns of the same table stay filtered. Filters on other tables are not touched by either, which leads to the next point.
4. Filters that come from related tables
Clearing a fact table does not clear filters sitting on a related dimension. Suppose a visual filters Customer[Country] = Germany. If you clear the Sales table, the filter on Customer is still there. It propagates down through the relationship again, so the result is still German sales. Clear the table that actually holds the filter. Examples 15 and 16 demonstrate this, and you should run them against your own model.
5. The blank row
If a relationship has fact rows with no matching dimension row, Power BI shows a blank member. ALL includes that blank member in what it returns, and ALLNOBLANKROW excludes it. If you care about this edge case, test it with your data, because the effect on counts and rankings depends on whether your model has unmatched keys.
6. Interaction with other CALCULATE filters and row-level security
When CALCULATE contains both clearing modifiers and new filter arguments, the documented behavior is that clearing is applied before the new filters. Check the current CALCULATE documentation for the full evaluation order and test your pattern (example 17). For row-level security (RLS), the engine enforces security filters and a DAX modifier is not a way around them, so a denominator only covers rows the user may see. Verify this with "View as" in your own environment before relying on it.
Comparison Table
| Aspect | ALL | REMOVEFILTERS |
|---|---|---|
| Purpose | Return all rows or distinct values, ignoring filters; also clears filters in CALCULATE | Clear filters only |
| Return type | Table (except the no-argument form, which is a modifier only) | No table |
| Usable as CALCULATE filter modifier | Yes | Yes (also CALCULATETABLE) |
| Usable as table expression (iterators, variables) | Yes, with a table or column argument | No |
| Arguments accepted | One table, or one or more columns from the same table | One table, or one or more columns from the same table |
| No-argument form | ALL (), CALCULATE modifier only, clears all filters | REMOVEFILTERS (), clears all filters |
| Effect on filter context | As a modifier, clears the specified filters; as a table expression, does not itself change context | Clears the specified filters |
| Readability / intent | Ambiguous: could be clearing or returning a table | Clear: only clearing |
| Typical use | Denominators, iterating all values, ranking sets, calculated tables | Denominators and "grand total" logic inside CALCULATE |
| Main limitation | Intent is less obvious in modifier use | Cannot be used where a table is required |
Pros, Cons and Limitations
ALL
Pros
- Works both as a CALCULATE modifier and as a table expression.
- Available in older versions of Power BI and SSAS, so it appears in a lot of existing code.
- Required for iterating over "all values", for calculated tables and for ranking sets.
Cons and limitations
- In a CALCULATE argument, a reader cannot tell at a glance whether it only clears filters.
- Accepts only a table or columns of one table, not expressions.
- Easy to over-clear when used with a table or with no arguments.
REMOVEFILTERS
Pros
- The name states the intent, which makes measures easier to review.
- It cannot be mistaken for a table function, so it signals "modifier only".
- Works in both CALCULATE and CALCULATETABLE.
Cons and limitations
- Cannot be used in iterators, variables or as an argument to table functions.
- Newer, so check version support for older SSAS environments.
- Like ALL, it can over-clear if you pass a whole table or nothing.
On performance: I make no speed claims for either function. Results depend on your model and your query, so measure when it matters.
Which One Should You Use?
Decision guide
- Do you need a table (to iterate, count, store in a VAR or pass to another table function)? Use ALL.
- Do you only need to clear filters inside CALCULATE or CALCULATETABLE? Use REMOVEFILTERS.
- Do you want to clear everything on a table except certain columns? Consider ALLEXCEPT.
- Should the denominator respect slicers and outer filters but ignore the visual's own rows? Consider ALLSELECTED and test it.
- Do you want to add a filter without replacing the existing one on that column? Consider KEEPFILTERS.
- Do you need the values currently visible in the context? That is the job of VALUES, not a clearing function.
Rule of thumb
If you need a table, use ALL. If you only need to clear filters, use REMOVEFILTERS.
20 Examples on the Sample Data Model
Beginner: ALL and REMOVEFILTERS as Filter Modifiers
Example 01: Clearing filters on the Sales table with ALL
Type: measure. New measure: [Sales Ignoring Sales Filters (ALL)].
Sales Ignoring Sales Filters (ALL) =
CALCULATE ( [Total Sales], ALL ( Sales ) )
This clears every filter that sits directly on the Sales table, such as SalesChannel. It does not necessarily give you the model's grand total, because filters on Customer, Date or Product are untouched. Customer and Date filters flow into Sales through relationships, and Product filters Sales Order Details directly. Despite the name "grand total", this measure only ignores filters placed on Sales columns. That is the lesson: the function clears the table you name, not the whole model.
Example 02: The same result with REMOVEFILTERS
Type: measure. New measure: [Sales Ignoring Sales Filters (REMOVEFILTERS)], shown next to Example 01.
Sales Ignoring Sales Filters (REMOVEFILTERS) =
CALCULATE ( [Total Sales], REMOVEFILTERS ( Sales ) )
Put both measures in a table visual and the two columns match. Both clear the same filters, so the choice is about intent. REMOVEFILTERS tells the next developer you are only clearing, with no table needed. The lesson: in a CALCULATE argument, the two are interchangeable in effect.
Example 03: Percent of total across all products
Type: measure. New measure: [Sales % of All Products].
Sales % of All Products =
DIVIDE (
[Total Sales],
CALCULATE ( [Total Sales], ALL ( Product ) )
)
The numerator is the sales for the current product filters, and the denominator is sales with every Product filter removed. DIVIDE protects against a zero or blank denominator. The base measure [% of All Products] does the same job using REMOVEFILTERS, so the two should agree. The lesson: clear the dimension that defines the "whole", which here is Product, not Sales.
Example 04: Clearing a single column
Type: two measures. New measures: [Sales All Categories (ALL)] and [Sales All Categories (REMOVEFILTERS)].
Sales All Categories (ALL) =
CALCULATE ( [Total Sales], ALL ( Product[Category] ) )
Sales All Categories (REMOVEFILTERS) =
CALCULATE ( [Total Sales], REMOVEFILTERS ( Product[Category] ) )
Both clear only the Category filter. If a slicer filters Product[Brand] or Product[Color], those filters remain and still shape the result. This is what makes the column form narrower than the table form. The lesson: clearing a column leaves the other columns of that table filtered.
Example 05: All customers regardless of country
Type: measure. New measure: [Sales All Countries].
Sales All Countries =
CALCULATE ( [Total Sales], REMOVEFILTERS ( Customer[Country] ) )
This clears only the country filter. A filter on Customer[Segment] or Customer[City] still applies, as do Date and Product filters. It is useful for comparing one country against the total within the same segment. The lesson: pick the column that defines the comparison, not the whole table.
Intermediate: ALL as a Table Function
Example 06: How many categories exist?
Type: measure. New measure: [Category Count All].
Category Count All =
COUNTROWS ( ALL ( Product[Category] ) )
ALL returns the distinct categories regardless of any filter, and COUNTROWS counts them. The result does not change when a slicer is moved. If your model has unmatched keys, the blank member may be counted, so test it. The lesson: this needs a table, so REMOVEFILTERS cannot do it.
Example 07: ALL as the table to iterate
Type: measure. New measure: [Sales From Large Countries]. The threshold is illustrative.
Sales From Large Countries =
VAR LargeCountryThreshold = 1000000
RETURN
SUMX (
FILTER (
ALL ( Customer[Country] ),
[Total Sales] > LargeCountryThreshold
),
[Total Sales]
)
The iteration covers every country, because ALL ignores any country filter. For each country, [Total Sales] is evaluated and kept only if it passes the threshold, then the survivors are summed. Other filters, such as Date or Product, still apply. REMOVEFILTERS cannot be used here because SUMX and FILTER need a table. The lesson: iteration needs a table, so you need ALL.
Example 08: A VAR holding ALL in a ranking
Type: measure. New measure: [Country Sales Rank].
Country Sales Rank =
VAR AllCountries = ALL ( Customer[Country] )
RETURN
IF (
HASONEVALUE ( Customer[Country] ),
RANKX ( AllCountries, [Total Sales] )
)
The variable stores every country, ignoring the current country filter. RANKX ranks the current country against all of them by [Total Sales]. HASONEVALUE avoids showing a meaningless rank on total rows. A named variable keeps the logic readable. The lesson: a variable can hold a table, so ALL fits and REMOVEFILTERS does not.
Example 09: A calculated table of categories
Type: calculated table. New table: 'All Categories'.
'All Categories' = ALL ( Product[Category] )
This creates a one-column table of distinct categories. It is a persistent table calculated at data refresh, so it does not respond to slicers or report filters. That is useful for a disconnected slicer or a reference list. It also means the table will not update until the next refresh. The lesson: calculated tables are evaluated without report filters, and ALL is the right tool for building one.
Example 10: ADDCOLUMNS around ALL
Type: DAX query (EVALUATE). No new measures or tables.
EVALUATE
ADDCOLUMNS (
ALL ( Product[Category] ),
"Total Sales", [Total Sales]
)
ORDER BY Product[Category]
The query lists every category and adds a column with its sales. ADDCOLUMNS creates a row context for each category, and the measure turns it into a filter automatically. Categories with no sales still appear, because ALL does not filter by the fact table. This is a quick way to check your data by category. The lesson: ALL gives a complete list that does not depend on what has sales.
Intermediate: Parent/Child Share and Partial Clearing
Example 11: Share of category
Type: measure. New measure: [Sales % of Category].
Sales % of Category =
VAR CategorySales =
CALCULATE (
[Total Sales],
REMOVEFILTERS ( Product[Subcategory], Product[ProductName] )
)
RETURN
DIVIDE ( [Total Sales], CategorySales )
The variable clears Subcategory and ProductName but keeps the Category filter. In a matrix with Category, Subcategory and ProductName, each row is divided by its category's sales. Other Product columns, such as Brand or Color, stay filtered if they are in the context. List every lower-level column your report uses. The lesson: partial clearing is column-by-column, and you must name what you want cleared.
Example 12: The same share with ALLEXCEPT
Type: measure, for contrast. New measure: [Sales % of Category (ALLEXCEPT)].
Sales % of Category (ALLEXCEPT) =
VAR CategorySales =
CALCULATE (
[Total Sales],
ALLEXCEPT ( Product, Product[Category] )
)
RETURN
DIVIDE ( [Total Sales], CategorySales )
ALLEXCEPT clears every filter on Product except the one on Category. That includes Brand, Color and any other Product column, not just the hierarchy levels. If the report has a Brand slicer, this denominator ignores it, while Example 11 would keep it. Neither is wrong, but they answer different questions. The lesson: ALLEXCEPT is broader than listing the levels you want to clear.
Example 13: Percent of grand total with REMOVEFILTERS ()
Type: measure. New measure: [Sales % of Grand Total].
Sales % of Grand Total =
DIVIDE (
[Total Sales],
CALCULATE ( [Total Sales], REMOVEFILTERS () )
)
With no arguments, REMOVEFILTERS clears every filter in the model, including Date, Customer and Product slicers. The denominator is then the sales of the entire model, regardless of what the user selected. That may be exactly what you want for a "share of company" metric. It is also the easiest way to surprise report users who expect slicers to apply. The lesson: the no-argument form clears much more than most measures need.
Example 14: Contrast with ALLSELECTED
Type: measure, as a contrast example. New measure: [Sales % of Selected Products].
Sales % of Selected Products =
DIVIDE (
[Total Sales],
CALCULATE ( [Total Sales], ALLSELECTED ( Product ) )
)
ALLSELECTED removes the filters coming from the visual's own rows and columns, but keeps filters from outside it, such as a slicer on Category. If the user selects two categories in a slicer, the denominator is the sales of those two categories, so the percentages add up to 100% within the selection. ALL or REMOVEFILTERS would use all products. ALLSELECTED has subtle behavior in complex visuals, so test it in your report. The lesson: choose between "percent of everything" and "percent of what the user selected".
Advanced: Pitfalls in Practice
Example 15: Clearing a fact table while a dimension filter remains
Type: DAX query (EVALUATE). No new measures.
EVALUATE
ROW (
"Germany Sales",
CALCULATE ( [Total Sales], Customer[Country] = "Germany" ),
"Germany With Sales Table Cleared",
CALCULATE (
[Total Sales],
Customer[Country] = "Germany",
REMOVEFILTERS ( Sales )
),
"All Sales", [Total Sales]
)
The first two columns return the same value. The country filter lives on Customer, and clearing Sales does not touch it. The filter flows from Customer to Sales and then to Sales Order Details, so German sales remain. This holds because of the model's one-to-many, single-direction relationships. The lesson: clearing the fact table is not the same as clearing the dimension that holds the filter.
Example 16: Clearing the dimension instead
Type: DAX query (EVALUATE). No new measures.
EVALUATE
CALCULATETABLE (
ROW (
"Germany Sales", [Total Sales],
"All Customers Sales",
CALCULATE ( [Total Sales], REMOVEFILTERS ( Customer ) )
),
Customer[Country] = "Germany"
)
The outer CALCULATETABLE applies the country filter, so the first column shows German sales. The second column clears the Customer table, so the filter is gone and the result is sales for all customers. This is the corrected version of Example 15. If a cleared filter seems to keep applying, look at which table actually holds it. The lesson: clear the table the filter sits on.
Example 17: Clearing a column and then filtering in the same CALCULATE
Type: measure. New measure: [Sales Bikes Only]. "Bikes" is a sample value.
Sales Bikes Only =
CALCULATE (
[Total Sales],
REMOVEFILTERS ( Product[Category] ),
Product[Category] = "Bikes"
)
The intended result is sales for the Bikes category whatever category the row or slicer says. The documented behavior is that clearing happens before the new filter is applied, but check the current CALCULATE documentation and test in the DAX query view. For this exact case the clearing is arguably redundant, because a filter on a column replaces the existing filter on that column. It becomes useful when you clear a wider scope, such as REMOVEFILTERS ( Product ), and then set one column. The lesson: be explicit, and test evaluation order.
Example 18: KEEPFILTERS as the opposite behavior
Type: measure. New measure: [Sales Bikes Within Selection]. I combine it with a filter argument rather than a clearing modifier, since pairing it with REMOVEFILTERS would defeat its purpose.
Sales Bikes Within Selection =
CALCULATE (
[Total Sales],
KEEPFILTERS ( Product[Category] = "Bikes" )
)
Without KEEPFILTERS, the Bikes filter would replace whatever the slicer selected. With it, the filter intersects with the existing selection. If the slicer has Clothing selected, the result is blank, because Clothing and Bikes do not overlap. If Bikes and Clothing are both selected, you get Bikes. The lesson: modifiers decide whether a filter replaces or respects the existing selection.
Example 19: Counting Sales rows with ALL and with REMOVEFILTERS
Type: two measures. New measures: [Sales Row Count (ALL)] and [Sales Row Count (REMOVEFILTERS)].
Sales Row Count (ALL) =
COUNTROWS ( ALL ( Sales ) )
Sales Row Count (REMOVEFILTERS) =
CALCULATE ( COUNTROWS ( Sales ), REMOVEFILTERS ( Sales ) )
The first uses ALL as a table expression and returns the total number of rows in Sales. The second clears filters on Sales before counting. With no Customer or Date filter they match. When a Customer or Date filter is active, the second can be smaller, because those filters still reach Sales through relationships, while the first ignores context entirely. Verify this in your own model. The lesson: "ALL as a table" and "REMOVEFILTERS as a modifier" are not always the same, so test both.
Example 20: A reconciliation query for a denominator
Type: DAX query (EVALUATE). No new measures.
EVALUATE
SUMMARIZECOLUMNS (
Product[Category],
"Category Sales", [Total Sales],
"All Products Sales", [Sales All Products],
"All Filters Removed Sales",
CALCULATE ( [Total Sales], REMOVEFILTERS () ),
"Percent of All Products", [% of All Products]
)
ORDER BY Product[Category]
Each row shows the category total, the product-cleared denominator, the all-filters-removed total and the percentage. The denominator columns should be identical on every row, and the percentages should add up to 100%. Compare the denominator to a simple [Total Sales] with no filters. If they differ, some other filter, such as RLS or a hidden page filter, is shaping the numbers. The lesson: always reconcile a denominator before trusting it.
Common Pitfalls
- Clearing too much.
ALL ( Table )andREMOVEFILTERS ()wipe filters the report author may have wanted to keep. Detect it: add a slicer and see whether the denominator ignores it. - Clearing the wrong table. Clearing a fact table leaves dimension filters in place (Examples 15 and 16). Detect it: compare the result against the unfiltered total in a DAX query.
- Using REMOVEFILTERS where a table is needed. In iterators, variables and table-function arguments, it is invalid. Detect it: the measure fails to validate; switch to ALL.
- Assuming ALL ( Table ) and ALL ( Table[Column] ) behave the same. The table form clears every column, while the column form leaves other columns filtered. Detect it: add a slicer on another column of that table and compare.
- Confusing ALL with ALLSELECTED. "Percent of total" ignores slicers with ALL, which may not be what users expect. Detect it: change a slicer and see whether the denominator moves.
- Trusting a denominator without reconciling it. Detect it: run a query like Example 20 and compare to a simple [Total Sales].
Behavior around the blank row, RLS and evaluation order can depend on your version, SSAS compatibility level and model. When in doubt, test and check the current documentation.
Best Practices
- Use REMOVEFILTERS to clear and ALL to return a table. The name then tells the reader what the code does.
- Clear the narrowest scope. A column rather than a table, and a table rather than the whole model, avoids removing filters you wanted.
- Build denominators as named variables. A name like CategorySales explains the logic better than a nested CALCULATE.
- Reuse base measures. One definition of [Total Sales] means a fix applies everywhere.
- Use DIVIDE for ratios. It handles zero and blank denominators without errors.
- Test in the DAX query view. Compare with a simple total before you build visuals on top.
- Name measures consistently. Follow patterns such as [Sales % of Category] so the model is searchable.
- Check relationships and filter direction. When a "cleared" filter still applies, the cause is usually which table holds it.
- Comment non-obvious clearing logic. A one-line comment saves the next person from guessing.
- Format DAX consistently. Consistent layout makes the filter logic easy to review.
Quick Reference
| Situation | Recommended approach |
|---|---|
| Percent of all products | REMOVEFILTERS ( Product ) inside CALCULATE |
| Iterate over all values of a column | ALL ( Table[Column] ) as the table argument |
| Count distinct values ignoring filters | COUNTROWS ( ALL ( Table[Column] ) ) |
| Share of parent, keeping a higher level | REMOVEFILTERS on lower-level columns, or ALLEXCEPT |
| Percent of what the user selected | ALLSELECTED, tested in your visual |
| Add a filter without replacing the existing one | KEEPFILTERS |
| Filter still applies after clearing | Clear the table that holds the filter |
| Validate a denominator | Reconciliation query with SUMMARIZECOLUMNS |
FAQ
Is REMOVEFILTERS a replacement for ALL?
Only partly. As a CALCULATE modifier, the two clear filters the same way, and REMOVEFILTERS states the intent more clearly. But REMOVEFILTERS cannot return a table, so it cannot replace ALL in iterators, variables or calculated tables.
Is ALL deprecated?
NO. ALL is a standard DAX function with uses that REMOVEFILTERS cannot cover. Check the current Microsoft documentation for your product version.
Can I use REMOVEFILTERS outside CALCULATE?
It is documented as a filter modifier for CALCULATE and CALCULATETABLE, not as a general table function. Treat it as invalid anywhere a table is expected, and check the current documentation if you are unsure about a specific context.
Is REMOVEFILTERS faster than ALL?
Performance depends on the model and the query, so if it matters, measure both versions on your own data.
Conclusion: Key Takeaways
- ALL returns a table. REMOVEFILTERS only clears filters.
- Inside CALCULATE, both clear filters in the same way, and REMOVEFILTERS reads more clearly.
- Only ALL works in iterators, variables and calculated tables.
- Clearing a fact table does not clear filters held by a related dimension.
- Clear the narrowest scope, and reconcile every denominator against a simple total.
- Rule of thumb: need a table, use ALL; only clearing, use REMOVEFILTERS.
Want more DAX and data modeling guides like this one? Visit exceltobi.com for practical tutorials on Power BI, DAX, data modeling and SSAS Tabular.
Related reading: my earlier articles on CALCULATE, calculated tables and columns, and explicit measures.