SQL Server 2008全文索引似乎从未完成


13

我们的网站具有一个SQL Server 2008 R2 Express Edition数据库,该数据库具有用于我们网站搜索的全文索引。每次在其中一个索引表中添加或更新新记录时,索引过程似乎永远不会完成。

在过去的几周中,我一直在使用此网站上的基本相同的查询来监视状态:http : //www.sqlmonster.com/Uwe/Forum.aspx/sql-server-search/2155/Why-is-this这么长时间的人口

这是我运行查询时看到的(单击以查看完整大小): 全文索引状态

索引表中的最新记录永远不会完成,并且不可搜索。即使表中没有太多数据,我也已经等了几天看索引是否完成,但是什么都没有改变。

我能够成功完成索引编制的唯一方法是重建目录或删除并重新创建所有索引。

每次这样做,一旦添加了第一个新记录,就会再次出现相同的问题。

以下是服务器统计信息,以防万一:

  • 四核AMD Opteron 2.34GHz
  • 4GB RAM
  • Windows Server 2008 R2企业SP1 x64
  • 具有高级服务x64的SQL Server 2008 R2 Express Edition

Answers:


6

我终于找到了造成我问题的原因!

我花了几个月的时间来寻找问题所在,但最终放弃了,禁用了自动更改跟踪功能,只是手动启动了增量填充,然后继续生活。

同时,还有另一个困扰我的错误,我无法追踪。网站定期会引发数据库连接错误:

无法打开登录请求的数据库“ XXXX”。登录失败。用户“ XXXX”的登录失败。

事实证明,这两个问题都有相同的解决方案。我要做的就是关闭名为“自动关闭”的数据库设置。为此,只需右键单击数据库,然后单击属性。在属性窗口中,选择选项,然后将“自动关闭”设置为false。

数据库属性窗口

禁用“自动关闭”后,数据库登录问题就消失了,自动更改跟踪也可以正常工作。

再次感谢大家的帮助。我很感激!


3

