存储过程需要很长时间才能在SQL Server 2008中执行

时间:2014-09-21 10:28:05

标签: sql-server stored-procedures

我有一个这样的存储过程:

ALTER procedure [dbo].[delivary1] 
   @dedate nvarchar(100), 
   @carid nvarchar(100)
AS 
BEGIN
    declare @transid int
    declare @status int
    declare @count int,
            @currentdate nvarchar(50)

    select @currentdate = GETDATE()

    SET NOCOUNT ON;

    select @count = count(*) 
    from Transaction_tbl 
    where TBarcode = @carid

    if @count=0
    begin
       return -1
    end
    else
    begin
       select @status = t1.Status  
       from Transaction_tbl t1 
       where t1.TBarcode = @carid

       if @status = 4
       begin
          select @transid = t.transactID 
          from Transaction_tbl t 
          where t.TBarcode = @carid

          update Transaction_tbl 
          set DelDate = '' + @currentdate + '', Status=5 
          where TBarcode = @carid

          update KHanger_tbl 
          set Delivered = 1 
          where transactid = @transid

          return 4
       end

       if @status = 5
       begin
          return 5
       end

       if @status=0
       begin
          return 0
       end

       if @status=1
       begin
          return 1
       end

       if @status = 2
       begin
          return 2
       end

       if @status = 3
       begin
          return 3
       end
    end
end

我的数据库有10多个缺少记录。有时这需要很长时间才能执行..

有没有办法比这种方式更简单地编写这个存储过程?

非常感谢任何帮助。

提前致谢

我的存储过程的执行计划

enter image description here

2 个答案:

答案 0 :(得分:3)

好吧,让我们认真。

  • 你的SP结束是多余的,jsut返回@status。

  • 使用字符串作为日期的更新很糟糕,但这与forspeed不相关。

  • 速度就在Select中。有趣的是,你错过了一个索引,该索引显示在你发送的截图中 - 这告诉我你在发布之前甚至不打算看它。

请开始考虑指数并进行规划。在你的情况下,你明确地错过了一个索引。

答案 1 :(得分:1)

你不需要返回状态值,它只是有意义,

还添加了缺失的索引,表明您的性能会提高93%左右。

enter image description here

你可以用这样的OUTPUT参数编写这个程序......

ALTER procedure [dbo].[delivary1] 
    @dedate nvarchar(100), 
    @carid  nvarchar(100),
    @status INT OUTPUT
WITH RECOMPILE
AS
BEGIN
  SET NOCOUNT ON;
    DECLARE @transid int, @count int,@currentdate nvarchar(50)

     SET @currentdate = GETDATE();


    select @count = count(*) from Transaction_tbl where TBarcode = @carid

    if (@count = 0)
       begin
          SET @status = -1;
       end
    else
      begin
          select @status = t1.[Status]  from Transaction_tbl t1 where t1.TBarcode = @carid

            if (@status = 4)
              begin
                select @transid = t.transactID 
                  from Transaction_tbl t 
                 where t.TBarcode = @carid

                update Transaction_tbl 
                       set DelDate = '' + @currentdate + ''
                         , [Status] = 5 
                 where TBarcode = @carid

                update KHanger_tbl 
                   set Delivered=1 
                 where transactid = @transid
              end
      end
END

如何添加缺失索引

转到执行计划右键单击显示缺失索引的位置,然后单击Missing Index Details

enter image description here

它将在SQL Server认为有助于提高此查询性能的新查询窗口中为您提供索引定义。您现在需要做的就是执行Statement,它将为您创建索引。

索引定义

/*
Missing Index Details from SQLQuery1.sql - ALI-PC.AdventureWorks2008R2 (My Server\UserName (59))
The Query Processor estimates that implementing the following index could improve the query cost by 95.7414%.
*/

/*
USE [AdventureWorks2008R2]
GO
CREATE NONCLUSTERED INDEX [<Name of Missing Index, sysname,>]
ON [Sales].[SalesOrderHeader] ([TerritoryID],[ShipMethodID],[SubTotal],[Freight])
INCLUDE ([SalesOrderNumber],[CustomerID])
GO
*/