请问这个存储过程可以怎么优化?
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作成索引,因为存在平凡的更新,所以还要重整索引,一样占时间
------解决方案--------------------建议使用游标。。。。。