当前位置: 移动技术网 > IT编程>开发语言>.net > asp.net 相关文章实现方法第1/2页

asp.net 相关文章实现方法第1/2页

2017年12月12日  | 移动技术网IT编程  | 我要评论

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

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网