【问题标题】:SQL SELECT all from large table in groups of set sizeSQL SELECT all from large table in groups of set size
【发布时间】:2018-04-11 15:26:19
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 您可以利用 OFFSET FETCH 来处理这类事情。这是一篇关于该主题的精彩文章。 sqlperformance.com/2015/01/t-sql-queries/…
  • 我认为使用 SSIS 是一种更简单的生成文件的方法。
  • 您是否正在尝试创建多个文件(即根据用户输入将 200 万个文件分成多个块)?如果不是,那么我不确定您为什么要使用分页。如果你是一个带有 OFFSET FETCH @SeanLange 的 while 循环,应该会为你处理好它。
  • 谢谢你。我不知道 OFFSET FETCH,但是,我无法使用它,因为我在旧版本的 SQLServer 上 :(。我想我已经决定尝试使用 TOP(@BatchSize) 和 WHERE id > @ LastId。我会尝试从每个选择中提取最后一个 id 并从那里开始,但 Offset 会更好
  • 您应该标记您使用的 SQL 版本。如果您将数据放在分隔文件中,您应该能够从那里读取最后一个值。

标签: sql sql-server tsql


【解决方案1】:

我想分享一个用于将大型查询拆分为批次的 SQL sn-p。

--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

【讨论】:

    猜你喜欢
    • 2011-10-07
    • 2011-04-06
    • 1970-01-01
    • 1970-01-01
    • 2022-12-02
    • 2021-11-30
    • 1970-01-01
    • 2014-12-12
    • 2017-09-27
    相关资源
    最近更新 更多