欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

asp.net 相關(guān)文章實(shí)現(xiàn)方法

 更新時(shí)間:2009年05月28日 21:37:37   作者:  
大家或許會(huì)覺得很驚訝:為什么靈感之源會(huì)討論SQL?或許應(yīng)該這樣說吧:搞業(yè)務(wù)系統(tǒng),不跟SQL扯上關(guān)系似乎比較難。

解決方案2:原來的做法是文章表和關(guān)鍵字表,關(guān)鍵字表可能會(huì)存在大量重復(fù)的關(guān)鍵字,所以采用中間表,而關(guān)鍵字不再重復(fù)。

設(shè)計(jì):首選要做的是在原有文章表(Details)的基礎(chǔ)上建立關(guān)鍵字表(DetailKeywords),字段包括ItemID(主鍵)和Keyword(關(guān)鍵字),還有中間表DetailsKeywords,包括DetailID(文章ID)和KeywordID(關(guān)鍵字ID)。以下是主要存儲(chǔ)過程:

UpdateRelatedDetails:更新關(guān)鍵字
復(fù)制代碼 代碼如下:

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:添加單個(gè)關(guān)鍵字
復(fù)制代碼 代碼如下:

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:刪除之前的關(guān)鍵字,存在點(diǎn)問題
復(fù)制代碼 代碼如下:

CREATE PROCEDURE dbo.DeleteRelatedDetails

@DetailID INT

AS

SET NOCOUNT ON

--這里還有其它東西沒有判斷和刪除

DELETE FROM DetailsKeywords WHERE DetailID=@DetailID

SET NOCOUNT OFF
GO

GetRelatedDetails:根據(jù)某文章ID獲取相關(guān)文章
復(fù)制代碼 代碼如下:

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

我貼一下性能比較,環(huán)境是30萬條記錄,機(jī)器是PIII 800+300多內(nèi)存,硬盤是7200轉(zhuǎn):
復(fù)制代碼 代碼如下:

--第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'))

優(yōu)化Sql語句主要是通過在“執(zhí)行計(jì)劃”圖所顯示的IO成本,以及cpu成本來分析執(zhí)行效率。在SQL查詢分析器的執(zhí)行計(jì)劃中,IO成本+CPU成本=本步成本。

三種SQL語句在同一批處理中的執(zhí)行分析結(jié)果:
1、占14.22%,實(shí)際執(zhí)行成本為2.96。
2、占43.08%,實(shí)際執(zhí)行成本為9.96。
3、占42.70%,實(shí)際執(zhí)行成本為8.88。
第一種執(zhí)行成本遠(yuǎn)小于后者,且執(zhí)行計(jì)劃也比后者簡(jiǎn)潔得多,顯然第一種要優(yōu)于其它兩種。執(zhí)行計(jì)劃簡(jiǎn)潔不是優(yōu)越的標(biāo)準(zhǔn),但SQL語句寫得不夠簡(jiǎn)潔,通常是為了滿足業(yè)務(wù)需求不得已寫出復(fù)雜語句。第2種與種3種的執(zhí)行計(jì)劃只是在最后一步不同,前者是inner join,后者是Right Semi Join。

相關(guān)文章

最新評(píng)論