日期:2014-05-19  浏览次数:20851 次

请问这个存储过程可以怎么优化?
IF   EXISTS   (SELECT   name  
      FROM       sysobjects  
      WHERE     name   =   N 'add_url '  
      AND       type   =   'P ')
        DROP   PROCEDURE   add_url
GO

CREATE   PROCEDURE   add_url  
@url   varchar(255),  
@title   nvarchar(255),
@body   text,
@text   text,
@digest   char(32),
@pageId   int

AS
declare   @digest2   char(32)
if   not   exists(select   *   from   posts   where   url=@url)
begin  
--不存在数据,   直接插入
insert   into   posts   values(@url,GETDATE(),@title,@pageId,@body,@digest,@text,1)
end
else
begin
select   @digest2=@digest   from   posts   where   url=@url
if(@digest2=@digest)
begin
--旧数据,   直接更新重复编号
update   posts   set   datetime=getdate(),duplicated=duplicated+1   where   url=@url
end
else
begin
--新数据,重置所有数据
update   posts   set   body=@body,   text=@text,   digest=@digest,   pageId=@pageId,   title=@title,   datetime=getdate(),   duplicated=1   where   url=@url
end
end
GO


意思就是说,   如果插入的数据不存在(条件@url=url),   则将数据插入进去.  
如果存在了,   则比较是不是新数据,  
如果不是新数据(@digest2=@digest),   则更新duplicated增1,    
如果是新数据,   则刷新所有列

感觉第一个not   exist和后面的读digest的应该可以省略成一行,   但是不知道怎么写.  
这个存储过程需要被频繁的调用,   请问还有什么可以优化的措施呢?

------解决方案--------------------
干吗的?
------解决方案--------------------
Up一个算数~~
------解决方案--------------------
CREATE PROCEDURE add_url
@url varchar(255),
@title nvarchar(255),
@body text,
@text text,
@digest char(32),
@pageId int

AS
declare @digest2 char(32)

select @digest2=digest from posts where url=@url

if @digest2 is null
insert into posts values(@url,GETDATE(),@title,@pageId,@body,@digest,@text,1)
else if @digest2=@digest
update posts set datetime=getdate(),duplicated=duplicated+1 where url=@url
else
update posts set body=@body, text=@text, digest=@digest, pageId=@pageId, title=@title, datetime=getdate(), duplicated=1 where url=@url


------解决方案--------------------
优化嘛
呵呵,楼下来

------解决方案--------------------
似乎再优化也没必要,如果把url作成索引,因为存在平凡的更新,所以还要重整索引,一样占时间
------解决方案--------------------
建议使用游标。。。。。