Las consultas de actualización son más lentas después de habilitar el índice de texto completo de SQL Server

10

Tengo un sitio web asp.net con muchas consultas de inserción, actualización y eliminación que se ejecutan en mi base de datos.

Hace unos días creé un índice de texto completo en dos columnas de una de las tablas. Después de eso, me di cuenta de que cuando el sitio web ejecuta consultas de actualización en esa tabla, el uso de memoria y disco del Proceso de SQL Server se dispara y las actualizaciones son más lentas. Las consultas se ejecutaron sin problemas de rendimiento antes de crear el índice de texto completo.

También me di cuenta de que las consultas de actualización que antes eran muy simples, ahora son complicadas, ya que el plan de ejecución ahora tiene cosas como la actualización del índice de texto completo. Esto es parte de un nuevo plan de ejecución que se volvió complicado después de habilitar el texto completo:

ingrese la descripción de la imagen aquí

En algunas horas, cuando actualizo el contenido del sitio, ejecuté 5000 consultas de actualización y creo que el proceso de indexación de texto completo se realiza cada vez para cada fila.

¿Debo deshabilitar el escaneo de texto completo al inicio de la actualización de filas y luego volver a habilitarlo (como en esta pregunta relacionada )?

¿Puedo decirle a SQL Server que detenga la indexación de texto completo durante 5 minutos y luego comience a indexar nuevos datos?

¿Hay alguna alternativa mejor? Estoy usando SQL Server 2012.

Mohammad Ha
fuente

Respuestas:

2

En mi caso, tuve que cambiar una declaración de ACTUALIZACIÓN ineficiente:

Antes de:

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

Después:

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

Este rendimiento mejorado de 4 minutos a 5 segundos. El problema era que solía actualizar todas las filas, incluso si ya tenían el valor que quería asignar.

Fabian
fuente
1

Si lo detiene (lo deshabilita), el índice no estará disponible para consultas que lo usen.

Sin embargo, puede configurar el seguimiento de cambios en 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

Puede verificar el valor actual con esta consulta:

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

Las opciones válidas son: SET CHANGE_TRACKING {MANUAL | AUTO | OFF}

Especifica si SQL Server propagará los cambios (actualizaciones, eliminaciones o inserciones) en las columnas de la tabla que están cubiertos por el índice de texto completo al índice de texto completo. Los datos cambian WRITETEXTy UPDATETEXTno se reflejan en el índice de texto completo, y no se recogen con el seguimiento de cambios.

Consulte la documentación de Microsoft para ALTERAR ÍNDICE FULLTEXT (Transact-SQL) .

Julien Vavasseur
fuente