用 Dapper 持续查询,发现耗时越来越长,代码如下:
var page = 0;
var pageSize = 10;
var count = pageSize;
var sw = new Stopwatch();
while (count >= pageSize)
{
sw.Restart();
count = await Query(page, pageSize, startId, maxId);
sw.Stop();
_logger.LogInformation($"Query {count} items with {sw.ElapsedMilliseconds}ms");
page++;
}
private async Task<int> Query(int page, int pageSize, int startId, int maxId)
{
var sql = @"SELECT [t].[Id],
[t].[Title],
[t].[Content],
FROM (
SELECT [x].[Id],
[x].[Title],
[x].[Content],
ROW_NUMBER() OVER(ORDER BY [x].[Id]) AS [__RowNumber__]
FROM [Items] AS [x]
WHERE ([x].[Id] > @startId) AND ([x].[Id] <= @maxId)
) AS [t]
WHERE ([t].[__RowNumber__] > @p1) AND ([t].[__RowNumber__] <= (@p1 + @p2))";
var items = _connection.Query<Item>(sql, new { startId = startId, maxId = maxId, p1 = page * pageSize, p2 = pageSize });
retrun items.Count();
}
打印出来的时间从一开始 10 ms,在8个小时内慢慢的增加到 5000 ms,请问这是什么原因呢?
既然基于 startId
,为什么还用 ROW_NUMBER()
进行分页查询,直接 TOP
不就行了吗
已改用 top
,等待测试
使用 top
之后,提升很明显,基本上在 1 ms
我觉得应该是数据库的原因,而不是Dapper的原因
赞同
跟Dapper没关系,看一下执行计划,哪块开销大,优化一下吧