ALTER PROCEDURE [dbo].[pBuildReportSensitiveKeywordsMatch]
AS
BEGIN

SET NOCOUNT ON; DELETE 
FROM ReportSensitiveKeywordsMatch -- 查找所有在线Listing DECLARE @keywordsType int, @keywords nvarchar(250) DECLARE cursor_keywords CURSOR FOR
SELECT [Type], Keywords
FROM SensitiveKeywords OPEN cursor_keywords
FETCH NEXT FROM cursor_keywords INTO @keywordsType, @keywords
WHILE @@FETCH_STATUS = 0
BEGIN INSERT INTO ReportSensitiveKeywordsMatch

PMID, PMName, 
ProductID, PropertyID, 
ItemID, 
eBayID, eBayName,
[Site], Location,
SKU, Title,
KeywordsType, Keywords,
CreateDate

SELECT 
u.UserID, u.UserName,
cl.ProductID, cl.PropertyID,
l.ItemID, 
e.eBayID, e.eBayName,
l.[Site], l.Location,
l.SKU, l.Title,
@keywordsType, @keywords,
GETDATE()
FROM OpenData.dbo.Listing as l
INNER JOIN OpenData.dbo.eBay as e ON l.eBayID = e.eBayID
INNER JOIN ProductCustomerLabel as cl ON cl.CustomerLabel = l.SKU
INNER JOIN Product as p ON cl.ProductID = p.ProductID
INNER JOIN Users as u ON u.UserID = p.ProductManagerID
WHERE e.CompanyID = 6 -- 内部
AND -- 关键字匹配
(
l.Title LIKE @keywords+' %'
OR l.Title LIKE '% '+@keywords
OR l.Title LIKE '% '+@keywords+' %' OR l.Title LIKE '% '+@keywords+',%'
OR l.Title LIKE '% '+@keywords+'-%'
OR l.Title LIKE '% '+@keywords+'+%'
OR l.Title LIKE '% '+@keywords+'/%'
OR l.Title LIKE '% '+@keywords+'_%' OR l.Title LIKE '%,'+@keywords+' %'
OR l.Title LIKE '%-'+@keywords+' %'
OR l.Title LIKE '%+'+@keywords+' %'
OR l.Title LIKE '%/'+@keywords+' %'
OR l.Title LIKE '%_'+@keywords+' %' OR l.Title LIKE @keywords+',%'
OR l.Title LIKE '%,'+@keywords
OR l.Title LIKE '%,'+@keywords+',%' OR l.Title LIKE @keywords+'-%'
OR l.Title LIKE '%-'+@keywords
OR l.Title LIKE '%-'+@keywords+'-%' OR l.Title LIKE @keywords+'+%'
OR l.Title LIKE '%+'+@keywords
OR l.Title LIKE '%+'+@keywords+'+%' OR l.Title LIKE @keywords+'/%'
OR l.Title LIKE '%/'+@keywords
OR l.Title LIKE '%/'+@keywords+'/%' OR l.Title LIKE @keywords+'_%'
OR l.Title LIKE '%_'+@keywords
OR l.Title LIKE '%_'+@keywords+'_%'
)
AND EXISTS -- 站点对应语言
(
SELECT TOP 1 NULL
FROM fun_LanguageToSite(cl.[Language]) as l2s
WHERE l2s.[Site] = l.[Site]
)
AND NOT EXISTS -- 忽略表
(
SELECT TOP 1 NULL
FROM SensitiveKeywordsOverPass as op
WHERE op.ProductID = cl.ProductID
AND ISNULL(op.PropertyID,0) = ISNULL(cl.PropertyID,0)
AND op.Keywords = @keywords
) FETCH NEXT FROM cursor_keywords INTO @keywordsType, @keywords
END
CLOSE cursor_keywords
DEALLOCATE cursor_keywords
END
SensitiveKeywords表的keywords字段不断的去模糊匹配l.Title字段,但是用到了游标和like关键字,效率非常低,请问有没有其他的优化技巧。现在想用windows服务实现,但是不知道如何拆解这个存储过程。请各位看看。小弟感激不尽!!!

解决方案 »

  1.   

    把游标换掉,可以考虑CTE(不会的话到联机丛书搜CTE就可以了)。like的话,可以考虑使用全文检索来实现。
      

  2.   

    我也想到了全文检索,请问contains(column_name,search_condition)这个查询条件,我怎么匹配呢?
      

  3.   

    只是一个字段 title 的查询 有必要用全文搜索吗? 
      

  4.   

    现在主要数据量比较大,用like效率很低,查询速度很慢。现在不知如何拆分这个存储过程。
      

  5.   

    另外把游标 用 while 循环替换掉 ,游标 太耗资源。
      

  6.   

    一句话,怎么搞都慢,你如果用like %%的话,而且还用来那么多次!想改善,只能从设计层面改!