2012-01-25 157 views
2

上週我一直在努力加快網站上的搜索結果。我們一直在努力的是將網站上的分頁轉移到SQL。這大大加快了分頁速度,但是我仍然需要再次查詢整個表以獲得該表中記錄的總數。快速返回大型結果集的最佳策略

我正在緩存總計,並且只有當用戶改變搜索參數以加快分頁速度並且很好地工作時,才重新運行這部分查詢。我們現在面臨的問題是SQL服務器CPU上的負載急劇增加,因此尋呼性能急劇波動(100毫秒和2秒之間)。

我只是想知道是不是更好的緩存整個結果表在Web服務器上,並使用DataTable.Select或Linq語句來查詢內存表/列表?我意識到這會給Web服務器增加很大的內存負載,但我們正在嘗試提高速度,因此升級Web服務器可能是值得的,因爲它們也是負載平衡的,而SQL框不是。

回答

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)列列表中包含一個唯一列。

0

嗯,我看到沒有人有任何建議,但如果有其他人有這個問題,我們最終通過運行查詢來獲得總數在自己的線程,現在給我們持續更高的速度,最終解決了這個問題。萬歲的多線程!

0

我會推薦使用文本搜索引擎,如Lucene

保持您的SQL數據庫爲「主」 - 即可更新,並使用Lucene作爲只讀快速搜索數據庫。

我已經使用了這個策略幾次,我可以告訴你經驗,你不會相信它有多快。它的速度非常快:幾毫秒可以搜索並預訂結果,以便在網頁上顯示。

有一點工作要做到這一點,但它是如此值得。此外,它的擴展性非常好 - 因爲它是隻讀的,您可以輕鬆地在分佈式網絡上分發儘可能多的副本,爲您提供無限的搜索吞吐量。

大多數大型網站使用它或類似的東西。