web-dev-qa-db-ja.com

SQL Server 2008フルテキストインデックスが完了していないように見える

私たちのウェブサイトには、SQL Server 2008 R2 Express Editionデータベースがあり、ウェブサイト検索用にフルテキストインデックスが作成されています。インデックス付きテーブルの1つで新しいレコードが追加または更新されるたびに、インデックス作成プロセスが完了したようには見えません。

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

これは、クエリを実行したときに表示されるものです(フルサイズの場合はクリックしてください): Full-Text Index Status

インデックス付きテーブルの最新のレコードは決して完了せず、検索できません。テーブルにはあま​​りデータがありませんが、インデックス作成が完了するまで数日待ちましたが、何も変更されていません。

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

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

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

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

ようやく問題の原因を発見!

私は問題を追跡するために何ヶ月も試してみましたが、最終的にあきらめ、自動変更追跡を無効にし、手動で増分ポピュレーションを開始し、私の人生に進みました。

その間、私が追跡するのに苦労していた別のやっかいなエラーがありました。定期的にWebサイトはDB接続エラーをスローします:

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

これらの問題はどちらも同じ解決策であることがわかりました。自動クローズと呼ばれるデータベース設定をオフにするだけで済みました。これを行うには、データベースを右クリックして[プロパティ]をクリックします。プロパティウィンドウで[オプション]を選択し、[自動クローズ]をfalseに設定します。

Database Properties Window

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

皆様のご協力に感謝いたします。それは有り難いです!

6
Jargs

フルテキストパフォーマンスのためのBOLのトラブルシューティング手順を実行した場合は、興味があります- http://technet.Microsoft.com/en-us/library/ms142560.aspx

SQL Serverがすべてのメモリを消費していて、フィルターデーモンにメモリを割り当てさせていないので、ページファイルにデータをスワップする必要がある可能性が高いので、ユーザーの数は少なくなります。 SQLが使用できるメモリの量を制限する必要があります(現在のシステム仕様を考えると、約3GBと思います-FDHostとOSに1GBを残します)。

3
Brandon

これは、MSSQL2008用のテーブルがあるすべてのテーブルの完全なインデックスを再構築および設定するためにカーソルを使用して作成したスクリプトです。これは、MSSQL 2000サーバーからデータベースが移行された実稼働環境で機能します。変更の追跡をオフにし、このストアドプロシージャをSQL Serverエージェント経由で実行しました。 Expressを使用している場合は、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

誰もがカーソルを必要としないメソッドを持っていますか?

2
Craig Efrein

通常は、トリガーを使用してフルテキストカタログを更新することをお勧めします。それは私がmssqlで使用するアプローチですが、私の場合、トリガーを使用するソリューションに導くいくつかの特定の要件を持つローカライズされたアプリケーションがあるため、そのソリューションは2年前から100%機能します。

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

0
Rui Marques

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

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

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

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

ALTER FULLTEXT INDEX ON dbname.dbo.tablename
START FULL POPULATION;
0
MacGyver