System.OutOfMemoryException 增加最大服务器内存后未解决

System.OutOfMemoryException unresolved after increasing max server memory

我是新手,所以请多多包涵。

早些时候,我尝试使用没有任何批量大小、kilobytes_per_batch 或 row_per_batch 参数的批量插入来导入一个非常大的 CSV 文件。然后我遇到了以下错误:

执行批处理时出错。错误消息是:抛出 'System.OutOfMemoryException' 类型的异常。

我通过拆分 CSV 并将其分块导入解决了这个问题。结果,我最终在 SQL 2016 Server Management Studio 中有两个单独的 table。这两个 table 包含来自已拆分的 CSV 的值。因此,它们具有相同的列、列大小和数据类型。我决定使用 union all 查询来组合它们。当我这样做时,错误又回来了。然后我决定将最大服务器内存增加到 5 GB,我认为这应该绰绰有余。但是,当我重试 union all 查询时,错误又回来了。我的电脑总共有 8 GB 的 RAM。我正在使用 windows 10 64 位和基于 x64 的处理器。

table 的属性如下所示:

CREATE TABLE [dbo].[indivs16] (
    [Cycle] [char] (4) NOT NULL,
    [FECTransID] [char] (19) NOT NULL,
    [ContribID] [char] (12) NULL,
    [Contrib] [varchar] (50) NULL,
    [RecipID] [char] (9) NULL,
    [Orgname] [varchar] (50) NULL,
    [UltOrg] [varchar] (50) NULL,
    [RealCode] [char] (5) NULL,
    [Date] [datetime] NULL,
    [Amount] [int] NULL,
    [Street] [char] (3) NULL,
    [City] [varchar] (30) NULL,
    [State] [char] (2) NULL,
    [Zip] [char] (5) NULL,
    [Recipcode] [char] (2) NULL,
    [Type] [char] (3) NULL,
    [CmteID] [char] (9) NULL,
    [OtherID] [char] (9) NULL,
    [Gender] [char] (1) NULL,
    [Microfilm] [varchar] (18) NULL,
    [Occupation] [varchar] (38) NULL,
    [Employer] [varchar] (38) NULL,
    [Source] [char] (5) NULL
) ON [PRIMARY]

这是我 运行 联合的查询:

SELECT * FROM Indivs16000
UNION ALL
SELECT * FROM Indivs16001

这是我如何进行查询的屏幕截图:

该错误看起来像 .NET 错误,而不是 SQL 服务器错误。

你是怎么查询的?如果您使用 System.Data.DataTable 进行查询,那么您 运行 客户端内存不足,因为它正在将其全部加载到内存中。

您应该改为使用 IDataReader 查询数据,这将流式传输数据 "firehose" 样式,您一次可以单向读取数据记录,因此您只有一个一次将几千条记录提取到客户端内存中——无论您的 table 有多大或您的 SELECT 语句返回多少条记录。

如果您使用了 import/export 实用程序,那将非常简单,即使使用批量插入,您也可以使用批处理并插入到相同的 table。然而,这不是世界末日,您可以再试一次。