You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

EF生成查询过慢,如何编写高效SQL排除含指定词的新闻数据?

高效排除指定词汇的新闻分页查询方案

核心问题分析

循环拼接LIKE条件会生成冗长的查询语句,导致数据库无法有效利用索引,查询计划复杂度飙升,最终拖慢速度。以下是两种高效的SQL解决方案:

方案一:用专用表维护排除词汇(推荐长期使用)

  1. 创建排除词汇表
    把可编辑的排除词汇存在数据库表中,方便维护且利于查询优化:
CREATE TABLE ExcludedKeywords (
    Id INT IDENTITY PRIMARY KEY,
    Keyword NVARCHAR(100) NOT NULL,
    KeywordUpper AS UPPER(Keyword) PERSISTED, -- 持久化大写字段,避免重复计算
    UNIQUE(Keyword) -- 防止重复词汇
)

把现有70余个词汇插入该表,后续直接更新表即可完成词汇扩容。

  1. 分页查询SQL
    利用NOT EXISTS关联排除表,结合OFFSET FETCH实现分页(适配SQL Server,MySQL可替换为LIMIT):
SELECT n.Id, n.Title, n.Date, n.Content
FROM News n
WHERE NOT EXISTS (
    SELECT 1
    FROM ExcludedKeywords ek
    WHERE n.TitleUpper LIKE '%' + ek.KeywordUpper + '%'
)
ORDER BY n.Date DESC -- 按发布时间排序,可按需调整
OFFSET @PageSize * (@PageNumber - 1) ROWS
FETCH NEXT @PageSize ROWS ONLY;

方案二:用表值参数临时传入排除词汇(适合临时场景)

如果不想新增表,可通过表值参数一次性传入排除词汇,避免循环拼接:

  1. 定义表值类型
CREATE TYPE KeywordList AS TABLE (KeywordUpper NVARCHAR(100) NOT NULL);
  1. 查询语句
DECLARE @ExcludedKeywords KeywordList;
-- 插入需要排除的大写词汇
INSERT INTO @ExcludedKeywords (KeywordUpper) VALUES ('词汇1'), ('词汇2'), ...;

SELECT n.Id, n.Title, n.Date, n.Content
FROM News n
WHERE NOT EXISTS (
    SELECT 1
    FROM @ExcludedKeywords ek
    WHERE n.TitleUpper LIKE '%' + ek.KeywordUpper + '%'
)
ORDER BY n.Date DESC
OFFSET @PageSize * (@PageNumber - 1) ROWS
FETCH NEXT @PageSize ROWS ONLY;

关键优化点

  • 索引优化:给TitleUpper列创建包含必要字段的覆盖索引,避免回表查询:
    CREATE NONCLUSTERED INDEX IX_News_TitleUpper ON News(TitleUpper)
    INCLUDE(Date, Id, Title, Content);
    
  • 避免函数运算:始终使用预先存储的TitleUpper字段,不要在查询时对Title调用UPPER(),否则会导致索引失效。

内容的提问来源于stack exchange,提问作者YodasMyDad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 20:12:55