2009-11-26 2 views
0

Я создал индексированный вид:полнотекстового индекса производительности населения на индексированного представления 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 с пакетом обновления 3 она принимает навсегда для заполнения полнотекстового индекса на этой точке зрения, так как полный -text индексирование выполняет следующий запрос для каждой строки в представлении:

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

ответ

1

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

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

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

+0

Я использовал ваше второе предложение, которое в основном обновлено вручную индексированным представлением - создало отдельную таблицу (с той же структурой, что и индексированное представление), которая каждые 10 минут обновляется новыми строками из реальной таблицы. –

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