Atualizar consultas mais lentamente após ativar o Índice de Texto Completo do SQL Server

10

Eu tenho um site asp.net com muitas consultas de inserção, atualização e exclusão em execução no meu banco de dados.

Alguns dias atrás, crio um índice de texto completo em duas colunas de uma das tabelas. Depois disso, percebi que, quando o site executa consultas de atualização nessa tabela, o uso de memória e disco do SQL Server Process está aumentando e as atualizações são mais lentas. As consultas foram executadas sem problemas de desempenho antes da criação do índice de texto completo.

Eu também percebi que as consultas de atualização que eram muito simples antes, agora são complicadas, pois o plano de execução agora possui itens como atualização do índice de texto completo. Isso faz parte de um novo plano de execução que ficou complicado após a ativação do texto completo:

insira a descrição da imagem aqui

Em algumas horas, quando atualizo o conteúdo do site, executei 5000 consultas de atualização e acho que o processo de indexação de texto completo é feito a cada vez para cada linha.

Devo desativar a verificação de texto completo no início da atualização de linhas e depois reativá-la (como nesta pergunta relacionada )?

Posso dizer ao SQL Server para parar a indexação de texto completo por 5 minutos e começar a indexar novos dados?

Existe alguma alternativa melhor? Estou usando o SQL Server 2012.

Mohammad Ha
fonte

Respostas:

2

No meu caso, tive que alterar uma instrução UPDATE ineficiente:

Antes:

UPDATE Customer 
SET Rating = 'Not Rated'
WHERE ...

Depois de:

UPDATE Customer
SET Rating = 'Not Rated'
WHERE ...
AND Rating <> 'Not Rated' -- THIS LINE WAS INSERTED

Isso melhorou o desempenho de 4 minutos para 5 segundos. O problema era que eu costumava atualizar todas as linhas, mesmo que elas já tivessem o valor que eu queria atribuir.

Fabian
fonte
1

Se você o interromper (desativá-lo), o índice não estará disponível para consultas sobre ele.

No entanto, você pode definir o acompanhamento de alterações como manual:

--disable automatic change tracking
ALTER FULLTEXT INDEX ON schema.table SET CHANGE_TRACKING MANUAL
GO

--run the update statement here

--re-enable automatical change tracking after updating it to reflect the recent changes
ALTER FULLTEXT INDEX schema.table START UPDATE POPULATION
GO
ALTER FULLTEXT INDEX ON schema.table SET CHANGE_TRACKING AUTO
GO

Você pode verificar o valor atual com esta consulta:

SELECT TOP(10) change_tracking_state_desc, * 
FROM sys.fulltext_indexes 
WHERE object_name(object_id) = '...';

As opções válidas são: SET CHANGE_TRACKING {MANUAL | AUTO | OFF}

Especifica se as alterações (atualizações, exclusões ou inserções) feitas nas colunas da tabela que são cobertas pelo índice de texto completo serão propagadas pelo SQL Server para o índice de texto completo. Os dados são alterados WRITETEXTe UPDATETEXTnão são refletidos no índice de texto completo e não são captados com o rastreamento de alterações.

Consulte a documentação da Microsoft para ALTER FULLTEXT INDEX (Transact-SQL) .

Julien Vavasseur
fonte