C# 性能最佳实践-通过SQL加载分页结果,并加载找到的全部结果

C# 性能最佳实践-通过SQL加载分页结果,并加载找到的全部结果,c#,sql,performance,C#,Sql,Performance,我有一个一般的软件实践问题,也许主持人可以更好地表达我的标题 我正在加载一个“管理用户”页面的分页结果列表,该页面有一系列过滤器 在我的系统中,有3000个用户,我希望每页显示25个,底部有一个分页控件。没问题。问题是 我想在页面顶部显示,我的条件有2300个匹配项,所以我要做的是运行同一个SQL查询两次——一次以25条记录的限制构建到对象中(用于分页),然后再次获取无约束的总计数 这似乎没有表现。有没有一种不必运行两个SQL查询的首选方法?我解决了一个类似的问题,使用了两个查询方法:第一个查询

我有一个一般的软件实践问题,也许主持人可以更好地表达我的标题

我正在加载一个“管理用户”页面的分页结果列表,该页面有一系列过滤器

在我的系统中,有3000个用户,我希望每页显示25个,底部有一个分页控件。没问题。问题是

我想在页面顶部显示,我的条件有2300个匹配项,所以我要做的是运行同一个SQL查询两次——一次以25条记录的限制构建到对象中(用于分页),然后再次获取无约束的总计数


这似乎没有表现。有没有一种不必运行两个SQL查询的首选方法?

我解决了一个类似的问题,使用了两个查询方法:第一个查询检索当前数据页(即25行),而另一个查询用于检索总计数

从您的问题来看,似乎您正在第二次查询中检索整个数据集。正如其他人所说,您最好只检索行计数


在第二个查询中只获取行数应该会加快速度,但是如果您希望避免每次加载某些数据时都运行它,那么可以在最初加载页面时只运行一次,将结果存储在会话或视图状态中。这当然意味着,如果行数发生变化,计数可能会过时,因此在这种情况下,您需要根据性能评估准确性的优点。

不要运行相同的查询,而是运行一个
计数(*)
一个查询。例如:

Select top 25 Name, Country, SomethingElse from SomeTable where Name like @name

Select Count(*) from SomeTable where Name like @name
这在使用类似NHibernate或实体框架的ORM时很容易实现。对于普通的旧sql,您需要创建两个查询


希望有帮助。

您应该指定如何实现分页控制。一种解决方案是将所有返回的行缓存在一个合适的数据结构中,这样您就可以获得总计数,并将分页委托给一些访问缓存行的代码,以返回25行束。我认为您将需要两个查询,但是使用
count
可能比检索整个结果集要好得多。除非您的RDBMS也支持返回“total matches”参数,否则有两个选项-1)两个查询,一个是简单的计数,另一个是分页结果,以及2)一个查询,获取所有结果,然后在应用程序中对它们进行计数/分页。值得一提的是,2300行通常不是一个巨大的数字,所以您可以这样做。