6GB 表 - 37Mi 行 - 'System.OutOfMemoryException' - SQL 2008 R2

Rac*_*SQL 6 performance sql-server-2008-r2 query-performance

我有一个 proc,循环遍历数据库(插入在修复数据库中......选择使用循环),进行插入(将隐藏名称以确保安全):

insert into Main_Database..Table(16 Fields)  
    select ( there are 16 fields here, DateDiff(s, DtTrabalhoInF8, DtTrabalhoFi) as TempoSegundos  
     from  [Database_name].dbo.View as T1 with (nolock)  
     where DtTrabalho >= '2015/06/06' and   
     not exists(select 1 from PainelControle.dbo.tblLogProjetos T2 Where t2.BancoDados collate SQL_Latin1_General_CP1_CI_AS = t1.BancoDados collate SQL_Latin1_General_CP1_CI_AS and t2.codlog = t1.codlog)
Run Code Online (Sandbox Code Playgroud)

问题是:

如果我运行它,它会在 1 秒内运行:

insert into Main_Database..Table(16 Fields)  
        select ( there are 16 fields here, DateDiff(s, DtTrabalhoInF8, DtTrabalhoFi) as TempoSegundos  
         from  [Database_name].dbo.View as T1 with (nolock)  
         where DtTrabalho >= '2015/06/06'
Run Code Online (Sandbox Code Playgroud)

问题在这里:

and   
         not exists(select 1 from Database_Name.dbo.tblLogProjetos T2 Where t2.BancoDados collate SQL_Latin1_General_CP1_CI_AS = t1.BancoDados collate SQL_Latin1_General_CP1_CI_AS and t2.codlog = t1.codlog)
Run Code Online (Sandbox Code Playgroud)

tblLogProjetos有 3700 万行。6GB(从 tbllog 显示消息的简单选择 1)并且作业永远不会结束(手动运行代码,而不是在作业内部,10 分钟后它向我显示错误):

'System.OutOfMemoryException'

我想知道如何解决这个问题。这是SERVER问题吗?(我们有 32GB )。是不是这个MANAGEMENT STUDIO问题:

name                    minimum      maximum       config_value     run_value
max server memory (MB)    16       2147483647        28000           28000
Run Code Online (Sandbox Code Playgroud)

还是这个查询问题?我注意到的一件事是,当我使用查询查看未使用的索引时,该表的每个索引都有 0 次读取。这怎么可能?

在此处输入图片说明

顺便说一句...tblLogProjetos 是一个 VIEW,它使用链接服务器到另一台服务器。这只是一个select ( fields ) from [server5].painelcontrole.dbo.tbllogprojetos

Ami*_*jee 2

System.OutOfMemory 异常是一个 .NET 异常,它基本上告诉您网格控件遇到了 OOM 情况。我过去曾在博客中详细讨论过这一点。

您可以尝试减少结果集的建议,这在过程的中间级别中肯定是必需的。但为了规避 SSMS 中的 OOM 条件,您可以尝试输出到 TEXT 或输出到文件,或者使用 SQLCMD 执行相同的 T-SQL 过程/命令。