Производительность полнотекстового индекса в индексированном представлении 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
или имеет очень короткое текстовое значение).
1 ответ
Я не знаю ваших данных; почему вы не можете поместить полный текстовый указатель на исходную таблицу? Вы можете добавить вычисляемый столбец в структуру таблицы. Таким образом, у вас не будет операции перестроения индекса (я думаю, что это причина вашего сканирования)
Если вы не можете этого сделать, то следующим самым простым изменением, вероятно, будет создание таблицы поиска, заполненной символом sp или триггером, чтобы вы могли изменить индексирование таблицы, чтобы оно имело смысл для вашего запроса.
Ваш последний вариант (и тот, на который вам нужно потратить некоторое время, чтобы получить право) будет использовать разделенные таблицы. Вы могли бы иметь раздел, который покрывает данные, отфильтрованные в представлении. Полнотекстовая индексация всей таблицы; Ваш запрос во время выполнения попадет в секционированную таблицу с соответствующими данными в ней.