Производительность полнотекстового индекса в индексированном представлении SQL 2005 - PullRequest
0 голосов
/ 26 ноября 2009

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

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 или имеет очень короткое текстовое значение).

1 Ответ

1 голос
/ 26 ноября 2009

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

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

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

...