我正在研究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的记录。存储过程需要很长时间才能执行。我想尽可能地优化它。有没有办法写这个存储过程比这种方式更简单 有人可以帮帮我吗?
答案 0 :(得分:0)
我认为在SP上进行优化并不是很多,因为编写数据库的人需要学习SQL并知道索引是什么。
SQL看起来对我很好 - 但是没有索引甚至是像你这样的微小数据库(是的,600.000行是没有的 - 它在25年前的Foxpro时代很小,今天没什么),需要很长时间才能建立连接。
这是您可以优化的次要部分,但我会在管理工作室中开始运行它,要求假定的AND执行查询计划,并且可能确定在任何需要的表上都没有索引的fadct。