2011-11-08 100 views
0
select autoid from (SELECT ROW_NUMBER() OVER (ORDER 
BY MYTABLE.DETECTEDUTC DESC) as rownum, autoId from 
MYTABLE where MYTABLE.guid in (..guids..)) as tab1 where rownum >=1000 and rownum < 1020 

我們有一個表MYTABLE,它可能包含數百萬條記錄,目前它有1000萬條記錄。 上面的SQL查詢用於在我們的代碼中獲取分頁數據,它工作正常,直到查詢給出結果,但如果查詢返回0結果,則掛起數小時。 同時SQL服務器開始消耗系統RAM,同時運行上面的查詢並且不返回任何記錄。MS-SQLSERVER - SQL查詢使用ROW_NUMBER需要很長時間,查詢結果爲0

在下面的查詢另一方面正常工作與0的結果 -

select autoid from (SELECT ROW_NUMBER() OVER (ORDER 
BY MYTABLE.DETECTEDUTC DESC) as rownum, autoId from 
MYTABLE where MYTABLE.guid in(..guids..)) as tab1 
+2

我無法理解任何一個查詢如何返回任何結果?條件'where EVENTS.guid = NEWID()'應該總是計算爲'false'。 –

+0

只是修改查詢以檢查沒有結果scenerio – dadua

+0

現在將查詢更改爲原始查詢。 – dadua

回答

0

無論在查詢中的問題,我提出我的方式通常實現分頁:

爲輸入(用於存儲程序實例):

@fromIndex int = 0 -- default starting from index 0 
@count int = 10 -- default returning 10 items per page 

通用SQL邏輯:

CREATE TABLE #PaginatedItems (
    Column1 int, -- declare your needed columns here 
    Column2 varchar(50), 
    rowIndex int -- needed for pagination logic 
); 

WITH OrderedItems AS 
    (
     SELECT 
      SourceTable.Col1, -- will end up in #PaginatedItems.Column1 
      SourceTable.Col2, 
      ROWNUMBER() OVER (
           ORDER BY <sort criteria> 
          ) AS rowIndex 
     FROM 
      SourceTable 
    ) 
INSERT INTO 
    #PaginatedItems 
SELECT 
    * 
FROM 
    OrderedItems 
WHERE 
    rowIndex >= @fromIndex + 1 AND rowIndex <= @fromIndex + @count 

SELECT * FROM #PaginatedItems -- the query that returns the items 

希望這會有所幫助。

+0

是否有一個特定的原因,您將結果插入臨時表而不是直接返回它們?如果是這樣,可能值得在解答中加入一個解釋。 –

+0

沒有理由直接關係到這個問題。我在做更多的連接來選擇額外的信息,在我的情況下使用臨時表更快。我想這裏只有一點點可讀性。 – CyberDude

+0

我已經試過上面沒有插入的查詢,仍然面臨同樣的問題 – dadua