我有一个使用Azure Mobile Apps .NET后端和Windows客户端的应用程序。在后端和客户端之间同步的一个表有30,000行。同步此表时,DTU达到我的100 DTU(S3)层的60%左右,这非常糟糕。监控图如下所示:
此表的表控制器非常基本:
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查询?做这个的最好方式是什么?