【问题标题】:Best strategy for returning large result sets quickly快速返回大型结果集的最佳策略
【发布时间】:2012-02-18 11:39:38
【问题描述】:

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

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

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

【问题讨论】:

    标签: sql linq datatable pagination


    【解决方案1】:

    我发现这个解决方案在您有分页的情况下非常有效,并且想要返回总行数而不运行两次查询...

    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
    

    取自这里:SQL Server Paging - The Holy Grail

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        我建议使用 Lucene 这样的文本搜索引擎。

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

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

        要让这一切正常工作需要做一些工作,但这是非常值得的。此外,它的可扩展性非常好 - 因为它是只读的,您可以轻松地在分布式网络中分发任意数量的副本,从而为您提供有效的无限搜索吞吐能力。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-09-06
          • 2017-01-12
          • 2015-06-19
          • 1970-01-01
          • 1970-01-01
          • 2018-07-22
          • 2020-08-07
          • 1970-01-01
          相关资源
          最近更新 更多