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

StackOverflow https://stackoverflow.com/questions/1804851

Вопрос

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

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, а создание уникального идентификатора и покрывающего индекса потребует много места, поскольку только подмножество из 11 миллионов строк нуждается в полнотекстовой индексации (LRVS_VALUE часто NULL или имеет очень короткое текстовое значение).

Это было полезно?

Решение

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top