2015-06-19 17 views
16

mi chiedevo quali fossero le migliori pratiche per la preparazione di una query in SQL con un valore dinamico, Diciamo che ho un valore (nvarchar (max))SQL Server e le prestazioni per le ricerche dinamiche

valore: "912.345.678 "

select * from AllData 
where Number like '%912345678%' 

valore: "Michael"

select * from AllData 
where Name like '%Michael%' 

valore: "Numero civico 10"

select * from AllData 
where Address like '%Street number 10%' 

Questo approuches sono un po 'lento in quanto la ricerca di un numero che ha 9 cifre sarebbe più veloce senza% come questo

select * from AllData 
where Number like '912345678' 

io uso un EDMX a effettuare una connessione a un database esterno in C#, come questo:

var Result = EDMXEntity.Entities.Where(x => 
(SqlFunctions.PatIndex("%" + Value.ToLower() +"%", x.Name.ToString().ToLower()) > 0) 
|| (SqlFunctions.PatIndex("%" + Value.ToLower() +"%", x.Number.ToString().ToLower()) > 0) 
|| (SqlFunctions.PatIndex("%" + Value.ToLower() +"%", x.Address.ToString().ToLower()) > 0)).Take(50).ToList(); 

Come posso aumentare le prestazioni?

+1

Tutte le condizioni sono uguali. 'SqlFunctions.PatIndex ("% "+ Example.ToLower() +"% ", x.Name.ToString(). ToLower())> 0)' – Amit

+1

'seleziona * da AllData dove Numero come '912345678'' è uguale a 'seleziona * da AllData dove Number = '912345678'' quindi sarà sempre più veloce. – Max

+0

@Ammarmi scusa, ho aggiornato le condizioni. – BrunoMartinsPro

risposta

13

Ricerche con caratteri jolly come questi su varchar/nvarchar i campi stanno per iterare su ogni carattere, più o meno, per i record che soddisfano la valutazione.

Un grande (! E veloce) opzione per questi tipi di ricerche è quello di:

  1. Fai un catalogo full-text per memorizzare gli indici full-text.
  2. Inserisci un fulltext index sulle colonne in ogni tabella che è necessario cercare.
  3. Utilizzare la parola chiave CONTAINS durante la ricerca anziché i caratteri jolly.

Hai menzionato la ricerca di fonti credibili, here è una buona lettura.

+1

Se vuoi cercare una stringa all'interno di una stringa, stai facendo una ricerca di testo completo. Dato ciò che hai esposto finora, la cosa corretta da fare è un'implementazione standard di una ricerca a testo integrale. – jerrylagrou

2

Se utilizzando LIKE e PATINDEX non si ottiene la prestazione necessaria, è probabile che si debba scrivere sp che utilizzerà FTS.

2

Per cercare con 'come' in EF è possibile utilizzare Contiene():

var Result = EDMXEntity.Entities.Where(
x => x.Name.Contains(Value) || 
x => x.Number.ToString().Contains(Value) || 
x => x.Address.Contains(Value)).Take(50).ToList(); 

Ma con questo tipo di ricerca non si sarà mai ottenere buone prestazioni. È necessario modificare il modo in cui si cercano o si memorizzano i dati nel DB. Ad esempio, se si è sicuri che l'utente stava cercando il nome, è possibile cercare solo nella colonna 'nome'.

Problemi correlati