首页 > 解决方案 > Sql Server:更新过程中的查询即使在优化后也不起作用

问题描述

我将尝试详细解释这个问题:

我面临一个奇怪的情况,我的程序偶尔会在 UPDATE 查询中停止。这种情况很少像千分之一的记录那样发生,这让我一无所知。

此外,这个问题不会发生在 DEV 中,它只发生在 PROD 中。PROD 环境不允许任何查询分析,它不允许我触发任何命令,如 DBCC 等。

查询如下所示 -

        CREATE proc [dbo].[Usp_SaveTaskSME]                                        
    (                                        
     @taskDlaIdSelected int                                     
    )                                        
    As                                        
    Begin        
     if exists(Select 1 from TaskDla where TaskDLAId = @taskDlaIdSelected)        
      Begin        
          
     declare @RequestId int, @taskid int, @submissionid int      
     select @RequestId = RequestId, @TaskId = TaskId, @submissionid = SubmissionFileId  from SubmissionFileData where TaskDLAId = @taskDlaIdSelected      
          
     -------- Mod#1 start    -------- **WORKS FINE  **
     Update Task      
     Set TaskStatusId = 1      
     Where TaskId = (Select TaskId from TaskDLA Where TaskDlaId = @taskDlaIdSelected)      
     -------- Mod#1 Ends      
          
     -- MOD #2 : log history of submission file update  --- **WORKS FINE**    
     insert into [dbo].[RequestHistory]        
      ([RequestId],[StatusId],[Description],[StatusChangeBy],[StatusChangeDate],[UpdateType])        
     values        
      (@RequestId, 1, 'TaskId #' + cast(@taskid as varchar) + ' set to In Progress', 'usp_SaveTaskSME', Getdate(), 'In Progress')      
          
     ---- Mod#3 ----- **DOESN'T UPDATES (Sometimes)**
     ---------------- **THIS IS WHERE QUERY STOPS AT TIMES** 
     ---------------- **SO THIS UPDATE IS NOT FIRED**    
     Update TaskDla   
     Set TaskStatusId = 1,        
     Comments = 'Set to In Progress by System'        
     Where TaskDLAId =@taskDlaIdSelected; 

 -- MOD #4 : log history of submission file update      
 insert into [dbo].[RequestHistory]        
  ([RequestId],[StatusId],[Description],[StatusChangeBy],[StatusChangeDate],[UpdateType])        
 values        
  (@RequestId, 1, 'SubmissionFileId #' + cast(@submissionid as varchar) + ' set to In Progress', 'usp_SaveTaskSME', Getdate(), 'In Progress')           
    
    Select 1      
      End  
    Else        
      Begin        
       Select 2        
      End 

SubmissionFileData 表在作为标识的另一列上有一个索引。

到目前为止我尝试过的事情:

我已经在列上创建了一个非聚集索引,这里的条件是TaskDlaId 我还检查了要检查的查询计划,它说更新读取的行数仅为 1,如下所示 -

在此处输入图像描述

你们能建议我在这里还能做什么吗?

标签: sqlsql-servernon-clustered-index

解决方案


推荐阅读