当我执行使用全文索引的查询时,我的行为有些奇怪。
我的数据库如下所示(仅是此问题的重要部分):
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万个),其中当然包含多个字段,例如name
,description
,price
。 Products
表是一个很大的表(> 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兼容。