Sql 快速返回大型结果集的最佳策略

Sql 快速返回大型结果集的最佳策略,sql,linq,datatable,pagination,Sql,Linq,Datatable,Pagination,上周我一直在努力提高网站搜索结果的速度。我们一直致力于将站点上的分页移动到SQL。这大大加快了分页速度,但是我仍然需要再次查询整个表以获得该表中记录的总数 我正在缓存总计,只有当用户更改搜索参数以加快分页速度时,才重新运行查询的这一部分,而且效果很好。我们现在面临的问题是,SQL server的CPU上的负载急剧增加,因此分页的性能波动很大(在100毫秒到2秒之间) 我只是想知道是否最好将整个结果表缓存在web服务器上,然后使用DataTable。选择或Linq语句来查询内存表/列表?我意识到这

上周我一直在努力提高网站搜索结果的速度。我们一直致力于将站点上的分页移动到SQL。这大大加快了分页速度,但是我仍然需要再次查询整个表以获得该表中记录的总数

我正在缓存总计,只有当用户更改搜索参数以加快分页速度时,才重新运行查询的这一部分,而且效果很好。我们现在面临的问题是,SQL server的CPU上的负载急剧增加,因此分页的性能波动很大(在100毫秒到2秒之间)


我只是想知道是否最好将整个结果表缓存在web服务器上,然后使用
DataTable。选择
或Linq语句来查询内存表/列表?我意识到这将给Web服务器增加大量内存负载,但我们正在努力提高速度,因此升级Web服务器可能是值得的,因为它们也是负载平衡的,而SQL box不是。

我看没有人有任何建议,但是,如果有其他人有这个问题,我们最终通过运行查询来解决这个问题,从而在它自己的线程中获得总数,这现在给了我们持续更高的速度。多线程万岁

我看没有人有任何建议,但是如果其他人有这个问题,我们最终通过运行查询在它自己的线程中获取总数来解决了这个问题,现在这给了我们更高的速度。多线程万岁

我建议像这样使用文本搜索引擎

将您的SQL数据库保持为“主数据库”-ie可更新,并将Lucene用作只读快速搜索数据库

我已经使用过这种策略好几次了,我可以根据经验告诉你,你不会相信它有多快。它的速度快得离谱:搜索和排序结果只需几毫秒,就可以在网页上显示了

有一点工作,让它全部工作,但它是如此值得。此外,它的可扩展性非常好—因为它是只读的,您可以轻松地在分布式网络上分发任意多个副本,从而有效地提供无限的搜索吞吐量


大多数大型网站都使用它或类似的东西。

我建议使用文本搜索引擎,比如

将您的SQL数据库保持为“主数据库”-ie可更新,并将Lucene用作只读快速搜索数据库

我已经使用过这种策略好几次了,我可以根据经验告诉你,你不会相信它有多快。它的速度快得离谱:搜索和排序结果只需几毫秒,就可以在网页上显示了

有一点工作,让它全部工作,但它是如此值得。此外,它的可扩展性非常好—因为它是只读的,您可以轻松地在分布式网络上分发任意多个副本,从而有效地提供无限的搜索吞吐量


大多数大型网站都使用它或类似的工具。

我发现这种解决方案在有分页功能的情况下非常有效,并且希望在不运行两次查询的情况下返回总行数

DECLARE @startRow INT ; SET @startrow = 50
;WITH cols
AS
(
    SELECT table_name, column_name, 
        ROW_NUMBER() OVER(ORDER BY table_name, column_name) AS seq, 
        ROW_NUMBER() OVER(ORDER BY table_name DESC, column_name desc) AS totrows
    FROM [INFORMATION_SCHEMA].columns
)
SELECT table_name, column_name, totrows + seq -1 as TotRows
FROM cols
WHERE seq BETWEEN @startRow AND @startRow + 49
ORDER BY seq
摘自这里:

总行数在resultset中作为一个额外的列存在,但我认为这是一个公平的权衡


我必须对文章中的解决方案进行一次修改,以确保OVER(ORDER BY)列列表中包含一个唯一的列。

我发现此解决方案在有分页的情况下非常有效,并且希望在不运行两次查询的情况下返回总行数

DECLARE @startRow INT ; SET @startrow = 50
;WITH cols
AS
(
    SELECT table_name, column_name, 
        ROW_NUMBER() OVER(ORDER BY table_name, column_name) AS seq, 
        ROW_NUMBER() OVER(ORDER BY table_name DESC, column_name desc) AS totrows
    FROM [INFORMATION_SCHEMA].columns
)
SELECT table_name, column_name, totrows + seq -1 as TotRows
FROM cols
WHERE seq BETWEEN @startRow AND @startRow + 49
ORDER BY seq
摘自这里:

总行数在resultset中作为一个额外的列存在,但我认为这是一个公平的权衡

我对本文中的解决方案所做的一个修改是确保在OVER(orderby)列列表中包含一个唯一的列