我上周一直在努力加快网站上的搜索结果。我们一直在努力将网站上的分页移动到SQL。这大大加快了分页速度,但是我仍然需要再次查询整个表以获得该表中记录的总数。
我正在缓存总计,只有当用户改变搜索参数以加快分页时才重新运行查询的这一部分,这很有效。我们现在遇到的问题是SQL服务器的CPU负载急剧增加,因此分页的性能急剧波动(在100毫秒和2秒之间)。
我只是想知道在Web服务器上缓存整个结果表并使用DataTable.Select
或Linq语句查询内存表/列表是不是更好?我意识到这会给Web服务器增加大量的内存负载,但是我们正在努力提高速度,因此升级Web服务器可能是值得的,因为它们也是负载平衡的,而SQL框则不是。
答案 0 :(得分:4)
我发现这个解决方案在您有分页的情况下非常有效,并希望在不运行查询两次的情况下返回总行数...
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)列列表中包含一个唯一的列。
答案 1 :(得分:0)
嗯,我看到没有人有任何建议,但如果有其他人有这个问题,我们最终通过运行查询来解决问题,以获得总计自己的线程,这现在给我们一贯更高的速度。 Hooray用于多线程!
答案 2 :(得分:0)
我建议使用Lucene等文字搜索引擎。
将您的SQL数据库保持为“主” - 即可更新,并使用Lucene作为只读快速搜索数据库。
我已经使用过这种策略几次了,我可以告诉你的经验,你不会相信它有多快。这是非常快的:几毫秒的搜索和订购结果准备在网页上显示。
有一些工作可以让它全部工作,但它是值得的。此外,它可以很好地扩展 - 因为它是只读的,您可以轻松地在分布式网络中分发任意数量的副本,从而为您提供有效的无限搜索吞吐量。
大多数大型网站都使用它或类似的东西。