Skip to main content
cancel
Showing results for 
Search instead for 
Did you mean: 

Register now to learn Fabric in free live sessions led by the best Microsoft experts. From Apr 16 to May 9, in English and Spanish.

Reply
KJanssens
Helper II
Helper II

Odata fetches more records than needed

I have a Odata feed (from Dynamics 365 Finance and Operations) through which I want to fetch the last X orders.

 

When I fetch the last 9999 orders, it gets fetched quite fast. However, when I want to fetch more than 10k orders, I see (by using Fiddler) that it tries to get ALL orders (in multiple batches of 10k) before it filters out (locally) only the top X orders... This means it wants to fetch millions of records...

 

Is this normal behaviour?

 

Thanks,

Koen

2 REPLIES 2
v-lid-msft
Community Support
Community Support

Hi @KJanssens ,

 

What is the kind of way you use to get last N orders , add url parameter in odata feed or use Table.SelectRows() ? Have you used filter step at the next step of Source step?

 

Please don't have any Confidential Information or Real data in your reply.


Best regards,

 

Community Support Team _ Dong Li
If this post helps, then please consider Accept it as the solution to help the other members find it more quickly.

@v-lid-msft  I made some tests:

Unfiltered

 

let
    Source = OData.Feed("https://xxx.sandbox.operations.dynamics.com/data", null, [Implementation="2.0"]),
    SalesOrderHeaders_table = Source{[Name="SalesOrderHeaders",Signature="table"]}[Data]
in
    SalesOrderHeaders_table

 

   Result:  

  • In Power Query Editor, preview is generated with request "GET /data/SalesOrderHeaders?$top=1000"
  • In Power BI Desktop, the data gets loaded with multiple consequent requests (as expected):
    • GET /data/SalesOrderHeaders
    • GET /data/SalesOrderHeaders?$skip=10000&$top=10000
    • GET /data/SalesOrderHeaders?$skip=20000&$top=10000
    • ... and so on until all records are fetched (which takes ages)

Filtered in feed request (top 9999)

 

let
    Source = OData.Feed("https://xxx.sandbox.operations.dynamics.com/data/SalesOrderHeaders?top=9999", null, [Implementation="2.0"])
in
    Source

 

Result:

  • Preview generated with request: "GET /data/SalesOrderHeaders?top=9999 "
  • Full data load generates following (too many) requests:
    • GET /data/SalesOrderHeaders?top=9999
    • GET /data/SalesOrderHeaders?top=9999&$skip=10000&$top=10000
    • GET /data/SalesOrderHeaders?top=9999&$skip=20000&$top=10000
    • and so on...

Filtered in feed request (top 9999) combined with FirstN(9998)

 

let
    Source = OData.Feed("https://xxx.sandbox.operations.dynamics.com/data/SalesOrderHeaders?top=9999", null, [Implementation="2.0"]),
    #"Kept First Rows" = Table.FirstN(Source,9998)
in
    #"Kept First Rows"

 

Result:

  • Preview generated with request: "GET /data/SalesOrderHeaders?top=9999 "
  • Full data load generates only one request (as expected):
    • GET /data/SalesOrderHeaders?top=9999

Filtered in feed request (top 12345) combined with FirstN(10001)

 

let
    Source = OData.Feed("https://xxx.sandbox.operations.dynamics.com/data/SalesOrderHeaders?top=12345", null, [Implementation="2.0"]),
    #"Kept First Rows" = Table.FirstN(Source,10001)
in
    #"Kept First Rows"

 

Result:

  • Preview generated with request: "GET /data/SalesOrderHeaders?top=12345"
  • Full data load generates following requests (as expected):
    • GET /data/SalesOrderHeaders?top=12345
    • GET /data/SalesOrderHeaders?top=12345&$skip=10000&$top=10000
    • This last request is quite weird though, however it returns the correct amount of records

Filtered with FirstN(9999)

 

let
    Source = OData.Feed("https://xxx.sandbox.operations.dynamics.com/data", null, [Implementation="2.0"]),
    SalesOrderHeaders_table = Source{[Name="SalesOrderHeaders",Signature="table"]}[Data],
    KeptFirstRows = Table.FirstN(SalesOrderHeaders_table,9999)
in
    KeptFirstRows

 

Result:

  • Preview generated with request: "GET /data/SalesOrderHeaders?top=1000"
  • Full data load generates following request (as expected):
    • GET /data/SalesOrderHeaders?top=9999

Filtered with FirstN(10001)

 

let
    Source = OData.Feed("https://xxx.sandbox.operations.dynamics.com/data", null, [Implementation="2.0"]),
    SalesOrderHeaders_table = Source{[Name="SalesOrderHeaders",Signature="table"]}[Data],
    KeptFirstRows = Table.FirstN(SalesOrderHeaders_table,10001)
in
    KeptFirstRows

 

Result:

  • Preview generated with request: "GET /data/SalesOrderHeaders?top=1000"
  • Full data load generates following request (too many):
    • GET /data/SalesOrderHeaders?top=10001
    • GET /data/SalesOrderHeaders?$skip=10000&$top=10000
    • GET /data/SalesOrderHeaders?$skip=20000&$top=10000
    • ... and so on ...

Note that for all of the above scenarios, the first request of a series of requests is always done twice, and it also (almost always) generates requests "GET /data/$metadata"   and "GET /data" which is unnecessary IMHO...

Helpful resources

Announcements
Microsoft Fabric Learn Together

Microsoft Fabric Learn Together

Covering the world! 9:00-10:30 AM Sydney, 4:00-5:30 PM CET (Paris/Berlin), 7:00-8:30 PM Mexico City

PBI_APRIL_CAROUSEL1

Power BI Monthly Update - April 2024

Check out the April 2024 Power BI update to learn about new features.

April Fabric Community Update

Fabric Community Update - April 2024

Find out what's new and trending in the Fabric Community.

Top Solution Authors
Top Kudoed Authors