我如何知道 SQL 全文索引填充何时完成?
我们正在为针对测试 SQL Server 数据库运行的 ASP.NET 应用程序编写单元测试。 也就是说,ClassInitialize 方法创建一个包含测试数据的新数据库,ClassCleanup 删除该数据库。我们通过从代码运行 .bat 脚本来做到这一点。
被测试的类被赋予一个连接到单元测试数据库而不是生产数据库的连接字符串。
我们的问题是,数据库包含全文索引,需要用测试数据完全填充该索引,以便我们的测试按预期运行。
据我所知,全文索引始终在后台填充。我希望能够:
- 使用同步(transact-SQL?)语句创建完全填充的全文索引,或者
- 了解全文填充何时完成,是否有回调选项,或者我可以重复询问?
我当前的解决方案是在类初始化方法结束时强制延迟 - 5 秒似乎有效 - 因为我在文档中找不到任何内容。
We are writing unit tests for our ASP.NET application that run against a test SQL Server database.
That is, the ClassInitialize method creates a new database with test data, and the ClassCleanup deletes the database. We do this by running .bat scripts from code.
The classes under test are given a connection string that connects to the unit test database rather than a production database.
Our problem is, that the database contains a full text index, which needs to be fully populated with the test data in order for our tests to run as expected.
As far as I can tell, the fulltext index is always populated in the background. I would like to be able to either:
- Create the full text index, fully populated, with a synchronous (transact-SQL?) statement, or
- Find out when the fulltext population is finished, is there a callback option, or can I ask repeatedly?
My current solution is to force a delay at the end the class initialize method - 5 seconds seems to work - because I can't find anything in the documentation.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(7)
这是我们根据 GarethOwen 的答案创建的存储过程。它接受逗号分隔的表列表作为参数,并等待所有表的全文索引更新。它每隔十分之一秒进行一次检查,以防止磁盘崩溃,并在 10 秒后超时,以防万一运行缓慢/损坏。如果您的 FT 搜索跨多个索引,则非常有用。
通过以下方式调用:
来源:
dbo.split 是一个现在每个人都必须拥有的表值函数,它将分隔符上的字符串拆分为临时表:
This is a stored procedure we created based on GarethOwen's answer. It accepts a comma separated list of tables as parameters and waits until full text indexes on all of them have been updated. It does this check every tenth of a second to prevent thrashing the disk and times out after 10 seconds just in case things are running slowly/broken. Useful if your FT searches are across multiple indexes.
Called in the following way:
The source:
dbo.split is a table value function that everyone must have by now which splits a string on a separator into a temporary table:
谢谢丹尼尔,你的回答让我走上了正轨。
我实际上使用以下T-SQL语句来询问全文索引的填充状态是否为Idle:
'v_doc_desc_de'是我们索引的数据库视图的名称。
如果人口状态不是空闲,我会等待几秒钟并再次询问,直到它变为空闲。在检查之间等待一小段时间非常重要,以确保连续检查填充状态不会减慢全文填充速度。
MSDN 文档指出建议使用 OBJECTPROPERTYEX 函数(在表级别),而不是具有属性“PopulateStatus”的 FULLTEXTCATALOGPROPERTY 语句。它规定如下:
Thanks Daniel, your answer got me on the right track.
I actually use the following T-SQL statement to ask if the population status of the full text index is Idle:
'v_doc_desc_de' is the name of the database view that we index.
If the population status is not idle, I wait a couple of seconds and ask again, until it is Idle. It is important to wait a small amount of time between checks to ensure the full text population is not slowed down by continuously checking the population status.
The MSDN documentation states that the
OBJECTPROPERTYEX
function (at table level) is recommended over theFULLTEXTCATALOGPROPERTY
statement with property 'PopulateStatus'. It states the following:要等待全文目录完成所有表和视图的填充,而不必指定其名称,可以使用以下存储过程。这是 JohnB 对这个问题的回答和 cezarm 对 相关问题的回答的组合< /a>:
To wait for a full text catalog to finish population of all its tables and views without having to specify their names, you can use the following stored procedure. This is a combination of JohnB's answer to this question and the answer by cezarm to a related question:
我做了以下事情:
I did the following:
我在使用带有全文搜索的 dockerized sql 服务器时遇到了同样的问题。数据库已成功播种,但当我运行测试时,索引填充状态尚未完成,因此在我的测试中没有返回结果。
为了确保在运行测试之前重建索引,我使用了一个带有查询的自旋锁,该查询标识我的任何表是否有正在重建的索引:
I had the same issue using a dockerized sql server with a full text search. The database was seeded successfully but when I ran the test, the index populate status didn't finished yet, so no results were returned in my test.
In order to make sure the indexes were rebuilt before running the test, I used a spinlock with a query that identifies if any of my tables have an index being rebuilt:
我想提供 @Daniel Renshaw 的答案的更易于阅读的版本:
结果:
I would like to offer an easier-to-read version of @Daniel Renshaw's answer:
Results:
您可以使用 FULLTEXTCATALOGPROPERTY 查询状态(请参阅此处:http://technet.microsoft. com/en-us/library/ms190370.aspx)。
例如:
您可能还想使用 SQL Profiler 来监视在打开目录属性对话框时 SQL Server Management Studio 发出的命令。该对话框包括人口状态指示,并且显示的所有信息均使用 T-SQL 查询。
You can query the status using FULLTEXTCATALOGPROPERTY (see here: http://technet.microsoft.com/en-us/library/ms190370.aspx).
For example:
You might also like to use SQL Profiler to monitor what commands SQL Server Management Studio issues when you bring up the properties dialog for the catalog. The dialog includes an indicatin of population status and all the information shown is queried using T-SQL.