带有全文搜索的TSQL查询不会停止执行

时间:2018-09-03 17:14:14

标签: sql-server tsql full-text-search sql-server-2014 sql-server-2016

当我执行使用全文索引的查询时,我的行为有些奇怪。

我的数据库如下所示(仅是此问题的重要部分):

table Catalogs 
(
     Id int primary key not null, ...
)

table Products 
(
    Id int primary key not null, 
    CatalogId int not null foreign key references Catalogs(Id), ...
)

table FulltextData 
(
    ProductId int not null, 
    Name nvarchar(100), 
    Description nvarchar(max), 
    Keywords nvarchar(max), 
    Timestamp timestamp not null,

    constraint PK_FulltextData primary key (ProductId)
)

目录包含多个产品(当前最多50万个),其中当然包含多个字段,例如namedescriptionpriceProducts表是一个很大的表(> 40个mio条目)。

我正在使用全文目录和索引来对产品数据执行前缀搜索。所以我就这样创建了全文目录

create fulltext catalog ProductsFTC

然后我创建了全文索引

create fulltext index on FulltextData(Name,Description,Keywords) 
key index PK_FulltextData on ProductsFTC 
with(stoplist=off,change_tracking=manual)

将目录(包含所有产品数据)导入数据库后,我使用以下语句执行增量填充:

ALTER FULLTEXT INDEX ON FulltextData START INCREMENTAL POPULATION

之后,我用以下语句检查全文索引是否准备就绪:

SELECT FULLTEXTCATALOGPROPERTY('ProductsFTC', 'PopulateStatus')

到目前为止,一切都很好。而这对我来说毫无意义。

当我在新导入的目录上执行全文搜索时(在全文索引更新之后),将生成两个查询:

第一个查询统计包含以 book 为前缀的单词的产品数量:

select count(*) 
from Products p 
inner join FulltextData f on p.Id = f.ProductId
where p.CatalogId = 4711 
  and contains((name, description, keywords), '"book*"')

我需要对结果进行计数,因为用户希望查看以下信息:products 50 to 100 of 41.000(请不要问为什么)。

第二个查询仅返回用户可以检查的50种产品:

select Id, Name, Description, Keywords, Spn, Price
from Products p 
inner join FulltextData f on p.Id = f.ProductId
where CatalogId = 4711 
  and contains((name, description, keywords), '"book*"')
order by Spn 
    offset 50 rows fetch next 50 rows only

第一个查询(...count(*)...)是不会停止执行的查询。起初,我想确定全文索引可能有太多记录。但是,当我稍微更改第一个查询时(而不是CatalogId=4711而是使用CatalogId in (42,4711)),我得到了即时结果!

仅在目录 4711 中的搜索不会停止执行。

使用目录 4711 42 进行的搜索非常好,可以立即为我提供结果。

当我只在 42 目录中搜索时,我也会得到即时结果(= 0)。

因此全文索引的大小不是问题,否则,当我在两个目录中执行搜索时不会得到任何结果。

我想念什么?任何帮助都会很棒!

我正在使用SQL Server 2016(13.0.4001.0),但数据库需要与SQL Server 2014兼容。

0 个答案:

没有答案