2009-06-01 5 views
3

У нас есть полный текстовый индекс на довольно большой таблице из 633 569 записей. Индекс перестраивается с нуля как часть плана обслуживания каждый вечер, после того, как группа DTS-пакетов запускает удаление/вставку записей. Большие фрагменты данных удаляются, затем вставляются (чтобы следить за обновлениями и вставками), поэтому инкрементное индексирование не является возможным. Изменение пакетов только при необходимости не является невозможным, так как это устаревшее приложение, которое в конечном итоге будет заменено.MS-SQL Server 2000 медленная полнотекстовая индексация

FTI включает в себя два столбца - один varchar (50) не null и знак varchar (255) null.

В столбце первичного ключа есть кластерный индекс, который является только столбцом идентификации. Также имеется комбинированный индекс для столбца с целым числом и столбца varchar (50), упомянутого выше. Этот последний индекс был добавлен по соображениям производительности.

Проблема в том, что переиндексация болезненно медленная - около 8 часов.

Сервер довольно надежный (двухпроцессорный, 4 ГБ оперативной памяти), и все быстро выходит за рамки этой переиндексации.

Любые советы о том, как ускорить это?

UPDATE

Наш клиент имеет доступ к ящику SQL. Оказывается, они включили отслеживание изменений на столе, которое является частью полного текстового индекса. Мы отключили это, и полное население заняло менее 3 часов. Тем не менее, не большой, но лучше, чем 8.

UPDATE 2

ИУР снова принимает ~ 8 часов, чтобы заселить.

ответ

3

Индексирование SQL Server происходит медленно в первую очередь из-за его асинхронной схемы извлечения данных.

  • Используйте отслеживание изменений с помощью «update index in background».

Самый простой способ повысить производительность полнотекстовой индексации - использовать отслеживание изменений с опцией «update index in background». Когда вы индексируете таблицу (FTI, например «стандартные» индексы SQL, работает на для каждой таблицы), вы указываете полное население, прирост населения или отслеживание изменений. Когда вы выбираете полную совокупность, каждая строка в таблице, в которой вы выполняете полнотекстовую индексацию, извлекается и индексируется. Это двухэтапный процесс.

Во-первых, вы (или Enterprise Manager) запустить эту систему хранимую процедуру:

sp_fulltext_getdata CatalogID, object_id 

После всех результатов наборов всех меток времени и значений PK возвращаются MSSearch, MSSearch выпустит еще один sp_fulltext_getdata, но на этот раз, раз для каждой строки в вашей таблице. Итак, если у вас 50 миллионов строк в вашей базе данных, эта процедура будет выдана 50 миллионов раз.

С другой стороны, если вы используете добавочное население, MSSearch будет выдавать начальное:

sp_fulltext_getdata CatalogID, object_id 

для каждой строки в таблице, что ты полнотекстового индексирования. Поэтому, если у вас 50 миллионов строк в вашей базе данных, это заявление также будет выпущено 50 миллионов раз. Зачем?Поскольку даже с инкрементальной совокупностью MSSearch должен точно определить, какие строки были изменены, обновлены и удалены. Еще одна проблема с приростными популяциями заключается в том, что они индексируют или переиндексируют строку, даже если изменение было сделано в столбце, что вы не являетесь полнотекстовой индексацией.

Хотя инкрементное население, как правило, быстрее, чем полное население, вы можете видеть, что для больших таблиц либо потребуется много времени.

Я рекомендую вам включить отслеживание изменений с фоновым или плановым обновлением. Если вы это сделаете, вы увидите, что MSSearch будет первой выпустить еще:

sp_fulltext_getdata CatalogID, object_id 

для каждой строки в таблице с отслеживанием изменений enabled.Then, для каждой строки, которая имеет столбец, что вы полнотекстовое индексирование и это изменено после вашего первоначального полного населения, информация о строке будет записана (в индексируемой базе данных) в таблицу sysfulltextnotify. Затем MSSearch выдаст следующее только для строк, которые появляются в этой таблице, и затем удалит их из таблицы sysfulltextnotify.

  • Рассмотрит с помощью отдельного Build сервера

таблицы, которые сильно обновляется в то время как вы индексирование может создавать проблемы с блокировками, так что если вы можете жить с каталогом, который Периодически из даты и MSSearch который иногда недоступен, используйте отдельный сервер сборки. Вы делаете это, убедившись, что индексный сервер имеет копию таблицы для полнотекстового индексирования и экспорта каталога. Очевидно, что если вам нужны обновления в реальном времени или почти в реальном времени в вашем каталоге, это нехорошее решение

  • Предел активности, когда население работает

когда население бежит, не запускайте Profiler, и ограничить другую деятельность базы данных в максимально возможной степени. Profiler потребляет значительные ресурсы.

  • Увеличение числа потоков для процесса индексации

Увеличение числа потоков выполнявшимися для процесса индексации. Значение по умолчанию - всего пять, а на квадрантах или в 8 направлениях вы можете увеличить это до более высоких значений. Тем не менее, MSSearch будет дросселировать, если это слишком много данных из SQL Server, поэтому избегайте делать это в одно- или двухпроцессорных системах.

  • Остановить любое антивирусное или открытое программное обеспечение резервного копирования файлов-агентов .

Если это невозможно, постарайтесь, чтобы предотвратить их от сканирования временных каталогов, используемый SQL FTI и каталог каталогами

  • Места каталога, темп каталог и файлов подкачки на своих собственных контроллерах

