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
System.OutOfMemory 异常是一个 .NET 异常,它基本上告诉您网格控件遇到了 OOM 情况。我过去曾在博客中详细讨论过这一点。
您可以尝试减少结果集的建议,这在过程的中间级别中肯定是必需的。但为了规避 SSMS 中的 OOM 条件,您可以尝试输出到 TEXT 或输出到文件,或者使用 SQLCMD 执行相同的 T-SQL 过程/命令。