W tym pytaniu ma ten sam problem co ja. Potrzebuję czegoś takiego:
select * from blablabla
where product
like '%rock%' or
like '%paper%' or
like '%scisor%' or
like '%car%' or
like '%pasta%'
Jest to brzydkie i nie używa indeksów. W takim przypadku jest to naprawdę jedyny sposób, aby to zrobić (aby wybrać wiele słów w ciągu), czy też powinienem użyć FULLTEXT?
Jak rozumiem, przy pomocy pełnego tekstu mogę wybrać wiele słów w ciągu.
sql-server
sql-server-2008-r2
full-text-search
Racer SQL
źródło
źródło
Odpowiedzi:
Indeksy pełnotekstowe na ogół nie są magiczną kulą i wymagają dodatkowej konserwacji, miejsca na dysku i dość ingerujących zmian we wzorcach zapytań.
O ile naprawdę nie potrzebujesz indeksowania dużych dokumentów (uważaj treści wiadomości e-mail, pliki PDF, dokumenty Word itp.), Są one przesadne (i jeśli jesteśmy szczerzy, całkowicie usunę ten proces z SQL Server użyj Elasticsearch lub czegoś podobnego).
W przypadku mniejszych przypadków użycia kolumny obliczane są ogólnie lepszym podejściem.
Oto szybka konfiguracja wersji demo:
Kwerenda oparta nawet na nietrwałej kolumnie daje nam plan, który „używa indeksów” i wszystkiego :)
źródło
Odpowiedź sp_BlitzErik zawiera wiele dobrych punktów, ale nie sądzę, że dlatego nie powinieneś używać wyszukiwania pełnotekstowego . Wyszukiwanie pełnotekstowe nie służy do robienia tego, co myślisz. Nie ma tam wyszukiwania wielu pól. Ma na celu wektoryzację treści słów i korzystanie ze słowników, stubowania, leksykonów, gazet, eliminacji słów zatrzymanych i mnóstwa innych sztuczek, z których żadna nie ma zastosowania. Lub, jeszcze nie wykazano ich zastosowania.
Nie zgadzam się również z tym rozwiązaniem, chociaż nie jestem pewien, jak to zrobić lepiej w SQL Server. Utwórzmy ponownie jego dane dla PostgreSQL - tworzenie PostgreSQL jest o wiele czystsze.
Teraz chcesz tego typu enum,
Teraz zwinąłeś ciągi do reprezentacji liczb całkowitych. Ale jeszcze lepiej możesz zapytać o nie tak jak wcześniej.
To ma efekt.
Bez tych korzyści zasadniczo próbujesz zoptymalizować porównanie ciągów znaków. Ale niestety nie jestem nawet pewien, jak sp_BlitzErik dostaje odpowiedź na podany kod w sugestii,
Możesz zwinąć tokeny do liczb całkowitych za pomocą wyliczenia lub metody zwijania rąk sugerowanej przez sp_BlitzErik, ale jeśli możesz zrobić zwijanie, dlaczego robisz też niezakotwiczone? To znaczy, jeśli wiesz, że „% makaron%” jest tokenem „makaron”, dlaczego masz
%
po obu stronach. Bez „%” jest to kontrola równości i powinna być dość szybka, nawet jako tekst.źródło