繁体   English   中英

如何从SQL Server事务中刷新全文索引

[英]How to refresh a full text index from within a SQL Server transaction

我遇到的问题类似于此处描述的问题:

如何在mssql中强制刷新事务中的全文索引?

但是,在那里发布的推荐解决方案不起作用。 我尝试在同一个帖子上发布跟进,但主持人已将其删除。 所以我开始提出一个新问题。

与原始查询类似,我也尝试在事务中实现单元测试。 我想将数据插入到全文索引列中,查询数据以检查其有效性,然后再回滚插入。

问题是索引似乎在我提交事务之后才更新。 我尝试了“WAITFOR DELAY”方法,但无论我等待多久,索引都不会更新,直到提交事务为止。

这是我正在尝试做的一个示例:

BEGIN TRAN

INSERT INTO AMMS.Content
(
    ContentTypeId,
    Name,
    ImportDate,
    IsDeleted,
    LastModifiedBy,
    LastModifiedAt,
    DisplayInPortal,
    StatusId
)
VALUES
(
    4,
    'my unit test content',
    GETUTCDATE(),
    0,
    1,
    GETUTCDATE(),
    1,
    2
)

declare @count int
set @count = 0
while @count < 10
begin
    SELECT FULLTEXTCATALOGPROPERTY('PRIMARY', 'PopulateStatus') AS Status
    select * from amms.Content where contains(Name, 'unit')
    waitfor delay '00:00:01'
    set @count = @count + 1
end

填充状态保持为9,只要事务处于挂起状态,select就不返回任何行。 一旦我提交,填充状态返回0并且select按预期返回单行。

我错过了什么吗? 还有另一种方法来实现这一目标吗? 在不同版本的SQL Server下,此行为是否不同? (我目前正在使用2008进行测试)

我觉得你运气不好。 尝试在事务中启动手动刷新...

begin tran
alter fulltext index on dbo.FTS_Table start full population

...给我这个消息:

消息574,级别16,状态0,行1 ALTER FULLTEXT INDEX语句不能在用户事务中使用。

您有哪些替代方案可能取决于您如何管理单元测试,也许您可​​以再次DELETE数据,或者如果表仅用于此测试,则完全DROP表。

本质上,SQL Server不允许您在事务(或快照)中执行某些操作。

索引服务特别故意在用户连接外部运行,因为存在争用的风险和巨大的开销文本索引。

如果您退一步考虑其他任何数据库连接的影响以及当前的事务重写全文索引,我相信您会明白,在这种情况下,Microsoft有一个观点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM