<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Direct Query optimization with date table in DAX Commands and Tips</title>
    <link>https://community.fabric.microsoft.com/t5/DAX-Commands-and-Tips/Direct-Query-optimization-with-date-table/m-p/2030468#M45526</link>
    <description>&lt;P&gt;Hi everyone,&lt;BR /&gt;&lt;BR /&gt;I have a simplified model with a calender table [BLAllgemein Datum] and a Fact Table [BL_Vertrag FAKT ...] looking like this.&lt;BR /&gt;&lt;BR /&gt;The fact table has&lt;BR /&gt;- 1 summable column "AnzahlLaufenderVertrag" and&amp;nbsp;&lt;BR /&gt;- 2 date columns [StatistischGueltigAbDatum] and [StatistischGueltigBisDatum] which indicate, in which date range the particular row is valid.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;The calender table includes the dates and some transformations on them, nothing special.&lt;/P&gt;&lt;P&gt;&lt;img /&gt;&lt;/P&gt;&lt;P&gt;All I want to do is to calculate and display this measure __AnzVerträgeBestand, which will calculate the sum of&amp;nbsp; [AnzahlLaufenderVertrag] for each date in the calender table, under the condition that the date range in the fact table includes this date.&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;&lt;PRE&gt;&lt;SPAN&gt;__AnzVerträgeBestand&amp;nbsp;=&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN class="Keyword"&gt;VAR&lt;/SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class="Variable"&gt;_Date&lt;/SPAN&gt;&lt;SPAN&gt;&amp;nbsp;=&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN class="indent4"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class="Keyword"&gt;MAX&lt;/SPAN&gt;&lt;SPAN class="Parenthesis"&gt;&amp;nbsp;(&lt;/SPAN&gt;&lt;SPAN&gt;&amp;nbsp;'BLAllgemein&amp;nbsp;Datum'[Datum]&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class="Parenthesis"&gt;)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN class="Keyword"&gt;VAR&lt;/SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class="Variable"&gt;_result&lt;/SPAN&gt;&lt;SPAN&gt;&amp;nbsp;=&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN class="indent4"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class="Keyword"&gt;CALCULATE&lt;/SPAN&gt;&lt;SPAN class="Parenthesis"&gt;&amp;nbsp;(&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN class="indent8"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class="Keyword"&gt;SUM&lt;/SPAN&gt;&lt;SPAN class="Parenthesis"&gt;&amp;nbsp;(&lt;/SPAN&gt;&lt;SPAN&gt;&amp;nbsp;'BL_VERTRAG&amp;nbsp;FAKT_BESTAND&amp;nbsp;Table'[AnzahlLaufenderVertrag]&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class="Parenthesis"&gt;)&lt;/SPAN&gt;&lt;SPAN&gt;,&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN class="indent8"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN&gt;'BL_VERTRAG&amp;nbsp;FAKT_BESTAND&amp;nbsp;Table'[StatistischGueltigabDatum]&amp;nbsp;&amp;lt;=&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class="Variable"&gt;_Date&lt;/SPAN&gt;&lt;SPAN&gt;,&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN class="indent8"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN&gt;'BL_VERTRAG&amp;nbsp;FAKT_BESTAND&amp;nbsp;Table'[StatistischGueltigbisDatum]&amp;nbsp;&amp;gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class="Variable"&gt;_Date&lt;/SPAN&gt;&lt;SPAN&gt;,&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN class="indent8"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class="Keyword"&gt;REMOVEFILTERS&lt;/SPAN&gt;&lt;SPAN class="Parenthesis"&gt;&amp;nbsp;(&lt;/SPAN&gt;&lt;SPAN&gt;&amp;nbsp;'BLAllgemein&amp;nbsp;Datum'&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class="Parenthesis"&gt;)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN class="indent4"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class="Parenthesis"&gt;)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN class="Keyword"&gt;RETURN&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN class="indent4"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class="Variable"&gt;_result&lt;/SPAN&gt;&lt;/PRE&gt;&lt;P&gt;Both tables are located in an MS SQL database and I try to query them in direct query mode.&lt;BR /&gt;Unfortunately, the query is very slow taking about 14&amp;nbsp;seconds on my small test fact table with about 100.000 rows. In production, there are about 20 million rows, and the query runs several minutes.&lt;BR /&gt;&lt;BR /&gt;I've done some research and noticed, that Power BI generates an extremely long an inefficient SQL query that looks like this:&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;PRE&gt;// Direct Query&lt;BR /&gt;&lt;BR /&gt;SELECT &lt;BR /&gt;TOP (1000001) [semijoin1].[c1],[basetable0].[c43],SUM(&lt;BR /&gt;CAST([a0] as BIGINT)&lt;BR /&gt;)&lt;BR /&gt;AS [a0]&lt;BR /&gt;FROM &lt;BR /&gt;(&lt;BR /&gt;(&lt;BR /&gt;&lt;BR /&gt;SELECT [t3].[StatistischGueltigabDatum] AS [c43],[t3].[StatistischGueltigbisDatum] AS [c44],[t3].[AnzahlLaufenderVertrag] AS [a0]&lt;BR /&gt;FROM &lt;BR /&gt;(&lt;BR /&gt;(&lt;BR /&gt;select [AnzahlLaufenderVertrag],&lt;BR /&gt;[StatistischGueltigabDatum],&lt;BR /&gt;[StatistischGueltigbisDatum]&lt;BR /&gt;from [BL_VERTRAG].[FAKT_BESTAND] as [$Table]&lt;BR /&gt;)&lt;BR /&gt;)&lt;BR /&gt;AS [t3]&lt;BR /&gt;WHERE &lt;BR /&gt;(&lt;BR /&gt;([t3].[StatistischGueltigabDatum] IN (CAST( '20150205 00:00:00' AS datetime),CAST( '20140428 00:00:00' AS datetime),CAST( '20131111 00:00:00' AS datetime),CAST( '20140331 00:00:00' AS datetime),CAST( '20201001 00:00:00' AS datetime),CAST( '20080728 00:00:00' AS datetime),CAST( '20060401 00:00:00' AS datetime),CAST( '20191004 00:00:00' AS datetime),CAST( '20190601 00:00:00' AS datetime),CAST( '20150325 00:00:00' AS datetime),CAST( '20181116 00:00:00' AS datetime),CAST( '20160803 00:00:00' AS datetime)&lt;BR /&gt;,CAST( '20110908 00:00:00' AS datetime),CAST( '20100804 00:00:00' AS datetime),CAST( '20190410 00:00:00' AS datetime),CAST( '20210119 00:00:00' AS datetime),CAST( '20161027 00:00:00' AS datetime),CAST( '20180612 00:00:00' AS datetime),CAST( '20120201 00:00:00' AS datetime),CAST( '20120711 00:00:00' AS datetime),CAST( '20150616 00:00:00' AS datetime),CAST( '20140901 00:00:00' AS datetime),CAST( '20120301 00:00:00' AS datetime),CAST( '20150323 00:00:00' AS datetime),CAST( '20150820 00:00:00' AS datetime)&lt;BR /&gt;,CAST( '20090306 00:00:00' AS datetime),CAST( '20141223 00:00:00' AS datetime),CAST( '20141212 00:00:00' AS datetime),CAST( '20200328 00:00:00' AS datetime),CAST( '20090610 00:00:00' AS datetime),CAST( '20130820 00:00:00' AS datetime),CAST( '20200701 00:00:00' AS datetime),CAST( '20150411 00:00:00' AS datetime),CAST( '20110214 00:00:00' AS datetime),CAST( '20080703 00:00:00' AS datetime),CAST( '20210304 00:00:00' AS datetime),CAST( '20140602 00:00:00' AS datetime),CAST( '20191021 00:00:00' AS datetime)&lt;BR /&gt;,CAST( '20101001 00:00:00' AS datetime),CAST( '20190904 00:00:00' AS datetime),CAST( '20110610 00:00:00' AS datetime),CAST( '20120404 00:00:00' AS datetime),CAST( '20170418 00:00:00' AS datetime),CAST( '20060207 00:00:00' AS datetime),CAST( '20150422 00:00:00' AS datetime),CAST( '20191119 00:00:00' AS datetime),CAST( '20160905 00:00:00' AS datetime),CAST( '20190710 00:00:00' AS datetime),CAST( '20150930 00:00:00' AS datetime),CAST( '20210301 00:00:00' AS datetime),CAST( '20181203 00:00:00' AS datetime)&lt;BR /&gt;,CAST( '20190502 00:00:00' AS datetime),CAST( '20190312 00:00:00' AS datetime),CAST( '20100308 00:00:00' AS datetime),CAST( '20181115 00:00:00' AS datetime),CAST( '20080620 00:00:00' AS datetime),CAST( '20171012 00:00:00' AS datetime),CAST( '20170602 00:00:00' AS datetime),CAST( '20170111 00:00:00' AS datetime),CAST( '20170621 00:00:00' AS datetime),CAST( '20191017 00:00:00' AS datetime),CAST( '20120809 00:00:00' AS datetime),CAST( '20150708 00:00:00' AS datetime),CAST( '20150226 00:00:00' AS datetime)&lt;BR /&gt;,CAST( '20181213 00:00:00' AS datetime),CAST( '20200601 00:00:00' AS datetime),CAST( '20090615 00:00:00' AS datetime),CAST( '20150922 00:00:00' AS datetime),CAST( '20060901 00:00:00' AS datetime),CAST( '20160726 00:00:00' AS datetime),CAST( '20171209 00:00:00' AS datetime),CAST( '20140923 00:00:00' AS datetime),CAST( '20120703 00:00:00' AS datetime),CAST( '20190101 00:00:00' AS datetime),CAST( '20190409 00:00:00' AS datetime),CAST( '20100112 00:00:00' AS datetime),CAST( '20190515 00:00:00' AS datetime)&lt;BR /&gt;,CAST( '20170316 00:00:00' AS datetime),CAST( '20190902 00:00:00' AS datetime),CAST( '20160503 00:00:00' AS datetime),CAST( '20180524 00:00:00' AS datetime),CAST( '20101103 00:00:00' AS datetime),CAST( '20150910 00:00:00' AS datetime),CAST( '20121116 00:00:00' AS datetime),CAST( '20170201 00:00:00' AS datetime),CAST( '20131024 00:00:00' AS datetime),CAST( '20180111 00:00:00' AS datetime),CAST( '20210128 00:00:00' AS datetime),CAST( '20090304 00:00:00' AS datetime),CAST( '20180120 00:00:00' AS datetime)&lt;BR /&gt;,CAST( '20180829 00:00:00' AS datetime),CAST( '20180314 00:00:00' AS datetime),CAST( '20130701 00:00:00' AS datetime),CAST( '20080616 00:00:00' AS datetime),CAST( '20190201 00:00:00' AS datetime),CAST( '20170303 00:00:00' AS datetime),CAST( '20180717 00:00:00' AS datetime),CAST( '20110727 00:00:00' AS datetime),CAST( '20120725 00:00:00' AS datetime),CAST( '20130228 00:00:00' AS datetime),CAST( '20151015 00:00:00' AS datetime),CAST( '20161031 00:00:00' AS datetime),CAST( '20171001 00:00:00' AS datetime)&lt;BR /&gt;,CAST( '20201007 00:00:00' AS datetime),CAST( '20160707 00:00:00' AS datetime),CAST( '20170815 00:00:00' AS datetime),CAST( '20200203 00:00:00' AS datetime)))&lt;BR /&gt;)&lt;BR /&gt;)&lt;BR /&gt;AS [basetable0]&lt;BR /&gt;&lt;BR /&gt;INNER JOIN&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;(&lt;BR /&gt;&lt;BR /&gt;(SELECT 44198 AS [c1],CAST( '20210115 00:00:00' AS datetime) AS [c44] ) UNION ALL &lt;BR /&gt;(SELECT 44199 AS [c1],CAST( '20210115 00:00:00' AS datetime) AS [c44] ) UNION ALL &lt;BR /&gt;(SELECT 44200 AS [c1],CAST( '20210115 00:00:00' AS datetime) AS [c44] ) UNION ALL &lt;BR /&gt;(SELECT 44201 AS [c1],CAST( '20210115 00:00:00' AS datetime) AS [c44] ) UNION ALL &lt;BR /&gt;(SELECT 44202 AS [c1],CAST( '20210115 00:00:00' AS datetime) AS [c44] ) UNION ALL &lt;BR /&gt;(SELECT 44203 AS [c1],CAST( '20210115 00:00:00' AS datetime) AS [c44] ) UNION ALL&lt;BR /&gt;....&lt;BR /&gt;(SELECT 44560 AS [c1],CAST( '20220401 00:00:00' AS datetime) AS [c44] ) UNION ALL &lt;BR /&gt;(SELECT 44561 AS [c1],CAST( '20220401 00:00:00' AS datetime) AS [c44] ) UNION ALL &lt;BR /&gt;(SELECT 44562 AS [c1],CAST( '20220401 00:00:00' AS datetime) AS [c44] ) &lt;BR /&gt;)) AS [semijoin1] on &lt;BR /&gt;(&lt;BR /&gt;&lt;BR /&gt;([semijoin1].[c44] = [basetable0].[c44])&lt;BR /&gt;&lt;BR /&gt;)&lt;BR /&gt;)&lt;BR /&gt;&lt;BR /&gt;GROUP BY [semijoin1].[c1],[basetable0].[c43]&amp;nbsp;&lt;/PRE&gt;&lt;P&gt;This is already very long, but in fact the query has about 7.000 rows with tons of Casts of datetime values.&lt;/P&gt;&lt;P&gt;On the other hand, I have recreated the query in T-SQL myself, coming up with this solution:&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;PRE&gt;&lt;BR /&gt;SELECT &lt;BR /&gt;TOP (1000001) &lt;BR /&gt;[t4].[Datum],&lt;BR /&gt;SUM(CAST([t5].[AnzahlLaufenderVertrag] as BIGINT)) AS [a0]&lt;BR /&gt;FROM &lt;BR /&gt;((&lt;BR /&gt;select &lt;BR /&gt;SUM([AnzahlLaufenderVertrag]) as AnzahlLaufenderVertrag,&lt;BR /&gt;[StatistischGueltigabDatum],&lt;BR /&gt;[StatistischGueltigbisDatum]&lt;BR /&gt;&lt;BR /&gt;&lt;STRONG&gt;from [RADaR_Sandbox].[BL_VERTRAG].[Fakt_Bestand] as [$Table]&lt;/STRONG&gt;&lt;BR /&gt;&lt;STRONG&gt;group by [StatistischGueltigabDatum],&lt;/STRONG&gt;&lt;BR /&gt;&lt;STRONG&gt;[StatistischGueltigbisDatum]&lt;/STRONG&gt;&lt;BR /&gt;) AS [t5]&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;LEFT OUTER JOIN&lt;BR /&gt;&lt;BR /&gt;(&lt;BR /&gt;select [$Table].[Datum] as [Datum],&lt;BR /&gt;[$Table].[JahrMonat] as [JahrMonat]&lt;BR /&gt;&lt;BR /&gt;from [BLAllgemein].[Datum] as [$Table]&lt;BR /&gt;WHERE Jahr = 2021&lt;BR /&gt;) AS [t4] on &lt;BR /&gt;(&lt;BR /&gt;&lt;STRONG&gt;[t5].[StatistischGueltigabDatum] &amp;lt;= [t4].[Datum] and &lt;/STRONG&gt;&lt;BR /&gt;&lt;STRONG&gt;[t5].[StatistischGueltigbisDatum] &amp;gt; [t4].[Datum]&lt;/STRONG&gt;&lt;BR /&gt;)&lt;BR /&gt;)&lt;BR /&gt;&lt;BR /&gt;GROUP BY [t4].[Datum] &lt;BR /&gt;order by [t4].[Datum]&lt;/PRE&gt;&lt;P&gt;The latter query takes only a fraction of a second and produces exactly the same result as the long query generated by Power BI.&lt;/P&gt;&lt;P&gt;Can I do anything (in the dax query, the data model or direclty in the database) so that PowerBI will find a more efficient way to calculate the desired result?&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Any help is appreciated!&lt;/P&gt;</description>
    <pubDate>Sun, 22 Aug 2021 15:36:32 GMT</pubDate>
    <dc:creator>IMett</dc:creator>
    <dc:date>2021-08-22T15:36:32Z</dc:date>
    <item>
      <title>Direct Query optimization with date table</title>
      <link>https://community.fabric.microsoft.com/t5/DAX-Commands-and-Tips/Direct-Query-optimization-with-date-table/m-p/2030468#M45526</link>
      <description>&lt;P&gt;Hi everyone,&lt;BR /&gt;&lt;BR /&gt;I have a simplified model with a calender table [BLAllgemein Datum] and a Fact Table [BL_Vertrag FAKT ...] looking like this.&lt;BR /&gt;&lt;BR /&gt;The fact table has&lt;BR /&gt;- 1 summable column "AnzahlLaufenderVertrag" and&amp;nbsp;&lt;BR /&gt;- 2 date columns [StatistischGueltigAbDatum] and [StatistischGueltigBisDatum] which indicate, in which date range the particular row is valid.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;The calender table includes the dates and some transformations on them, nothing special.&lt;/P&gt;&lt;P&gt;&lt;img /&gt;&lt;/P&gt;&lt;P&gt;All I want to do is to calculate and display this measure __AnzVerträgeBestand, which will calculate the sum of&amp;nbsp; [AnzahlLaufenderVertrag] for each date in the calender table, under the condition that the date range in the fact table includes this date.&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;&lt;PRE&gt;&lt;SPAN&gt;__AnzVerträgeBestand&amp;nbsp;=&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN class="Keyword"&gt;VAR&lt;/SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class="Variable"&gt;_Date&lt;/SPAN&gt;&lt;SPAN&gt;&amp;nbsp;=&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN class="indent4"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class="Keyword"&gt;MAX&lt;/SPAN&gt;&lt;SPAN class="Parenthesis"&gt;&amp;nbsp;(&lt;/SPAN&gt;&lt;SPAN&gt;&amp;nbsp;'BLAllgemein&amp;nbsp;Datum'[Datum]&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class="Parenthesis"&gt;)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN class="Keyword"&gt;VAR&lt;/SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class="Variable"&gt;_result&lt;/SPAN&gt;&lt;SPAN&gt;&amp;nbsp;=&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN class="indent4"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class="Keyword"&gt;CALCULATE&lt;/SPAN&gt;&lt;SPAN class="Parenthesis"&gt;&amp;nbsp;(&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN class="indent8"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class="Keyword"&gt;SUM&lt;/SPAN&gt;&lt;SPAN class="Parenthesis"&gt;&amp;nbsp;(&lt;/SPAN&gt;&lt;SPAN&gt;&amp;nbsp;'BL_VERTRAG&amp;nbsp;FAKT_BESTAND&amp;nbsp;Table'[AnzahlLaufenderVertrag]&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class="Parenthesis"&gt;)&lt;/SPAN&gt;&lt;SPAN&gt;,&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN class="indent8"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN&gt;'BL_VERTRAG&amp;nbsp;FAKT_BESTAND&amp;nbsp;Table'[StatistischGueltigabDatum]&amp;nbsp;&amp;lt;=&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class="Variable"&gt;_Date&lt;/SPAN&gt;&lt;SPAN&gt;,&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN class="indent8"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN&gt;'BL_VERTRAG&amp;nbsp;FAKT_BESTAND&amp;nbsp;Table'[StatistischGueltigbisDatum]&amp;nbsp;&amp;gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class="Variable"&gt;_Date&lt;/SPAN&gt;&lt;SPAN&gt;,&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN class="indent8"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class="Keyword"&gt;REMOVEFILTERS&lt;/SPAN&gt;&lt;SPAN class="Parenthesis"&gt;&amp;nbsp;(&lt;/SPAN&gt;&lt;SPAN&gt;&amp;nbsp;'BLAllgemein&amp;nbsp;Datum'&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class="Parenthesis"&gt;)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN class="indent4"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class="Parenthesis"&gt;)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN class="Keyword"&gt;RETURN&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN class="indent4"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class="Variable"&gt;_result&lt;/SPAN&gt;&lt;/PRE&gt;&lt;P&gt;Both tables are located in an MS SQL database and I try to query them in direct query mode.&lt;BR /&gt;Unfortunately, the query is very slow taking about 14&amp;nbsp;seconds on my small test fact table with about 100.000 rows. In production, there are about 20 million rows, and the query runs several minutes.&lt;BR /&gt;&lt;BR /&gt;I've done some research and noticed, that Power BI generates an extremely long an inefficient SQL query that looks like this:&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;PRE&gt;// Direct Query&lt;BR /&gt;&lt;BR /&gt;SELECT &lt;BR /&gt;TOP (1000001) [semijoin1].[c1],[basetable0].[c43],SUM(&lt;BR /&gt;CAST([a0] as BIGINT)&lt;BR /&gt;)&lt;BR /&gt;AS [a0]&lt;BR /&gt;FROM &lt;BR /&gt;(&lt;BR /&gt;(&lt;BR /&gt;&lt;BR /&gt;SELECT [t3].[StatistischGueltigabDatum] AS [c43],[t3].[StatistischGueltigbisDatum] AS [c44],[t3].[AnzahlLaufenderVertrag] AS [a0]&lt;BR /&gt;FROM &lt;BR /&gt;(&lt;BR /&gt;(&lt;BR /&gt;select [AnzahlLaufenderVertrag],&lt;BR /&gt;[StatistischGueltigabDatum],&lt;BR /&gt;[StatistischGueltigbisDatum]&lt;BR /&gt;from [BL_VERTRAG].[FAKT_BESTAND] as [$Table]&lt;BR /&gt;)&lt;BR /&gt;)&lt;BR /&gt;AS [t3]&lt;BR /&gt;WHERE &lt;BR /&gt;(&lt;BR /&gt;([t3].[StatistischGueltigabDatum] IN (CAST( '20150205 00:00:00' AS datetime),CAST( '20140428 00:00:00' AS datetime),CAST( '20131111 00:00:00' AS datetime),CAST( '20140331 00:00:00' AS datetime),CAST( '20201001 00:00:00' AS datetime),CAST( '20080728 00:00:00' AS datetime),CAST( '20060401 00:00:00' AS datetime),CAST( '20191004 00:00:00' AS datetime),CAST( '20190601 00:00:00' AS datetime),CAST( '20150325 00:00:00' AS datetime),CAST( '20181116 00:00:00' AS datetime),CAST( '20160803 00:00:00' AS datetime)&lt;BR /&gt;,CAST( '20110908 00:00:00' AS datetime),CAST( '20100804 00:00:00' AS datetime),CAST( '20190410 00:00:00' AS datetime),CAST( '20210119 00:00:00' AS datetime),CAST( '20161027 00:00:00' AS datetime),CAST( '20180612 00:00:00' AS datetime),CAST( '20120201 00:00:00' AS datetime),CAST( '20120711 00:00:00' AS datetime),CAST( '20150616 00:00:00' AS datetime),CAST( '20140901 00:00:00' AS datetime),CAST( '20120301 00:00:00' AS datetime),CAST( '20150323 00:00:00' AS datetime),CAST( '20150820 00:00:00' AS datetime)&lt;BR /&gt;,CAST( '20090306 00:00:00' AS datetime),CAST( '20141223 00:00:00' AS datetime),CAST( '20141212 00:00:00' AS datetime),CAST( '20200328 00:00:00' AS datetime),CAST( '20090610 00:00:00' AS datetime),CAST( '20130820 00:00:00' AS datetime),CAST( '20200701 00:00:00' AS datetime),CAST( '20150411 00:00:00' AS datetime),CAST( '20110214 00:00:00' AS datetime),CAST( '20080703 00:00:00' AS datetime),CAST( '20210304 00:00:00' AS datetime),CAST( '20140602 00:00:00' AS datetime),CAST( '20191021 00:00:00' AS datetime)&lt;BR /&gt;,CAST( '20101001 00:00:00' AS datetime),CAST( '20190904 00:00:00' AS datetime),CAST( '20110610 00:00:00' AS datetime),CAST( '20120404 00:00:00' AS datetime),CAST( '20170418 00:00:00' AS datetime),CAST( '20060207 00:00:00' AS datetime),CAST( '20150422 00:00:00' AS datetime),CAST( '20191119 00:00:00' AS datetime),CAST( '20160905 00:00:00' AS datetime),CAST( '20190710 00:00:00' AS datetime),CAST( '20150930 00:00:00' AS datetime),CAST( '20210301 00:00:00' AS datetime),CAST( '20181203 00:00:00' AS datetime)&lt;BR /&gt;,CAST( '20190502 00:00:00' AS datetime),CAST( '20190312 00:00:00' AS datetime),CAST( '20100308 00:00:00' AS datetime),CAST( '20181115 00:00:00' AS datetime),CAST( '20080620 00:00:00' AS datetime),CAST( '20171012 00:00:00' AS datetime),CAST( '20170602 00:00:00' AS datetime),CAST( '20170111 00:00:00' AS datetime),CAST( '20170621 00:00:00' AS datetime),CAST( '20191017 00:00:00' AS datetime),CAST( '20120809 00:00:00' AS datetime),CAST( '20150708 00:00:00' AS datetime),CAST( '20150226 00:00:00' AS datetime)&lt;BR /&gt;,CAST( '20181213 00:00:00' AS datetime),CAST( '20200601 00:00:00' AS datetime),CAST( '20090615 00:00:00' AS datetime),CAST( '20150922 00:00:00' AS datetime),CAST( '20060901 00:00:00' AS datetime),CAST( '20160726 00:00:00' AS datetime),CAST( '20171209 00:00:00' AS datetime),CAST( '20140923 00:00:00' AS datetime),CAST( '20120703 00:00:00' AS datetime),CAST( '20190101 00:00:00' AS datetime),CAST( '20190409 00:00:00' AS datetime),CAST( '20100112 00:00:00' AS datetime),CAST( '20190515 00:00:00' AS datetime)&lt;BR /&gt;,CAST( '20170316 00:00:00' AS datetime),CAST( '20190902 00:00:00' AS datetime),CAST( '20160503 00:00:00' AS datetime),CAST( '20180524 00:00:00' AS datetime),CAST( '20101103 00:00:00' AS datetime),CAST( '20150910 00:00:00' AS datetime),CAST( '20121116 00:00:00' AS datetime),CAST( '20170201 00:00:00' AS datetime),CAST( '20131024 00:00:00' AS datetime),CAST( '20180111 00:00:00' AS datetime),CAST( '20210128 00:00:00' AS datetime),CAST( '20090304 00:00:00' AS datetime),CAST( '20180120 00:00:00' AS datetime)&lt;BR /&gt;,CAST( '20180829 00:00:00' AS datetime),CAST( '20180314 00:00:00' AS datetime),CAST( '20130701 00:00:00' AS datetime),CAST( '20080616 00:00:00' AS datetime),CAST( '20190201 00:00:00' AS datetime),CAST( '20170303 00:00:00' AS datetime),CAST( '20180717 00:00:00' AS datetime),CAST( '20110727 00:00:00' AS datetime),CAST( '20120725 00:00:00' AS datetime),CAST( '20130228 00:00:00' AS datetime),CAST( '20151015 00:00:00' AS datetime),CAST( '20161031 00:00:00' AS datetime),CAST( '20171001 00:00:00' AS datetime)&lt;BR /&gt;,CAST( '20201007 00:00:00' AS datetime),CAST( '20160707 00:00:00' AS datetime),CAST( '20170815 00:00:00' AS datetime),CAST( '20200203 00:00:00' AS datetime)))&lt;BR /&gt;)&lt;BR /&gt;)&lt;BR /&gt;AS [basetable0]&lt;BR /&gt;&lt;BR /&gt;INNER JOIN&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;(&lt;BR /&gt;&lt;BR /&gt;(SELECT 44198 AS [c1],CAST( '20210115 00:00:00' AS datetime) AS [c44] ) UNION ALL &lt;BR /&gt;(SELECT 44199 AS [c1],CAST( '20210115 00:00:00' AS datetime) AS [c44] ) UNION ALL &lt;BR /&gt;(SELECT 44200 AS [c1],CAST( '20210115 00:00:00' AS datetime) AS [c44] ) UNION ALL &lt;BR /&gt;(SELECT 44201 AS [c1],CAST( '20210115 00:00:00' AS datetime) AS [c44] ) UNION ALL &lt;BR /&gt;(SELECT 44202 AS [c1],CAST( '20210115 00:00:00' AS datetime) AS [c44] ) UNION ALL &lt;BR /&gt;(SELECT 44203 AS [c1],CAST( '20210115 00:00:00' AS datetime) AS [c44] ) UNION ALL&lt;BR /&gt;....&lt;BR /&gt;(SELECT 44560 AS [c1],CAST( '20220401 00:00:00' AS datetime) AS [c44] ) UNION ALL &lt;BR /&gt;(SELECT 44561 AS [c1],CAST( '20220401 00:00:00' AS datetime) AS [c44] ) UNION ALL &lt;BR /&gt;(SELECT 44562 AS [c1],CAST( '20220401 00:00:00' AS datetime) AS [c44] ) &lt;BR /&gt;)) AS [semijoin1] on &lt;BR /&gt;(&lt;BR /&gt;&lt;BR /&gt;([semijoin1].[c44] = [basetable0].[c44])&lt;BR /&gt;&lt;BR /&gt;)&lt;BR /&gt;)&lt;BR /&gt;&lt;BR /&gt;GROUP BY [semijoin1].[c1],[basetable0].[c43]&amp;nbsp;&lt;/PRE&gt;&lt;P&gt;This is already very long, but in fact the query has about 7.000 rows with tons of Casts of datetime values.&lt;/P&gt;&lt;P&gt;On the other hand, I have recreated the query in T-SQL myself, coming up with this solution:&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;PRE&gt;&lt;BR /&gt;SELECT &lt;BR /&gt;TOP (1000001) &lt;BR /&gt;[t4].[Datum],&lt;BR /&gt;SUM(CAST([t5].[AnzahlLaufenderVertrag] as BIGINT)) AS [a0]&lt;BR /&gt;FROM &lt;BR /&gt;((&lt;BR /&gt;select &lt;BR /&gt;SUM([AnzahlLaufenderVertrag]) as AnzahlLaufenderVertrag,&lt;BR /&gt;[StatistischGueltigabDatum],&lt;BR /&gt;[StatistischGueltigbisDatum]&lt;BR /&gt;&lt;BR /&gt;&lt;STRONG&gt;from [RADaR_Sandbox].[BL_VERTRAG].[Fakt_Bestand] as [$Table]&lt;/STRONG&gt;&lt;BR /&gt;&lt;STRONG&gt;group by [StatistischGueltigabDatum],&lt;/STRONG&gt;&lt;BR /&gt;&lt;STRONG&gt;[StatistischGueltigbisDatum]&lt;/STRONG&gt;&lt;BR /&gt;) AS [t5]&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;LEFT OUTER JOIN&lt;BR /&gt;&lt;BR /&gt;(&lt;BR /&gt;select [$Table].[Datum] as [Datum],&lt;BR /&gt;[$Table].[JahrMonat] as [JahrMonat]&lt;BR /&gt;&lt;BR /&gt;from [BLAllgemein].[Datum] as [$Table]&lt;BR /&gt;WHERE Jahr = 2021&lt;BR /&gt;) AS [t4] on &lt;BR /&gt;(&lt;BR /&gt;&lt;STRONG&gt;[t5].[StatistischGueltigabDatum] &amp;lt;= [t4].[Datum] and &lt;/STRONG&gt;&lt;BR /&gt;&lt;STRONG&gt;[t5].[StatistischGueltigbisDatum] &amp;gt; [t4].[Datum]&lt;/STRONG&gt;&lt;BR /&gt;)&lt;BR /&gt;)&lt;BR /&gt;&lt;BR /&gt;GROUP BY [t4].[Datum] &lt;BR /&gt;order by [t4].[Datum]&lt;/PRE&gt;&lt;P&gt;The latter query takes only a fraction of a second and produces exactly the same result as the long query generated by Power BI.&lt;/P&gt;&lt;P&gt;Can I do anything (in the dax query, the data model or direclty in the database) so that PowerBI will find a more efficient way to calculate the desired result?&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Any help is appreciated!&lt;/P&gt;</description>
      <pubDate>Sun, 22 Aug 2021 15:36:32 GMT</pubDate>
      <guid>https://community.fabric.microsoft.com/t5/DAX-Commands-and-Tips/Direct-Query-optimization-with-date-table/m-p/2030468#M45526</guid>
      <dc:creator>IMett</dc:creator>
      <dc:date>2021-08-22T15:36:32Z</dc:date>
    </item>
    <item>
      <title>Re: Direct Query optimization with date table</title>
      <link>https://community.fabric.microsoft.com/t5/DAX-Commands-and-Tips/Direct-Query-optimization-with-date-table/m-p/2031140#M45546</link>
      <description>&lt;P&gt;&lt;a href="javascript:void(0)" data-lia-user-mentions="" data-lia-user-uid="96424" data-lia-user-login="IMett" class="lia-mention lia-mention-user"&gt;IMett&lt;/a&gt; , If you need between for StatistischGueltigbisDatum , then create an inactive relationship&amp;nbsp; and use userelationship &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;__AnzVerträgeBestand =&lt;BR /&gt;VAR _Date =&lt;BR /&gt;MAX ( 'BLAllgemein Datum'[Datum] )&lt;BR /&gt;VAR _result =&lt;BR /&gt;CALCULATE (&lt;BR /&gt;SUM ( 'BL_VERTRAG FAKT_BESTAND Table'[AnzahlLaufenderVertrag] ),&lt;BR /&gt;'BL_VERTRAG FAKT_BESTAND Table'[StatistischGueltigabDatum] &amp;lt;= _Date,&lt;BR /&gt;'BL_VERTRAG FAKT_BESTAND Table'[StatistischGueltigbisDatum] &amp;gt; _Date,&lt;BR /&gt;userelationship ( 'BLAllgemein Datum'[Datum] , 'BL_VERTRAG FAKT_BESTAND Table'[StatistischGueltigBisDatum] )&lt;BR /&gt;)&lt;BR /&gt;RETURN&lt;BR /&gt;_result&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;or try Cross filter&lt;/P&gt;
