我们有一个非常复杂的分析过程,包含多个变量和数千条记录,这些记录通常会在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语句的过程中停止发送记录?你做了什么修复它?
答案 0 :(得分:0)
听起来数据被困在我的某个缓冲区中。
将PRINT
替换为RaisError('Debug n', 0, 0) WITH NOWAIT
,看看是否会改变一切。
PS:你的介绍让我对真正的代码= P
真的非常非常好奇