2015-06-19 21 views
16

Zastanawiałem się, co było najlepsze praktyki dotyczące podejmowania zapytanie SQL z wartością dynamiczną, powiedzmy, że mam wartości (nvarchar (max))SQL Server i wydajność dla dynamicznych wyszukiwań

wartość: „912345678 "

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

wartość: "Michael"

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

o wartości: "Numer budynku 10"

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

This approuches są nieco powolny ponieważ wyszukiwaniu numeru, który ma 9 cyfr byłoby szybciej bez% jak to

select * from AllData 
where Number like '912345678' 

używam do EDMX do nawiązać połączenie z zewnętrzną bazą danych w języku C#, na przykład:

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(); 

Jak mogę zwiększyć wydajność?

+1

Twoje wszystkie warunki są takie same. 'SqlFunctions.PatIndex ("% "+ Przykład.ToLower() +"% ", x.Nazwa.ToString() ToLower())> 0)' – Amit

+1

'wybierz * z AllData gdzie Liczba jak '912345678'' jest równa 'wybierz * z AllData gdzie Number = '912345678'', więc zawsze będzie szybciej. – Max

+0

@Amit sorry sorry my bad, zaktualizowałem warunki. – BrunoMartinsPro

Odpowiedz

13

Wyszukiwanie przy użyciu symboli wieloznaczkowych na tych varchar/nvarchar polach będzie się powtarzać nad każdą postacią, mniej więcej, dla rekordów spełniających kryteria.

Wielki (! I szybki) rozwiązaniem dla tego rodzaju poszukiwań jest:

  1. Zrób pełny katalog do przechowywania indeksów pełnotekstowych.
  2. Umieść fulltext index na kolumnach w każdej tabeli, którą musisz przeszukać.
  3. Użyj słowa kluczowego CONTAINS podczas wyszukiwania zamiast symboli wieloznacznych.

Wspomniałeś, że szukasz wiarygodnych źródeł, here to dobra lektura.

+1

Jeśli chcesz wyszukać ciąg w ciągu znaków, wykonujesz wyszukiwanie pełnotekstowe. Biorąc pod uwagę to, co do tej pory ułożyłeś, prawidłową rzeczą jest standardowa implementacja wyszukiwania pełnotekstowego. – jerrylagrou

2

Jeśli używanie LIKE i PATINDEX nie zapewniło Ci wymaganej wydajności, prawdopodobnie powinieneś napisać sp, który będzie używał FTS.

2

Aby wyszukać z „jak” w EF można używać Zawiera():

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

Ale z tego rodzaju poszukiwań nigdy nie będzie osiągnąć dobre wyniki. Musisz zmienić sposób wyszukiwania lub przechowywania danych w bazie danych. Na przykład, jeśli jesteś pewien, że użytkownik szukał nazwy, możesz wyszukiwać tylko w kolumnie "nazwa".

Powiązane problemy