低效的Azure移动应用程序查询消耗了大量Azure SQL DTU

时间:2017-03-02 12:55:36

标签: azure-mobile-services

我有一个使用Azure Mobile Apps .NET后端和Windows客户端的应用程序。在后端和客户端之间同步的一个表有30,000行。同步此表时,DTU达到我的100 DTU(S3)层的60%左右,这非常糟糕。监控图如下所示:

enter image description here

此表的表控制器非常基本:

public async Task<IQueryable<MyBigTable>> GetMyBigTable()
{
   return Query();
}

以下是Azure移动应用程序生成的SQL:

exec sp_executesql N'SELECT TOP (51) 
[Project2].[Field1] AS [Field1], 
[Project2].[C1] AS [C1], 
[Project2].[C2] AS [C2], 
[Project2].[Deleted] AS [Deleted], 
[Project2].[C3] AS [C3],
...
FROM ( SELECT 
    [Project1].[Id] AS [Id], 
    ...
    FROM ( SELECT 
        [Extent1].[Id] AS [Id],
        ...
        FROM [dbo].[MyBigTable] AS [Extent1]
        WHERE ([Extent1].[UpdatedAt] >= @p__linq__0)
    )  AS [Project1]
    ORDER BY [Project1].[UpdatedAt] ASC, [Project1].[Id] ASC
    OFFSET @p__linq__1 ROWS FETCH NEXT @p__linq__2 ROWS ONLY 
)  AS [Project2]
ORDER BY [Project2].[UpdatedAt] ASC, [Project2].[Id] ASC',N'@p__linq__0 datetimeoffset(7),@p__linq__1 int,@p__linq__2 int',@p__linq__0='2017-02-28 03:48:49.4840000 +00:00',@p__linq__1=0,@p__linq__2=50

......不是很漂亮,而且它的最终目的太复杂了,但这是另一回事。我认为,解释图形形状的问题是,内部SQL别名为[Project1] 始终将所有行从[UpdatedAt]返回到表的末尾。 这个内部SQL将是放置TOP 51子句的理想位置,但它可以在外部SQL中找到

因此,虽然每个来自客户端的分页调用只返回50行到客户端,但第一次调用会导致内部SQL 返回所有行;下一次调用,比前一次少50行,依此类推。我认为,这解释了图形的形状。

有没有办法影响SQL的生成方式,甚至用我自己的方法覆盖SQL?这是否意味着我需要提取OData查询?做这个的最好方式是什么?

0 个答案:

没有答案