SQL Server停止发送记录

时间:2014-02-28 23:09:38

标签: sql-server sql-server-2008 sql-server-2008-r2

我们有一个非常复杂的分析过程,包含多个变量和数千条记录,这些记录通常会在tempdb中生成数万亿个排列记录。通过预处理和动态SQL,我们已经能够在几秒钟内完成分析,并且tempdb只有几千条记录(而不是数万亿)。

该代码已使用多年。今天,其中一个变量输入增长到传统尺寸的两倍,SQL Server无法完成代码的运行。它将停止发送一个预处理步骤的数据。这里包含完整的代码非常冗长和复杂,但要说明发生了什么:

/* Lots of SQL code */

print 'debug 1'

select distinct field
from   #table

print 'debug 2'

select   several..fields
from     many..tables..joined..with..temp..tables
where    multiple..conditions
group by several..fields

print 'debug 3'

如果我们在SSMS中执行代码(在数据库服务器上运行),我们可以简单地将代码运行到print 'debug 2'行,并立即从select distinct field语句返回330条记录。 / p>

如果我们运行所有代码,则只从select distinct field语句返回290-325(左右)记录,然后数据库服务器的CPU开始抖动。它永远不会返回330条记录的其余部分,debug 2永远不会打印到消息标签/窗口。即使我们在运行数小时后中止查询,结果选项卡/窗口中的记录少于330条,并且不会打印debug 2

这就像第二个select语句使SQL Server无法完成返回第一个select语句的所有行。

我比较了两者的查询计划(有和没有最后一个语句),它们与print 'debug 2'行相同。我尝试将索引添加到#temp表中,更新db中的统计信息,并将最后的select语句移动到存储过程以帮助隔离代码。什么都没有帮助。

有没有人看到Microsoft SQL Server 2008 R2(SP1)在执行SQL语句的过程中停止发送记录?你做了什么修复它?

1 个答案:

答案 0 :(得分:0)

听起来数据被困在我的某个缓冲区中。 将PRINT替换为RaisError('Debug n', 0, 0) WITH NOWAIT,看看是否会改变一切。

PS:你的介绍让我对真正的代码= P

真的非常非常好奇