Coldairarrow / Colder.Admin.AntdVue

Admin Fx Based On .NET 5 + Ant Design Vue
MIT License
1.24k stars 386 forks source link

关于系统自带分页BUG,希望能重视!!! #136

Open ysq5202121 opened 3 years ago

ysq5202121 commented 3 years ago

经过大量的测试,发现分页如果数据量比较大,最后几页是无法展示出来,出现查询不出来的情况,小到数据量2万左右,千万数据测试也是一样,无法查询出来(Sqlserver2012)

Coldairarrow commented 3 years ago

生成的SQL看一下

ysq5202121 commented 3 years ago

生成的SQL用数据库查询很快,但是用程序却很慢,似乎与注入的参数有关系

ysq5202121 commented 3 years ago

经过多方面的比对,目前来说可以排除SQL本身查询慢,只有最后几页数据比较慢,前面的是不会慢的,同样的SQL用数据库执行速度很快.

Dishone commented 3 years ago

@ysq5202121 设置主键了吗?索引缓存清空下试试

ysq5202121 commented 3 years ago

@ysq5202121 设置主键了吗?索引缓存清空下试试 主要用程序就慢起来了,主键都设置了,2W数据量不大的,就算没有索引也应该走的不慢

ysq5202121 commented 3 years ago

大佬们自己可以测试下呗,很容易测试出来

Dishone commented 3 years ago

@ysq5202121 我这里分页分表每次重建索引速度就回来了

ysq5202121 commented 3 years ago

@ysq5202121 我这里分页分表每次重建索引速度就回来了

大佬多少数据啊,问题是同样的数据在数据库执行没有问题。 目前采用AsParallel()并行查询可以解决这个问题. linqtosql 对于后面页数会越来越费劲,采用并行查询可以解决这个问题.

ysq5202121 commented 3 years ago

///

/// 获取分页数据(包括总数量) /// 采用并行查询 /// /// 泛型 /// 数据源 /// 分页参数 /// public static async Task<PageResult> GetPageResultByParallelAsync(this IQueryable source, PageInput pageInput) { int count = await source.CountAsync(); var list = source.OrderBy($@"{pageInput.SortField} {pageInput.SortType}") .AsParallel().Skip((pageInput.PageIndex - 1) * pageInput.PageRows) .Take(pageInput.PageRows) .ToList(); return new PageResult { Data = list, Total = count }; }

Dishone commented 3 years ago

@ysq5202121 不应该在SQL上使用PLINQ该服务器执行查询。如果建立多个并发连接,则会增加锁定和争用。一个单一的查询负载的多个项目比N个并发更快。如果查询缓慢,请检查原因是否缺少索引太复杂了吗?实际的SQL是什么样的?

ysq5202121 commented 3 years ago

我瞧瞧