SQL Server 2008のフルテキストインデックスが完了していないようです


13

当社のWebサイトには、Webサイト検索用のフルテキストインデックスを備えたSQL Server 2008 R2 Express Editionデータベースがあります。インデックスが作成されたテーブルの1つで新しいレコードが追加または更新されるたびに、インデックス作成プロセスが完了しないようです。

このサイトで見つかった基本的に同じクエリを使用して、過去数週間にわたってステータスを監視しています:http : //www.sqlmonster.com/Uwe/Forum.aspx/sql-server-search/2155/Why-is-this -人口がかかるほど長い

これは、クエリを実行したときに表示されるものです(クリックするとフルサイズになります)。 フルテキストインデックスステータス

インデックス付きテーブル内の最新のレコードは完全なものではなく、検索できません。テーブルにあまり多くのデータはありませんが、インデックス作成が完了するかどうかを確認するために何日も待機しましたが、何も変化しません。

インデックス作成を正常に完了することができる唯一の方法は、カタログを再構築するか、すべてのインデックスを削除して再作成することです。

私がそれをするたびに、最初の新しいレコードが追加されるとすぐに同じ問題が再発します。

念のため、サーバーの統計を以下に示します。

  • クアッドコアAMD Opteron 2.34GHz
  • 4GB RAM
  • Windows Server 2008 R2 Enterprise SP1 x64
  • SQL Server 2008 R2 Express Edition with Advanced Services x64

回答:


6

私はついに問題の原因を見つけました!

私は何ヶ月も問題を追跡しようとしましたが、最終的には自動変更追跡を無効にし、手動でインクリメンタルポピュレーションを開始し、私の人生を続けました。

その間、追跡するのに苦労していたもう一つのしつこいエラーがありました。Webサイトは定期的にDB接続エラーをスローします。

ログインで要求されたデータベース「XXXX」を開けません。ログインに失敗しました。ユーザー「XXXX」のログインに失敗しました。

これらの問題の両方に同じ解決策があることが判明しました。私がしなければならなかったのは、自動クローズというデータベース設定をオフにすることだけです。これを行うには、データベースを右クリックして[プロパティ]をクリックします。プロパティウィンドウで[オプション]を選択し、[自動閉じる]をfalseに設定します。

データベースプロパティウィンドウ

Auto Closeを無効にするとすぐに、DBログインの問題はなくなり、自動変更追跡は完全に機能しました。

みんなの助けをありがとう。それは有り難いです!


3

フルテキストパフォーマンスに関するBOLのトラブルシューティング手順を実行した場合は、http://technet.microsoft.com/en-us/library/ms142560.aspxをご覧ください

SQL Serverはすべてのメモリを消費し、フィルターデーモンにメモリを持たせないので、ページファイルにデータをスワップしなければならない可能性が高いため、ユーザーの処理速度は遅くなります。SQLが使用できるメモリの量を制限する必要があります(現在のシステム仕様を考えると、3GB前後になります-FDHostとOSに1GBを残します)。


投票@Brandon。「フルテキストインデックス作成のパフォーマンスが低下する主な原因は、ハードウェアリソースの制限です。」
MacGyver

2

これは、カーソルを使用して作成したスクリプトで、MSSQL2008用のテーブルが含まれるすべてのテーブルの完全なインデックスを再構築および作成します。これは、MSSQL 2000サーバーからデータベースが移行された実稼働環境で機能しています。変更の追跡をオフにして、SQL Serverエージェント経由でこのストアドプロシージャを実行するだけです。エクスプレスを使用している場合は、VBSスクリプトを使用してタスクスケジューラ経由で実行できます。

スクリプトでは、インデックスを作成する前に、すべてのカタログで最初に再構築を行うことが重要でした。

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で使用しているアプローチですが、私の場合は、トリガーを使用したソリューションにつながるいくつかの特定の要件を持つローカライズされたアプリケーションがあるため、そのソリューションは2年前から100%動作します。

このに対して実装を確認してください。


現在、私のインデックスは自動変更追跡に設定されています。手動に変更し、トリガーを使用すると、前のテーブル更新からトリガーされたインデックスの更新がまだ終了しないうちに、ある人がインデックス付きのテーブルにレコードを挿入または更新すると、実際に問題が発生することがあります。自動変更追跡が機能するようです...特にテーブルにそれほど多くのレコードがないので。
ジャーグ

あなたが与えたリンク例に対してセットアップを確認しましたが、すべてが正常に見えるようです。SQL Serverのインストールを修復しようとしましたが、問題は残ります。
ジャーグ

1
これが関連しているかどうかはわかりませんが、Word Breakerの問題のためにフルテキストカタログの作成に問題があったことがあります。SSMSを開き、データベースの下の[ストレージ]を選択した場合、フルテキストカタログを右クリックします。テーブル/ビューに移動し、ワードブレーカーの言語を確認します。ワードブレーカーに異なる言語を使用する列はありますか?同じテーブルにワードブレーカー用の異なる言語がある場合、人口は機能しません。無関係かもしれませんが、誰が知っていますか?
クレイグエフレイン

0

状況の根本原因がわからないが、これはバックアップの発生後に発生する可能性があります。それがあなたのケースで起こっていることなのか、そのテーブルが他のテーブルとどう違うのかはわかりません。今、あなたは私に興味があります。SQLレプリケーションが有効になっていますか?

一時的な修正として、これが発生したときにテーブルで「クロール」(人口)を実行します。

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

このコードを使用してください:

ALTER FULLTEXT INDEX ON dbname.dbo.tablename
START FULL POPULATION;
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.