小编典典

T-SQL-如何更快地执行带有多个LIKE子句的SELECT查询?

sql

我有一个新闻搜索功能,看起来像这样(包含5个以上的搜索项):

SELECT TOP 5 *
FROM NewsArticles
WHERE (headline LIKE '% sustainable %'OR
headline LIKE '% sustainability %' OR
headline LIKE '% conservation %' OR
headline LIKE '% environmental % OR
headline LIKE '% environmentally %') 
OR
(body LIKE '% sustainable %'OR
body LIKE '% sustainability %' OR
body LIKE '% conservation %' OR
body LIKE '% environmental % OR
body LIKE '% environmentally %')
ORDER BY publishDate DESC

此查询旨在提取与可持续性相关的前5条新闻报道,并位于我的主要可持续性主页上。但是,它需要一段时间才能运行,并且页面加载速度很慢。因此,我正在寻找加快速度的方法。拥有如此多的LIKE子句似乎很麻烦,因此我尝试使用JOIN这样的操作:

CREATE TABLE #SearchItem (Search varchar(255))

INSERT INTO #SearchItem VALUES
('sustainable'),
('sustainability'),
('conservation'),
('environmental'),
('environmentally')

SELECT TOP 5 *
FROM NewsArticles as n
JOIN #SearchItem as s
ON n.headline COLLATE DATABASE_DEFAULT LIKE '% ' + s.Search + ' %' OR 
n.body COLLATE DATABASE_DEFAULT LIKE '% ' + s.Search + ' %'
ORDER BY n.publishDate DESC

这似乎对性能非常有效,但似乎有时会带回重复的文章,其中在正文和标题中都出现一个搜索词(通常是这种情况)。我已经尝试过使用“ SELECT DISTINCT
TOP 5 *”这个词,但这给我一个错误:“
ntext数据类型不能被选择为DISTINCT,因为它不具有可比性”。是否可以阻止它在不进行2次单独搜索且使用UNION的情况下带回重复项?


阅读 254

收藏
2021-04-22

共1个答案

小编典典

由于您在多个单词上多次点击,因此可以将所选ID用作实际选择文章的过滤器:

Select TOP 5 * 
from NewsArticles 
where ID in (SELECT ID
    FROM NewsArticles as n
    JOIN #SearchItem as s
    ON n.headline COLLATE DATABASE_DEFAULT LIKE '% ' + s.Search + ' %' OR 
       n.body COLLATE DATABASE_DEFAULT LIKE '% ' + s.Search + ' %'
)
ORDER BY publishDate DESC

它仍应相当快(与原始查询相比)且无重复。

(如Rawheiser的答复中,假设ID字段实际上存在:)

2021-04-22