Pergunta

Eu criei uma visão indexada:

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)

No SQL 2005 Standard SP3, é necessário uma eternidade para preencher um índice de texto completo nessa visualização, porque a indexação de texto completo executa a seguinte consulta para cada linha na visualização:

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

Eu assumo isso COLUMN FULLTEXTALL e COLUMN FULLTEXTKEY são realmente Value e ID, mas é isso que mostra o SQL Server Profiler. O problema é que o plano de consulta usa uma varredura de índice em cluster em cerca de 11 milhões de linhas/1 GB de dados porque não usa o índice na visualização. Eu tentei criar um guia de plano para essa consulta, mas como não é uma consulta T-SQL padrão, isso não permite (Incorrect syntax near the keyword 'FULLTEXTKEY').

Existe uma maneira de fazer com que este índice de texto completo funcione além de:

  • Atualizando para o SQL 2008 (ou SQL 2005 Enterprise), onde funciona bem.
  • Criando um ID exclusivo e um índice de cobertura na tabela subjacente.

A atualização exigiria o tempo de inatividade no servidor e provavelmente novas licenças de SQL Server, ao criar o ID exclusivo e um índice de cobertura, desperdiçaria muito espaço, porque apenas um subconjunto das linhas de 11m precisa de indexação de texto completo (LRVS_VALUE é frequente NULL ou tem um valor de texto muito curto).

Foi útil?

Solução

Eu não conheço seus dados; Por que você não pode colocar o índice de texto completo na tabela original? Você pode adicionar a coluna calculada à estrutura da sua tabela. Dessa forma, você não teria a operação de reconstrução do índice (acho que essa é a causa da sua varredura)

Se você não pode fazer isso, é provável que a próxima mudança mais fácil crie uma tabela de pesquisa preenchida com um SP ou um gatilho que você pode alterar a indexação da tabela para que eles façam sentido para sua consulta.

Sua opção final (e uma que você precisa gastar algum tempo para acertar) seria usar tabelas particionadas. Você pode ter uma partição que cobre os dados filtrados na visualização. Índice de texto completo a tabela inteira; Sua consulta no tempo de execução chegaria à tabela particionada com os dados relevantes nela.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top