【问题标题】:Really slow sql for search result count (for paging)搜索结果计数的 sql 真的很慢(用于分页)
【发布时间】:2013-11-20 05:35:26
【问题描述】:

我有一张包含许多新闻的表格。我正在使用 SQL Server 2008 标准版

在这张表中,我有

  • 200 万行
  • 聚集索引位于指示记录插入时间的datetime 列上。
  • headline 列、newsIdentity 列(可能重复)、author 列上的非聚集索引

当我通过我的网络应用在此表中搜索新闻时,服务器需要超过 20 秒的时间来响应。

我发现计算行数的SQL真的很慢(搜索结果分页)。

这是 showplan_text 结果:

StmtText

select count(*) 
from [news] WITH (NOLOCK)       
WHERE headline like N'%Nginx%' 

StmtText

|--Compute Scalar(DEFINE:([Expr1004]=CONVERT_IMPLICIT(int,[Expr1007],0))) 
   |--Stream Aggregate(DEFINE:([Expr1007]=Count(*))) 
        |--Index Scan(OBJECT:([newsMangr].[dbo].[news].[IX_SearchNews]),  WHERE:  ([newsMangr].[dbo].[news].[headline] like N'%Nginx%')) 

20 秒是不可接受的,有什么建议吗?

【问题讨论】:

  • 向我们展示新闻内容的示例? “Nginx”子字符串是恒定偏移量吗?
  • 好吧,通过使用LIKE N'%ginx%'(带有前导%),您可以确定 SQL Server 不能可能使用任何索引.....这导致速度缓慢 - 它需要扫描 整个表 以找到与您的 headline 匹配的行。
  • 您能否添加一个已预加载您的条件的计算持久字段?
  • @marc_s 能否为索引搜索提供全文索引帮助?
  • @mr_eclair:全文搜索可以帮助 - 但它是基于单词的,例如您可以轻松搜索单词 - 但不是真正的单词片段

标签: sql sql-server performance sql-server-2008


【解决方案1】:

试试这个:

WHERE SUBSTRING(headline, <offset>, 5) = 'Nginx'

其中&lt;offset&gt; 是常量值。

【讨论】:

  • 嗨@k06a,我不认为我可以从用户那里得到补偿,他们可以通过我的网络应用搜索任何位置的任何单词。
  • 为了完成玩具之类的事情,必须使用全文搜索。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-02
  • 1970-01-01
  • 2010-10-22
  • 1970-01-01
  • 2013-06-24
相关资源
最近更新 更多