&lt;P&gt;__AnzVerträgeBestand =&lt;BR /&gt;VAR _Date =&lt;BR /&gt;MAX ( 'BLAllgemein Datum'[Datum] )&lt;BR /&gt;VAR _result =&lt;BR /&gt;CALCULATE (&lt;BR /&gt;SUM ( 'BL_VERTRAG FAKT_BESTAND Table'[AnzahlLaufenderVertrag] ),&lt;BR /&gt;'BL_VERTRAG FAKT_BESTAND Table'[StatistischGueltigabDatum] &amp;lt;= _Date,&lt;BR /&gt;'BL_VERTRAG FAKT_BESTAND Table'[StatistischGueltigbisDatum] &amp;gt; _Date,&lt;BR /&gt;crossfilter ( 'BLAllgemein Datum'[Datum] , 'BL_VERTRAG FAKT_BESTAND Table'[StatistischGueltigAbDatum], none )&lt;BR /&gt;)&lt;BR /&gt;RETURN&lt;BR /&gt;_result&lt;/P&gt;</description>
      <pubDate>Mon, 23 Aug 2021 05:22:43 GMT</pubDate>
      <guid>https://community.fabric.microsoft.com/t5/DAX-Commands-and-Tips/Direct-Query-optimization-with-date-table/m-p/2031140#M45546</guid>
      <dc:creator>amitchandak</dc:creator>
      <dc:date>2021-08-23T05:22:43Z</dc:date>
    </item>
    <item>
      <title>Re: Direct Query optimization with date table</title>
      <link>https://community.fabric.microsoft.com/t5/DAX-Commands-and-Tips/Direct-Query-optimization-with-date-table/m-p/2031631#M45553</link>
      <description>&lt;P&gt;Hi&amp;nbsp;&lt;a href="javascript:void(0)" data-lia-user-mentions="" data-lia-user-uid="148838" data-lia-user-login="amitchandak" class="lia-mention lia-mention-user"&gt;amitchandak&lt;/a&gt;&amp;nbsp;, thank you for your suggestion.&lt;BR /&gt;Unfortunately this wasn't a solution yet.&lt;BR /&gt;All of the queries still translate to the same long T-SQL query. While the userelationship version is somewhat faster than the other 2, it does not output the same results, in fact the result table is empty.&lt;BR /&gt;The problem is probably, that the relationship filters [Datum] = [StatistischGueltigBisDatum] for every [Datum] in 2021. However, most of the StatistischGueltigBisDatum values are far after 2021, so that no matches are found.&lt;BR /&gt;&lt;BR /&gt;What I actually need is the condition FactTable[StatistischGueltigAbDatum] &amp;lt;= Calender[Date] &amp;lt; [FactTable[StatistischGueltigBisDatum]&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;&lt;img /&gt;&lt;/P&gt;&lt;P&gt;&lt;img /&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Mon, 23 Aug 2021 08:37:26 GMT</pubDate>
      <guid>https://community.fabric.microsoft.com/t5/DAX-Commands-and-Tips/Direct-Query-optimization-with-date-table/m-p/2031631#M45553</guid>
      <dc:creator>IMett</dc:creator>
      <dc:date>2021-08-23T08:37:26Z</dc:date>
    </item>
  </channel>
</rss>

