Domanda

Abbiamo un sacco di query che "cercano" clienti, clienti, ecc.Puoi effettuare la ricerca per nome, email, ecc.Utilizziamo le istruzioni LIKE nel modo seguente:

SELECT * 
FROM customer 
WHERE fname LIKE '%someName%'

L'indicizzazione del testo completo è utile in questo scenario?Stiamo utilizzando SQL Server 2005.

È stato utile?

Soluzione

Dipenderà dal tuo DBMS.Credo che la maggior parte dei sistemi non trarrà vantaggio dall'indice full-text a meno che non si utilizzino le funzioni full-text.(per esempio. PARTITA/CONTRO in mySQL o FREETEXT/CONTAINS in MS SQL)

Ecco un buon articolo su quando, perché e come utilizzare l'indicizzazione di testo completo in SQL Server: Comprendere l'indicizzazione di testo completo di SQL Server

Altri suggerimenti

FTS Potere aiuto in questo scenario, la domanda è se ne valga la pena o no.

Per cominciare, vediamo perché LIKE potrebbe non essere la ricerca più efficace.Quando usi LIKE, soprattutto quando stai cercando con a % all'inizio del confronto, SQL Server deve eseguire sia una scansione della tabella di ogni singola riga E un controllo byte per byte della colonna che stai controllando.

FTS ha alcuni algoritmi migliori per la corrispondenza dei dati così come alcune statistiche migliori sulle variazioni dei nomi.Pertanto FTS può fornire prestazioni migliori per la corrispondenza di Smith, Smythe, Smithers, ecc. quando cerchi Smith.

Tuttavia, è un po' più complesso utilizzare FTS, poiché dovrai padroneggiarlo CONTAINS contro FREETEXT e il formato arcano della ricerca.Tuttavia, se desideri eseguire una ricerca in cui FName o LName corrispondono, puoi farlo con un'istruzione anziché con OR.

Per determinare se FTS sarà efficace, determina quanti dati hai.Utilizzo FTS su un database di diverse centinaia di milioni di righe e questo è un vero vantaggio rispetto alla ricerca LIKE, ma non lo uso su tutti i tavoli.

Se la dimensione della tabella è più ragionevole, inferiore a pochi milioni, puoi ottenere una velocità simile creando un indice per ogni colonna su cui effettuerai la ricerca e SQL Server dovrebbe eseguire una scansione dell'indice anziché una scansione della tabella.

Secondo il mio scenario di prova:

  • SQLServer2008
  • 10.000.000 righe ciascuna con una stringa come "WordA Wordb Wordc ..." (varia tra 1 e 30 parole)
  • selezionando count(*) con CONTAINS(colonna, "parolaB")
  • la dimensione dei risultati è di diverse centinaia di migliaia
  • dimensione del catalogo circa 1,8 GB

L'indice del testo completo era nell'intervallo di 2 secondi mentre come '% parolaB %' era nell'intervallo di 1-2 minuti.

Ma questo conta solo se non utilizzi criteri di selezione aggiuntivi! Per esempio.se ne usassi qualcuno "come 'prefisso%'" inoltre, su una colonna di chiave primaria, le prestazioni erano peggiori poiché l'operazione di accesso all'indice full-text costa di più che eseguire una ricerca per stringa in alcuni campi (purché non siano eccessivi).

Quindi consiglierei l'indice full-text soltanto nei casi in cui è necessario effettuare una "ricerca libera di stringhe" o utilizzare alcune delle sue funzionalità speciali...

Per rispondere alla domanda in modo specifico per MSSQL, verrà utilizzata l'indicizzazione del testo completo NON aiuto nel tuo scenario.

Per migliorare quella query puoi effettuare una delle seguenti operazioni:

  1. Configurare un catalogo full-text sulla colonna e utilizzare la funzione CONTAINS().
  2. Se stavi cercando principalmente con un prefisso (ad es.corrispondente dall'inizio del nome), potresti modificare il predicato nel seguente e creare un indice sulla colonna.

    dove fname come 'prefisso%'

(1) è probabilmente eccessivo per questo, a meno che le prestazioni della query non costituiscano un grosso problema.

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