【发布时间】: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