Індекс повного тексту 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
  • 4 Гб оперативної пам’яті
  • Windows Server 2008 R2 Enterprise SP1 x64
  • SQL Server 2008 R2 Express Edition з розширеними послугами x64

Відповіді:


6

Я нарешті знайшов причину своєї проблеми!

Месяцями я намагався відстежувати проблему, але нарешті відмовився, відключив автоматичне відстеження змін, просто вручну розпочав приріст населення та продовжив своє життя.

Тим часом сталася ще одна помилкова нудьга, що у мене виникли проблеми з відстеженням. Періодично веб-сайт видає помилку підключення до БД:

Неможливо відкрити базу даних "XXXX", яку вимагає вхід. Помилка входу. Помилка входу для користувача "XXXX".

Виявилося, що обидві ці проблеми мали однакове рішення. Все, що мені потрібно було зробити - це вимкнути налаштування бази даних під назвою Автозакрити. Для цього просто клацніть правою кнопкою миші базу даних та натисніть властивості. У вікні властивостей виберіть Опції та встановіть "Автоматичне закриття" на значення false.

Вікно властивостей бази даних

Як тільки я відключив функцію автоматичного закриття, проблеми з входом у БД відійшли, і автоматичне відстеження змін працювало чудово.

Ще раз дякую за допомогу усім. Я ціную це!


3

Цікаво, якщо ви пройшли етапи усунення несправностей у BOL для повнотекстової продуктивності - http://technet.microsoft.com/en-us/library/ms142560.aspx .

Я думаю, що SQL Server споживає всю вашу пам’ять і не дає демону фільтра мати, тому ваше населення повільно, оскільки, швидше за все, доведеться поміняти речі на файл сторінки. Ви повинні обмежити об'єм пам'яті, який може використовувати SQL (я б подумав десь близько 3 ГБ, враховуючи ваші поточні характеристики системи - це дозволило б залишити 1 Гб для FDHost та ОС).


голосування вгору @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, але в моєму випадку, тому що я локалізований додаток з декількома специфічними вимогами, які призводять мене до рішення за допомогою тригерів, що рішення працює на 100% починаючи з 2 років тому.

Перегляньте свою реалізацію на цьому прикладі .


Зараз мої індекси встановлені на автоматичне відстеження змін. Я читав, що зміна його на посібник та використання тригерів насправді може спричинити проблеми, коли одна людина вставляє або оновлює запис у індексованій таблиці до того, як запущене оновлення індексу з попереднього оновлення таблиці ще не закінчилося. Здається, автоматичне відстеження змін має спрацювати ... тим більше, що у мене не так багато записів у моїх таблицях.
Jargs

Я переглянув налаштування на прикладі наведеного вами прикладу, але, здається, все в порядку. Я навіть спробував відновити встановлення SQL Server, але проблема залишається.
Jargs

1
Я не знаю, чи це пов’язано, але колись у мене виникли проблеми з повноцінною популяцією через проблеми Word Breaker. Якщо ви відкриєте SSMS і оберіть Зберігання під вашою базою даних, клацніть правою кнопкою миші повний текстовий каталог Перейдіть до Таблиць / Переглядів і подивіться на мову для Word Breaker. Чи є стовпці, які використовують різні мови для вимикачів слів? Я помітив, що якщо ви маєте різні мови для Word Breakers в одній таблиці, населення не працює. Можливо, не пов'язане, але хто знає?
Крейг Ефрейн

0

Не впевнені, яка першопричина у вашій ситуації, але це може статися після того, як відбувається резервне копіювання. Не впевнений, що це відбувається у вашому випадку чи чим ця таблиця відрізняється від інших. Тепер ти мені цікавий. Увімкнено реплікацію SQL?

Для тимчасового виправлення я виконуватиму "Сканування" (населення) на столі, коли це станеться.

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

Використовуйте цей код:

ALTER FULLTEXT INDEX ON dbname.dbo.tablename
START FULL POPULATION;
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.