Производительность заполнения полнотекстового индекса в индексированном представлении SQL 2005

Я создал индексированное представление:

CREATE VIEW LogValueTexts WITH SCHEMABINDING AS
SELECT ISNULL(LRVS_SLOG_ID*256+LRVS_IDX,0) AS ID,LRVS_VALUE AS Value
FROM dbo.LRVS_LogRecordedValues WHERE LEN(LRVS_VALUE)>4

CREATE UNIQUE CLUSTERED INDEX IX_LogValueTexts ON LogValueTexts (ID)

В SQL 2005 Standard SP3 заполнение полнотекстового индекса в этом представлении занимает вечность, поскольку при полнотекстовом индексировании выполняется следующий запрос для каждой строки в представлении:

SELECT COLUMN FULLTEXTALL FROM[dbo].[LogValueTexts] WHERE COLUMN FULLTEXTKEY = @p1

Я предполагаю, что COLUMN FULLTEXTALL и COLUMN FULLTEXTKEY на самом деле Value и ID, но это то, что показывает SQL Server Profiler. Проблема в том, что план запроса использует сканирование кластеризованного индекса по примерно 11 миллионам строк / 1 ГБ данных, потому что он не использует индекс в представлении. Я попытался создать руководство по плану для этого запроса, но, поскольку это не стандартный запрос T-SQL, он не позволяет (Incorrect syntax near the keyword 'FULLTEXTKEY').

Есть ли способ заставить этот полнотекстовый индекс работать, кроме:

  • обновление до SQL 2008 (или SQL 2005 Enterprise), где он работает нормально.
  • создание уникального идентификатора и индекса покрытия для базовой таблицы.

Обновление потребует простоя на сервере и, вероятно, новых лицензий SQL Server при создании уникального идентификатора и покрывающего индекса будет тратить много места, потому что только подмножество 11M строк требует полнотекстового индексирования (LRVS_VALUE часто NULL или имеет очень краткое текстовое значение).


person Pent Ploompuu    schedule 26.11.2009    source источник


Ответы (1)


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

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

Ваш последний вариант (и тот, на который вам нужно будет потратить некоторое время, чтобы разобраться) будет использовать секционированные таблицы. У вас может быть раздел, охватывающий данные, отфильтрованные в представлении. Полнотекстовый индекс всей таблицы; ваш запрос во время выполнения попадет в секционированную таблицу с соответствующими данными в ней.

person u07ch    schedule 26.11.2009
comment
Я использовал ваше второе предложение, которое в основном представляет собой обновленное вручную индексированное представление - создал отдельную таблицу (с той же структурой, что и индексированное представление), которая обновляется каждые 10 минут новыми строками из реальной таблицы. - person Pent Ploompuu; 07.12.2009