Le query di aggiornamento sono più lente dopo l'attivazione dell'indice full-text di SQL Server


10

Ho un sito Web asp.net con molte query di inserimento, aggiornamento ed eliminazione in esecuzione sul mio database.

Qualche giorno fa creo un indice full-text su due colonne di una delle tabelle. Dopo di che mi sono reso conto che quando il sito Web esegue query di aggiornamento su quella tabella, l'utilizzo della memoria e del disco del processo di SQL Server sta saltando e gli aggiornamenti sono più lenti. Le query sono state eseguite senza problemi di prestazioni prima di creare l'indice full-text.

Mi sono anche reso conto che le query di aggiornamento che erano molto semplici in precedenza, ora sono complicate, poiché il piano di esecuzione ora include elementi come l'aggiornamento dell'indice di testo completo. Questa è una parte di un nuovo piano di esecuzione che è diventato complicato dopo aver abilitato il full-text:

inserisci qui la descrizione dell'immagine

In alcune ore quando aggiorno i contenuti del sito, ho eseguito 5000 query di aggiornamento e penso che il processo di indicizzazione del testo completo venga eseguito ogni volta per ogni riga.

Devo disabilitare la scansione del testo completo all'avvio dell'aggiornamento delle righe e quindi riattivarla (come in questa domanda correlata )?

Posso dire a SQL Server di interrompere l'indicizzazione full-text per 5 minuti e quindi iniziare a indicizzare nuovi dati?

C'è qualche alternativa migliore? Sto usando SQL Server 2012.

Risposte:


2

Nel mio caso ho dovuto modificare un'istruzione UPDATE inefficiente:

Prima:

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

Dopo:

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

Questa prestazione migliorata da 4 minuti a 5 secondi. Il problema era che usavo aggiornare tutte le righe, anche se avevano già il valore che volevo assegnare.


1

Se lo interrompi (disabilitalo), l'indice non sarà disponibile per le query che lo utilizzano.

Tuttavia, puoi impostare il rilevamento delle modifiche su manuale:

--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

È possibile verificare il valore corrente con questa query:

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

Le opzioni valide sono: SET CHANGE_TRACKING {MANUAL | AUTO | OFF}

Specifica se le modifiche (aggiornamenti, eliminazioni o inserimenti) apportate alle colonne della tabella coperte dall'indice full-text verranno propagate da SQL Server all'indice full-text. I dati cambiano WRITETEXTe UPDATETEXTnon si riflettono nell'indice full-text e non vengono raccolti con il rilevamento delle modifiche.

Vedere la documentazione Microsoft per ALTER FULLTEXT INDEX (Transact-SQL) .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.