我有一個來自SQL查詢的「巨大」結果集。大約2-3百萬行類型的varchar(50)列。這可能不是太大而無法擔心。但是,如果我不得不處理這樣的色譜柱呢?所以,這使我想到了我的問題 - 有沒有一種方法可以使用SQL在小塊中檢索大量數據,將它們放到內存中,使用您希望的任何語言/工具進行處理(我使用C#和SSIS ETL工具)?以小塊獲取大數據集以節省內存?
如果您覺得這個問題需要更清楚,請發表評論。
我有一個來自SQL查詢的「巨大」結果集。大約2-3百萬行類型的varchar(50)列。這可能不是太大而無法擔心。但是,如果我不得不處理這樣的色譜柱呢?所以,這使我想到了我的問題 - 有沒有一種方法可以使用SQL在小塊中檢索大量數據,將它們放到內存中,使用您希望的任何語言/工具進行處理(我使用C#和SSIS ETL工具)?以小塊獲取大數據集以節省內存?
如果您覺得這個問題需要更清楚,請發表評論。
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
是的,這是可能的。在C#中,您可以使用LINQ,只要您遍歷結果(並避免調用ToList()
或類似的東西),結果集中的行將一次加載一次。如果你不使用LINQ,你可以改用SqlDataReader。
如果可能的話,使用*流*訪問方法(如SQLReader的或IQueryable的) - 用它來在數據的工作,但沒有實現整個result-立即設置(例如,不要讀入數據表或強制到列表中)。 – user2864740
@ user2864740 - 處理數據 - 這是什麼意思?這在原則上如何工作?是這樣的 - 你要求2百萬行,然後SS檢索,說2萬,然後把它們還給你。之後,它會尋找更多的記錄,直到它達到200萬大關? – Steam
有*流*並且有*分頁*。只要查詢本身能夠流式傳輸,SQL Server(和C#中的ADO.NET)將非常高興地使用數據流 - 您將一個接一個地獲取所有記錄。只要強制實現(例如讀入DataTable),代碼必須等待* all *結果才能進入。但是,如果我們直接寫入文件,那麼每個記錄都可以被處理當它來。 – user2864740