Если вы можете сделать это вложение. Добавьте каталог на свой собственный контроллер, желательно на массив RAID-1. Добавьте каталог temp в массив RAID-1. Аналогичным образом рассмотрим возможность размещения файла подкачки на собственном массиве RAID-1 со своим собственным контроллером.

  • Рассмотрим создание вторичных данных файлы для Temp DB - 1 раз в CPU/ Core.
+0

Благодарим вас за тщательный ответ. Я немного поработаю над этим и отчитаюсь. Все еще не уверен, как это может занять менее 5 минут на sql 2005 с меньшим количеством аппаратного обеспечения. – ScottE

+0

В SQL 2005 существует специальная служба индексирования, которая работает непосредственно с SQL Serrver. Это ускоряет полнотекстовые операции и изолирует SQL Server от изменений в службе поиска, сделанных другими приложениями. Реальная архитектура механизма полнотекстового сбора и улучшения стратегии слияния индексов улучшили производительность индексирования в 2005 году.Например, на том же оборудовании с тем же набором данных построение полнотекстового индекса на 20 миллионов строк текстовых данных на основе символов заняло примерно 14 дней в SQL Server 2000, тогда как в SQL Server 2005 тот же индекс потребовал меньше чем 10 часов. – Raj

+0

копия, вставленная с https://msdn.microsoft.com/en-us/library/aa175787(v=sql.80).aspx – Alex

1
  • У вас достаточно оперативной памяти?

  • Каковы ваши места размещения в файловом хранилище с точки зрения конфигурации RAID?

  • Вы видите высокую активность tempDB?

(BTW, полмиллиона записей не велик, это даже не средний ...;))

+0

4Гб ОЗУ я проверить на рейд - какие repurcussions здесь? temp db - Я также проверю это. – ScottE

+0

RAID 5 с данными/записью на один раздел и FTI на другой раздел. – ScottE

+0

, так что вы говорите, что данные и файл журнала находятся на одном разделе RAID 5? –

0

Попробуйте положить индекс на отдельном физическом диске, чем в базе данных.

EDIT: Скотт сообщает, что это уже случай.

+0

@ Joshua: Я бы этого не сделал, пока не определил проблему ... –

0

Является ли система автономной, когда вы делаете reindex или живете?

Это единственные элементы в вашем полном текстовом каталоге; если нет, вы можете захотеть отделить их от остальной части ваших данных FTS. (Может также помочь с мониторингом). В индексе есть столбец идентификатора, настроенный как уникальный ключ?

Можете ли вы количественно оценить большие количества изменений? Существует 3 основных варианта репопуляции; Возможно, вам захочется попробовать переключиться на полный или инкрементный, так как вам может быть лучше, чем тот, который вы используете сейчас. По моему опыту, приращение работает хорошо, если изменения в общей БД составляют менее 40% (имели аналогичную проблему при больших данных, поступающих в базу данных.) Если> 40% изменить, то, скорее всего, лучше (по моему опыту - я индексирую документы, чтобы он мог работать по-другому для вас). Третий вариант, который вы, возможно, захотите рассмотреть, попробуйте отслеживание изменений с параметром reindex с запланированным обновлением.

Если вы можете взять сервер в автономном режиме для пользователей, то какие настройки производительности у вас есть при запуске FTS во время переиндексации? Вы можете проверить вкладку Свойства/Производительность Полнотекстового поиска - Использование системного ресурса в качестве слайдера (предположим, что есть 4 или 5 позиций). Вероятно, есть системный процесс, чтобы изменить это, не знаю, и больше нет машины 2000.

FTS/Reindexing любит баран и много его; общее эмпирическое правило имеет виртуальную память 3x - физическую память; если у вас несколько физических дисков, тогда создайте несколько файлов Pagefile.sys, так что каждый файл Pagefile.sys будет помещен на его собственный физический диск. Вы на NT или Windows 2000? убедитесь, что расширенная память на 2gb настроена правильно.

+0

- Это веб-приложение, поэтому система должна оставаться в сети. Однако, если в автономном режиме ускорить процесс, скажем, 15 минут, то мы можем оправдать его в автономном режиме в середине ночи. – ScottE

+0

Изменения могут приблизиться к 100% - таблица заполняется из бэк-офисной системы, которая не может помещает элементы как обновленные, поэтому требуется удалить [re] insert – ScottE

+0

Мы запускаем окна 2000. И да, это единственная таблица в каталоге. Мне нужно снова проверить диски - у меня такое ощущение, что каталог может находиться на разделе, а не на физическом диске. – ScottE

0

Запрет нулей в столбце, который в настоящее время не может ускорить индекс, но в моем опыте является лучшей практикой, особенно для целей индексирования. Единственными столбцами, которые я могу оправдать разрешающими значениями, являются столбцы даты.

0

Адрес checklist of parameters for FT-indexing performance on SQL Server. Большинство из них уже цитируются и проверяются здесь. Я не считаю, один из них на ваши комментарии, хотя:

Настройка памяти сервера SQL Server MAX должен быть установлен вручную (динамическое распределение памяти выключен), так что достаточно виртуальной памяти остается для полнотекстового Служба поиска для запуска. Чтобы достичь этого, выберите настройку MAX SERVER MEMORY, которая когда-то была установлена, оставляет достаточно виртуальной памяти, чтобы служба полнотекстового поиска могла получить доступ к количеству виртуальной памяти, равному 1,5 раз большему количеству физической памяти на сервере. Для достижения этой цели потребуется несколько проб и ошибок.

Смежные вопросы