2017-10-09 25 views
-2

我的数据库中有一个存储过程。当我调用该存储过程时,有时需要1分钟,有时需要10分钟,有时需要更多时间才能完成。花费很多时间的存储过程

在下面的步骤单独花费更多的时间在整个过程中,不知道这个可怜的查询,需要重新编写存储过程或一些其他的服务器问题

IF (EXISTS (SELECT 1 
      FROM table1 PWI (NOLOCK) 
      INNER JOIN table2 W (NOLOCK) ON PWI.ID = W.ID 
      WHERE W.Flag = 1 
       AND PWI.PatID IN (SELECT PatID FROM @table3) 
       AND W.SubID IN (SELECT SubID FROM @table4))) 

请帮助解决这个问题

+4

执行计划? –

+2

对于初学者,你应该摆脱那些NOLOCK提示。 99.999%的时间他们不是一个好主意。 http://blogs.sqlsentry.com/aaronbertrand/bad-habits-nolock-everywhere/ –

+3

表格定义(包括索引),执行计划,近似行数在这里都会非常有帮助。 –

回答

-2

表变量获得估计行= ​​1并计划用循环连接构建。使用临时表或OPTION(RECOMPILE)

+1

这不仅仅是一个回答而是一个评论。目前还不清楚你在这里想说什么。 –

+0

将表变量修改为#temp表修复了我的问题。现在SP仅运行19秒,而之前需要13分钟。谢谢 – vinoth

+0

不用太多需要的表变量:) –

0

哈特说没有将所有代码和DDL,但是这可能会提高性能

IF (EXISTS (SELECT 1 
FROM table1 PWI (NOLOCK) 
INNER JOIN table2 W (NOLOCK) ON PWI.ID = W.ID 
inner join @table3 on PWI.PatID = @table3.PatID 
inner join @table4 on W.SubID = @table4.SubID 
WHERE W.Flag = 1))