我有一个这样的存储过程:
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多个缺少记录。有时这需要很长时间才能执行..
有没有办法比这种方式更简单地编写这个存储过程?
非常感谢任何帮助。
提前致谢
我的存储过程的执行计划
答案 0 :(得分:3)
好吧,让我们认真。
你的SP结束是多余的,jsut返回@status。
使用字符串作为日期的更新很糟糕,但这与forspeed不相关。
速度就在Select中。有趣的是,你错过了一个索引,该索引显示在你发送的截图中 - 这告诉我你在发布之前甚至不打算看它。
请开始考虑指数并进行规划。在你的情况下,你明确地错过了一个索引。
答案 1 :(得分:1)
你不需要返回状态值,它只是有意义,
还添加了缺失的索引,表明您的性能会提高93%左右。
你可以用这样的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
它将在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
*/