2013-10-23 69 views
1

我有一個來自SQL查詢的「巨大」結果集。大約2-3百萬行類型的varchar(50)列。這可能不是太大而無法擔心。但是,如果我不得不處理這樣的色譜柱呢?所以,這使我想到了我的問題 - 有沒有一種方法可以使用SQL在小塊中檢索大量數據,將它們放到內存中,使用您希望的任何語言/工具進行處理(我使用C#和SSIS ETL工具)?以小塊獲取大數據集以節省內存?

如果您覺得這個問題需要更清楚,請發表評論。

+4

如果可能的話,使用*流*訪問方法(如SQLReader的或IQueryable的) - 用它來在數據的工作,但沒有實現整個result-立即設置(例如,不要讀入數據表或強制到列表中)。 – user2864740

+0

@ user2864740 - 處理數據 - 這是什麼意思?這在原則上如何工作?是這樣的 - 你要求2百萬行,然後SS檢索,說2萬,然後把它們還給你。之後,它會尋找更多的記錄,直到它達到200萬大關? – Steam

+1

有*流*並且有*分頁*。只要查詢本身能夠流式傳輸,SQL Server(和C#中的ADO.NET)將非常高興地使用數據流 - 您將一個接一個地獲取所有記錄。只要強制實現(例如讀入DataTable),代碼必須等待* all *結果才能進入。但是,如果我們直接寫入文件,那麼每個記錄都可以被處理當它來。 – user2864740

回答

2
DECLARE @PageN int = 0 -- 0..N 
DECLARE @RowPerPage int = 20 

SELECT * 
FROM (
    SELECT ROW_NUMBER() OVER (ORDER BY [LastLoginDate]) as rowNumber 
     ,Customer.* 
    FROM dbo.Customer 
    --WHERE <Search cond> 
    ) paging 
WHERE rowNumber > @PageN * @RowPerPage 
    AND rowNumber <= (@PageN + 1) * @RowPerPage; 

尋呼的MS SQL 2008

+0

你能解釋一下代碼在做什麼,即簡要描述嗎?我對這些東西很陌生,所以我需要你的幫助。謝謝。 – Steam

+0

@blasto,我不知道C#,我不能給你代碼。但是,如果你顯示你的SQL查詢,我可以幫助改變它的分頁。分頁選擇的想法。起初,你嘗試頁碼是0.你得到20行並處理它們。請求到下一頁。如果你得到的行少於20(或0),那麼你已經達到了數據的末尾 – AlexK

1

是的,這是可能的。在C#中,您可以使用LINQ,只要您遍歷結果(並避免調用ToList()或類似的東西),結果集中的行將一次加載一次。如果你不使用LINQ,你可以改用SqlDataReader。