Domanda

Ho creato una vista indicizzata:

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)

Su SQL 2005 Standard SP3 ci vuole sempre per popolare un indice full-text su quella vista perché l'indicizzazione full-text esegue la seguente query per ogni riga nella vista:

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

Suppongo che COLUMN FULLTEXTALL e COLUMN FULLTEXTKEY siano in realtà Value e ID , ma questo è SQL Server Profiler mostra. Il problema è che il piano di query utilizza una scansione dell'indice cluster su circa 11 milioni di righe / 1 GB di dati perché non utilizza l'indice nella vista. Ho provato a creare una guida di piano per quella query, ma poiché non è una query T-SQL standard non lo consente ( Sintassi errata vicino alla parola chiave "FULLTEXTKEY" ).

Esiste un modo per far funzionare questo indice full-text diverso da:

  • aggiornamento a SQL 2008 (o SQL 2005 Enterprise) dove funziona correttamente.
  • creando un ID univoco e un indice di copertura nella tabella sottostante.

L'aggiornamento richiederebbe tempi di inattività sul server e probabilmente nuove licenze di SQL Server durante la creazione dell'ID univoco e un indice di copertura sprecare molto spazio perché solo un sottoinsieme delle righe 11M richiede l'indicizzazione full-text ( LRVS_VALUE è spesso NULL o ha un valore di testo molto breve).

È stato utile?

Soluzione

Non conosco i tuoi dati; perché non puoi mettere l'indice di testo completo sulla tabella originale? È possibile aggiungere la colonna calcolata nella struttura della tabella. In questo modo non avresti l'operazione di ricostruzione dell'indice (penso che sia la causa della tua scansione)

Se non riesci a farlo, è probabile che la prossima modifica più semplice crei una tabella di ricerca popolata con uno sp o un trigger in modo da poter modificare l'indicizzazione della tabella in modo che abbiano senso per la tua query.

La tua ultima opzione (e quella su cui dovresti dedicare un po 'di tempo per ottenere il giusto) sarebbe usare le tabelle partizionate. Si potrebbe avere una partizione che copre i dati filtrati nella vista. Indice di testo completo sull'intera tabella; la tua query in fase di esecuzione colpirà la tabella partizionata con i relativi dati.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top