2011-11-08 3 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があります。 上記のコードではページ単位のデータを取得するためにSQLクエリを使用していますが、結果が得られるまではうまく動作しますが、結果が0になると何時間もハングします。 また、上記のクエリの実行中にSQL ServerがシステムRAMを消費し、レコードを返さないSQL Serverが開始されます。保存のための入力としてMS-SQLSERVER - ROW_NUMBERを使用したSQLクエリ。クエリの結果が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

どちらのクエリでどのような結果が返ってくるのか、私は理解できません。 'EVENTS.guid = NEWID()'の条件は常に 'false'と評価されるべきです。 –

+0

クエリーを変更して結果がないかどうかを確認します。scenerio – dadua

+0

はクエリーを元のクエリーに変更しました。 – dadua

答えて

0

- クエリ以下の一方

は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

関連する問題