SQL SELECT全部来自设置大小的组中的大表

时间:2018-04-11 15:26:20

标签: sql sql-server tsql

这可能是一个非常简单的事情,但是我在SQL Server,TSql甚至普通的SQL中都不是很全面。

我需要从一个非常大的表(2百万条记录)中检索所有记录,并且我在其他地方使用提取的数据作为制表符分隔文件。

我正在编写一个存储过程来获取此信息,但是所有200万条记录都太大了,因此我需要使用用户设置的行限制(@BatchSize)将数据返回多个select语句。

此特定表上的PK不是顺序的,因此在最后使用WHERE BETWEEN并不理想,因为每个Select调用返回不同数量的记录。在循环中设置SELECT TOP(@BatchLimit)将一遍又一遍地返回相同的X记录。

有没有办法可以让它返回@BatchLimit记录然后从它停止的地方继续?这听起来像是游标的工作,但是在我不确定之前从未使用过光标的人。任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:0)

我想分享一个用于将大型查询拆分成批处理的SQL代码段。

--OPTION 1: Select single part of the batch
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
DECLARE @batch TINYINT = 10

;WITH LargeTable AS(
SELECT  RowNumber = ROW_NUMBER() OVER (ORDER BY  c1.object_id)  --ORDER BY Primary Key
        ,c1.*
FROM    sys.columns as c1
        CROSS APPLY sys.columns  as c2
)

SELECT * 
FROM LargeTable
WHERE RowNumber % 10 = 0 --select 1 out of 10
GO

--OPTION 2: Create a view and loop though your batches
CREATE VIEW dbo.vLargeTable AS(
SELECT  RowNumber = ROW_NUMBER() OVER (ORDER BY  c1.object_id)  --ORDER BY Primary Key
        ,c1.*
FROM    sys.columns as c1
        CROSS APPLY sys.columns  as c2
)
GO

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
DECLARE @batch      TINYINT = 10 
DECLARE @iteration  TINYINT = 0 

WHILE @iteration < @batch
BEGIN

    SELECT @iteration
            ,* 
    FROM dbo.vLargeTable
    WHERE RowNumber % @batch = @iteration    --select 1 out of 10

    SET  @iteration = @iteration + 1        
END