如果您已经完成了BOL中的全文本性能(http://technet.microsoft.com/zh-cn/library/ms142560.aspx)中的疑难解答步骤,您会感到好奇。

我敢打赌,SQL Server正在消耗您的所有内存,并且不让筛选器守护进程拥有任何内存,因此您的填充速度很慢,因为它很可能必须将内容交换到页面文件中。您应该限制SQL可以使用的内存量(考虑到您当前的系统规格,我认为应该在3GB左右-对于FDHost和OS将留出1GB的空间)。


@布兰登投票。阅读本节,“全文索引性能下降的主要原因是硬件资源限制:”
MacGyver,2012年

2

这是我使用游标创建的脚本,用于为具有MSSQL2008索引的任何表重建和填充全索引。这在具有从MSSQL 2000服务器迁移的数据库的生产环境中工作。我已经关闭了更改跟踪,只是通过SQL Server代理运行此存储过程。如果您使用Express,则可以使用VBS脚本通过Task Scheduler运行它。

在脚本中重要的是在尝试填充索引之前,首先在每个目录上进行重建。

CREATE PROCEDURE [dbo].[rebuild_repopulate_fulltext] 
AS
BEGIN

Declare @cmdA NVARCHAR(255)
Declare @cmdB NVARCHAR(255)
Declare @cmdC NVARCHAR(255)
DECLARE @Database VARCHAR(255)   
DECLARE @Table VARCHAR(255)  
DECLARE @cmd NVARCHAR(500)  
DECLARE @fillfactor INT 
DECLARE @Catalog VARCHAR(255)
DECLARE @Schema VARCHAR(255)

SET @fillfactor = 90 

DECLARE DatabaseCursor CURSOR FOR  
SELECT name FROM MASTER.dbo.sysdatabases   
WHERE name NOT IN ('master','msdb','tempdb','model','distribution')   
ORDER BY 1  

OPEN DatabaseCursor  

FETCH NEXT FROM DatabaseCursor INTO @Database  
WHILE @@FETCH_STATUS = 0  
BEGIN  

   -- rebuild fulltext catalog
   set @cmd = 'DECLARE CatalogCursor CURSOR FOR 
        SELECT t.name AS TableName, c.name AS FTCatalogName, s.name as schemaname
        FROM ['+ @Database + '].sys.tables t JOIN ['+ @Database +'].sys.fulltext_indexes i
        ON t.object_id = i.object_id
        JOIN ['+ @Database + '].sys.fulltext_catalogs c
        ON i.fulltext_catalog_id = c.fulltext_catalog_id
        JOIN ['+ @Database + '].sys.schemas s ON t.schema_id = s.schema_id'
   --PRINT @cmd
   EXEC (@cmd)  


   OPEN CatalogCursor   

   FETCH NEXT FROM CatalogCursor INTO @Table, @Catalog, @Schema
   WHILE @@FETCH_STATUS = 0   
   BEGIN  

    SET @cmdB = 'USE ['+ @Database + ']; ALTER FULLTEXT CATALOG ' + @Catalog + ' REBUILD;'
    --PRINT @cmdB
    EXEC (@cmdB)


    FETCH NEXT FROM CatalogCursor INTO @Table, @Catalog, @Schema
   END   

   CLOSE CatalogCursor   


   OPEN CatalogCursor   

   FETCH NEXT FROM CatalogCursor INTO @Table, @Catalog, @Schema
   WHILE @@FETCH_STATUS = 0   
   BEGIN  

    SET @cmdC = 'USE ['+ @Database + ']; ALTER FULLTEXT INDEX ON ['+ @Database + '].[' + @Schema + '].[' + @Table + '] START FULL POPULATION;' 
    --PRINT @cmdC
    EXEC (@cmdC)

    FETCH NEXT FROM CatalogCursor INTO @Table, @Catalog, @Schema
   END   

   CLOSE CatalogCursor   
   DEALLOCATE CatalogCursor  



   FETCH NEXT FROM DatabaseCursor INTO @Database  
END  

CLOSE DatabaseCursor   
DEALLOCATE DatabaseCursor

END

有没有人有不需要游标的方法?


0

通常建议使用触发器来更新全文目录。这就是我在mssql上使用的方法,但是就我而言,因为我有一个本地化应用程序,它具有几个特定要求,导致我使用触发器创建了一个解决方案,该解决方案从两年前开始100%起作用。

对照此示例检查您的实现。


现在,我的索引设置为自动更改跟踪。我读过将其更改为手动并使用触发器实际上会在一个人在尚未完成从上一个表更新触发的索引更新之前在索引表中插入或更新记录时引起问题。似乎自动更改跟踪应该可以工作……尤其是因为我的表中没有那么多记录。
Jargs

我对照您提供的示例链接检查了我的设置,但一切似乎都井井有条。我什至尝试修复SQL Server安装,但是问题仍然存在。
Jargs

1
我不知道这是否相关,但是由于Word Breaker问题,我曾经遇到过全文目录问题。如果打开SSMS并选择数据库下的“存储”,则右键单击全文目录。转到表/视图,然后查看分词系统语言。是否有使用分词器使用不同语言的列?我注意到,如果您在同一张表中使用不同的语言来显示分词系统,则无法正常工作。也许无关,但谁知道呢?
Craig Efrein 2011年

0

不知道您的情况的根本原因是什么,但这可能在备份之后发生。不知道这是您的情况还是该表与其他表有何不同。现在你让我感到好奇。您是否已打开SQL复制?

对于临时修复,当发生这种情况时,我会在桌子上执行“爬网”(填充)操作。

http://msdn.microsoft.com/zh-CN/library/ms142575(v=sql.105).aspx

使用此代码:

ALTER FULLTEXT INDEX ON dbname.dbo.tablename
START FULL POPULATION;
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.