Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL中的慢速查询-CXCONSUMER等待类型_Sql Server_Parallel Processing - Fatal编程技术网

Sql server SQL中的慢速查询-CXCONSUMER等待类型

Sql server SQL中的慢速查询-CXCONSUMER等待类型,sql-server,parallel-processing,Sql Server,Parallel Processing,我有一个数据脚本,它在一个数据库中执行了大约3分钟,但当我试图在另一个数据库(不同的服务器)上执行它时,它需要4个多小时,所以我杀死了它。 当我获取服务器状态时,查询从第一秒开始就处于等待状态(CXCONSUMER类型)。Who_2显示25条记录,其中Cmd=OPEN CURSOR,24条Status=suspended,1条Status=runnable。 如何在sql中关闭并行性并运行脚本 declare @PolicyId int, @ElhNo int, @Y int, @Capital

我有一个数据脚本,它在一个数据库中执行了大约3分钟,但当我试图在另一个数据库(不同的服务器)上执行它时,它需要4个多小时,所以我杀死了它。 当我获取服务器状态时,查询从第一秒开始就处于等待状态(CXCONSUMER类型)。Who_2显示25条记录,其中Cmd=OPEN CURSOR,24条Status=suspended,1条Status=runnable。 如何在sql中关闭并行性并运行脚本

declare @PolicyId int, @ElhNo int, @Y int, @CapitalChangeZarib decimal(38, 10), @PrmChangeZarib decimal(38, 10)
declare PayPeriodCursor cursor local for
    select Distinct CurrBNVer.PolicyId, CurrBNVer.ElhNo, CurrBNVer.Y, CurrBNVer.CapitalChangeZarib, CurrBNVer.PrmChangeZarib
    from v_Table1 CurrBNVer 
        left join v_Table1 PreBNVer on CurrBNVer.PolicyId = PreBNVer.PolicyId and
                                                    CurrBNVer.ElhNo - 1 = PreBNVer.ElhNo        
    order by CurrBNVer.PolicyId, CurrBNVer.ElhNo
open PayPeriodCursor 
fetch next from PayPeriodCursor into @PolicyId, @ElhNo, @Y, @CapitalChangeZarib, @PrmChangeZarib
while @@FETCH_STATUS = 0 
begin 
    update Table2
    set Filed1= 0.01 * @CapitalChangeZarib, 
        Filed2= 0.01 * @PrmChangeZarib
    where PolicyId = @PolicyId and
          ElhNo >= @ElhNo and
          Year >= ISNULL(@Y, 0)
    fetch next from PayPeriodCursor into @PolicyId, @ElhNo, @Y, @CapitalChangeZarib, @PrmChangeZarib
end
close PayPeriodCursor
deallocate PayPeriodCursor 

go

最后我发现了问题所在。我使用的是一个视图,其中包含一个select*from table1
在我运行脚本之前,有人在表1中添加了一个可为空的列。所以我需要在使用它之前刷新视图。但我不知道那个添加字段。因此,我的一个重要字段(用于连接)为整个表返回null(该字段不可为null,但视图返回其他字段的值)。因此,只有连接由于空值而花费了那么长的时间。我所做的只是刷新视图并解决问题。

“服务器之间有什么区别?”您比我们更能回答这个问题。你为什么要用游标?@honeybacker我没有安装sql服务器。我的意思是,是否有任何配置使这种差异(并行性)?对于这个特定的查询,我不得不使用游标,但为什么在某个地方它执行得很快,而在某个地方它正在等待,天知道有多长时间,表1中有多少行?如果表1没有policyid和elhno上的索引,并且游标是动态的,那么每次迭代/获取游标时都会发生非常低效的执行。为了进行实验,将光标更改为static,看看它是否有任何差异。@lptr连接返回17000行,我有合适的索引,正如您所说的。两个数据库中的索引是相同的,但运行时间不同,我认为可能有一些配置用于决定是否以并行模式运行查询。但是我在谷歌上找不到任何有用的东西。如果你认为并行性是罪魁祸首,你可以尝试
选项(maxdop 1)
来选择光标。