countrouble,时间停止器系列,伽卡菲斯
解决方案2:原来的做法是文章表和关键字表,关键字表可能会存在大量重复的关键字,所以采用中间表,而关键字不再重复。
设计:首选要做的是在原有文章表(details)的基础上建立关键字表(detailkeywords),字段包括itemid(主键)和keyword(关键字),还有中间表detailskeywords,包括detailid(文章id)和keywordid(关键字id)。以下是主要存储过程:
updaterelateddetails:更新关键字
create procedure dbo.updaterelateddetails
@detailid int,
@keywords nvarchar(500)
as
set nocount on
exec deleterelateddetails @detailid
declare @i int
declare @keyword nvarchar(50)
declare @keywordid int
set @keywords=replace(@keywords,',', ',')
set @keywords=replace(@keywords,';', ',')
set @keywords=rtrim(ltrim(@keywords))
set @i=charindex(',', @keywords)
while @i>=1
begin
set @keyword=left(@keywords, @i-1)
exec addrelateddetailkeyword @detailid, @keyword
set @keywords=substring(@keywords, @i+1,len(@keywords)-@i)
set @i=charindex(',', @keywords)
end
if @keywords<>''
exec addrelateddetailkeyword @detailid, @keywords
set nocount off
go
addrelateddetailkeyword:添加单个关键字
create procedure dbo.addrelateddetailkeyword
@detailid int,
@keyword nvarchar(50)
as
set nocount on
declare @keywordid int
select @keywordid=itemid from detailkeywords where keyword=@keyword
if @keywordid is null
begin
insert into detailkeywords (keyword) values(@keyword)
set @keywordid=ident_current('detailkeywords')
end
insert into detailskeywords (detailid, keywordid) values(@detailid, @keywordid)
set nocount off
go
deleterelateddetails:删除之前的关键字,存在点问题
create procedure dbo.deleterelateddetails
@detailid int
as
set nocount on
--这里还有其它东西没有判断和删除
delete from detailskeywords where detailid=@detailid
set nocount off
go
getrelateddetails:根据某文章id获取相关文章
create procedure dbo.getrelateddetails
@detailid int
as
select distinct d.itemid, d.subject from details d, detailkeywords k, detailskeywords s
where d.itemid = s.detailid and k.itemid=s.keywordid and d.itemid<>@detailid
go
我贴一下性能比较,环境是30万条记录,机器是piii 800+300多内存,硬盘是7200转:
--第1种,两表情况
--select a.* from article a,artkey2 b
--where a.artid=b.artid and b.keyvalue='科技9'
--第2种,三表情况
--select a.* from article a,artkey1 b,
--(select keyid from keyvalue where keyvalue='科技9') c
--where a.artid=b.artid and b.keyid=c.keyid
--第3种,三表情况
--select * from article where artid in
--(select artid from artkey1 where keyid in
--(select keyid from keyvalue where keyvalue='科技9'))
优化sql语句主要是通过在“执行计划”图所显示的io成本,以及cpu成本来分析执行效率。在sql查询分析器的执行计划中,io成本+cpu成本=本步成本。
三种sql语句在同一批处理中的执行分析结果:
1、占14.22%,实际执行成本为2.96。
2、占43.08%,实际执行成本为9.96。
3、占42.70%,实际执行成本为8.88。
第一种执行成本远小于后者,且执行计划也比后者简洁得多,显然第一种要优于其它两种。执行计划简洁不是优越的标准,但sql语句写得不够简洁,通常是为了满足业务需求不得已写出复杂语句。第2种与种3种的执行计划只是在最后一步不同,前者是inner join,后者是right semi join。
2
如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!!
点击进行留言回复
网友评论