私たちのウェブサイトには、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
これは、クエリを実行したときに表示されるものです(フルサイズの場合はクリックしてください):
インデックス付きテーブルの最新のレコードは決して完了せず、検索できません。テーブルにはあまりデータがありませんが、インデックス作成が完了するまで数日待ちましたが、何も変更されていません。
インデックス作成を正常に完了するための唯一の方法は、カタログを再構築するか、すべてのインデックスを削除して再作成することです。
私がそれをするたびに、最初の新しいレコードが追加されるとすぐに同じ問題が戻ってきます。
念のため、サーバーの統計を以下に示します。
ようやく問題の原因を発見!
私は問題を追跡するために何ヶ月も試してみましたが、最終的にあきらめ、自動変更追跡を無効にし、手動で増分ポピュレーションを開始し、私の人生に進みました。
その間、私が追跡するのに苦労していた別のやっかいなエラーがありました。定期的にWebサイトはDB接続エラーをスローします:
ログインで要求されたデータベース「XXXX」を開けません。ログインに失敗しました。ユーザー「XXXX」のログインに失敗しました。
これらの問題はどちらも同じ解決策であることがわかりました。自動クローズと呼ばれるデータベース設定をオフにするだけで済みました。これを行うには、データベースを右クリックして[プロパティ]をクリックします。プロパティウィンドウで[オプション]を選択し、[自動クローズ]をfalseに設定します。
自動クローズを無効にするとすぐに、DBログインの問題がなくなり、自動変更追跡は完全に機能しました。
皆様のご協力に感謝いたします。それは有り難いです!
フルテキストパフォーマンスのためのBOLのトラブルシューティング手順を実行した場合は、興味があります- http://technet.Microsoft.com/en-us/library/ms142560.aspx 。
SQL Serverがすべてのメモリを消費していて、フィルターデーモンにメモリを割り当てさせていないので、ページファイルにデータをスワップする必要がある可能性が高いので、ユーザーの数は少なくなります。 SQLが使用できるメモリの量を制限する必要があります(現在のシステム仕様を考えると、約3GBと思います-FDHostとOSに1GBを残します)。
これは、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
誰もがカーソルを必要としないメソッドを持っていますか?
通常は、トリガーを使用してフルテキストカタログを更新することをお勧めします。それは私がmssqlで使用するアプローチですが、私の場合、トリガーを使用するソリューションに導くいくつかの特定の要件を持つローカライズされたアプリケーションがあるため、そのソリューションは2年前から100%機能します。
これに対して実装を確認してください 例 。
あなたの状況の根本的な原因がわからないが、これはバックアップの発生後に発生する可能性があります。それがあなたのケースで何が起こっているのか、そのテーブルが他のテーブルとどのように異なるのかはわかりません。今あなたは私に好奇心を持っています。 SQLレプリケーションがオンになっていますか?
一時的な修正として、これが発生したときにテーブルで「クロール」(母集団)を実行します。
http://msdn.Microsoft.com/en-us/library/ms142575(v = sql.105).aspx
このコードを使用してください:
ALTER FULLTEXT INDEX ON dbname.dbo.tablename
START FULL POPULATION;