检索超过2组数据时,存储过程执行需要很长时间

时间:2014-09-29 11:26:58

标签: sql sql-server sql-server-2008 stored-procedures

我正在研究SQL Server 2008.我是存储过程的新手。我写了一个这样的存储过程:

ALTER PROCEDURE [dbo].[IBSFCDINP] @Carid NVARCHAR(50)

AS
BEGIN
SET NOCOUNT ON
  SELECT

     k.HBarcode, m.make,t.Compl,
    t.plateno,t.self,t.dtime, v.vtype, l.locname,case when l.edt is null or l.edt =0 then l.minEdt +l.BuffrEDT else l.edt + l.BuffrEDT end as EDT,  t.locid,t.vtid,t.lsttic,
     c.Colname, te.UniqueName,DATEDIFF(minute,t.dtime,getdate()) as Duration,pl.PS,pc.PlateCode

  FROM dbo.Transaction_tbl t

  left JOIN KHanger_tbl k ON t.transactID = k.transactID
  left JOIN make_tbl m ON t.mkid = m.mkid 
left join PlateSource_tbl pl on t.PSID=pl.PSID
left join PlateCode_tbl pc on t.PCdID=pc.PCdID
  left JOIN vtype_tbl v ON v.vtid = t.vtid 
  left  JOIN Location_tbl l ON t.locid = l.locid 

  left JOIN Color_tbl C ON t.colid = c.colid 
  left JOIN Terminals_tbl te ON k.tid = te.tid

 WHERE t.tbarcode = @carid 
if(select COUNT(t1.Compl) from dbo.Transaction_tbl t1 where T1.TBarcode=@Carid)=1
begin
declare @compl integer =null,
@transid integer=null,
@complid integer=null
select @transid=t.transactID from dbo.Transaction_tbl t where t.TBarcode=@carid
Select @compl=co.Cmplid from dbo.ComplimentTransactAssign_tbl co where co.TransactID=@transid
select c.CompName,c1.Remarks from Complimentary_tbl c 
 inner join ComplimentTransactAssign_tbl c1 on c.CmplID=c1.Cmplid where c.CmplID=@compl and c1.TransactID=@transid
end
declare @locatnid integer,
@location nvarchar(100)
begin
select @locatnid= t.Locid from dbo.Transaction_tbl t where t.TBarcode=@carid
select l1.StartTime,l1.EndTime from dbo.Location_tbl l1 where l1.Locid=@locatnid
end
END

我的数据库有超过600K的记录。存储过程需要很长时间才能执行。我想尽可能地优化它。有没有办法写这个存储过程比这种方式更简单 有人可以帮帮我吗?

1 个答案:

答案 0 :(得分:0)

我认为在SP上进行优化并不是很多,因为编写数据库的人需要学习SQL并知道索引是什么。

SQL看起来对我很好 - 但是没有索引甚至是像你这样的微小数据库(是的,600.000行是没有的 - 它在25年前的Foxpro时代很小,今天没什么),需要很长时间才能建立连接。

这是您可以优化的次要部分,但我会在管理工作室中开始运行它,要求假定的AND执行查询计划,并且可能确定在任何需要的表上都没有索引的fadct。