2010-07-09 21 views
36

Mam sytuację, w której chciałbym wyszukać pojedyncze słowo.Wydajność podobnego zapytania "% Zapytanie%" a wyszukiwanie pełnotekstowe ZAWIERA zapytanie

Dla tego scenariusza, które zapytanie byłoby dobre z punktu widzenia wydajności?

Select Col1, Col2 from Table Where Col1 Like '%Search%' 

lub

Select Col1, Col2 from Table Where Col1 CONTAINS(Col1,'Search') 

?

+0

Chciałbym również wiedzieć: jaka jest względna wydajność zapytania przy użyciu 'REGEXP' w tym samym celu? – JYelton

+1

Jaka baza danych? Będą miały zupełnie inne cechy wydajności w różnych bazach danych. – Oded

+0

@Oded: MS-SQL Server i MySQL to dwa, których używam najbardziej. Na potrzeby tego pytania zakładam, że SQL Server jest najbardziej interesujący. – JYelton

Odpowiedz

36

Wyszukiwanie pełnotekstowe (przy użyciu ZAWIERA) będzie szybsze/wydajniejsze niż użycie LIKE z symbolem wieloznacznym. Wyszukiwanie pełnotekstowe (FTS) obejmuje możliwość definiowania indeksów pełnotekstowych, z których FTS może korzystać. Dunno, dlaczego nie zdefiniowałbyś indeksu FTS, gdybyś chciał użyć tej funkcji ...

JAK z symbolem wieloznacznym po lewej stronie (IE: LIKE '%Search') nie można użyć indeksu (zakładając, że istnieje dla kolumny), gwarantuje skanowanie tabeli. Nie testowałem porównywalnej wersji &, ale regex ma tę samą pułapkę. Aby wyjaśnić, można użyć , a nie używać tego samego indeksu; LIKE 'Search%' można użyć indeksu.

+4

W MS SQL Server wymagany jest pełny indeks tekstowy używać ZAWIERA. –

+1

Czy to będzie szybsze niż wyszukiwarki pełnotekstowe, takie jak Lucene/Solr? Zwłaszcza w przypadku milionów rekordów. – Krunal

6

Dla typowej bazy danych wyszukiwanie ZAWIERA może być znacznie szybsze, zakładając, że odpowiedni indeks wyszukiwania pełnotekstowego jest zbudowany na przeszukiwanym polu. Ocena operatora LIKE zasadniczo nie używa indeksu i dlatego musi odczytać wszystkie dane.

-1

Podobnie jak w przypadku wyszukiwania w tabeli samodzielnie, zabije wydajność. Lepiej stosować jak wyszukiwanie na CTE.

+0

spróbuj poniżej adresu URL http://stackoverflow.com/questions/1569002/how-can-i-optimize-refactor-a-tsql-like-clause/32329298#32329298 – Agrawars