9

Po pierwsze, powinienem zaznaczyć, że nie mam zbyt dużej wiedzy na temat indeksów SQL Server.Czy indeksowanie poprawi wydajność zapytań varchar (max) i jak utworzyć indeks

Moja sytuacja jest taka, że ​​mam tabelę bazy danych SQL Server 2008, która ma kolumnę varchar (max) zwykle wypełnioną lotem tekstu.

Moja aplikacja internetowa ASP.NET ma funkcję wyszukiwania, która zapytuje tę kolumnę o wyszukiwania słów kluczowych, i w zależności od liczby wyszukiwanych słów kluczowych może być jedną lub wieloma instrukcjami LIKE "% keyword%" w zapytaniu SQL aby przeprowadzić wyszukiwanie.

Moja aplikacja internetowa umożliwia również wyszukiwanie według różnych kolumn w tej tabeli, a nie tylko w jednej kolumnie. Istnieje również kilka sprzężeń z innych tabel.

Moje pytanie brzmi, czy warto utworzyć indeks w tej kolumnie, aby poprawić wydajność tych zapytań? A jeśli tak, jaki rodzaj indeksu wystarczy i wystarczy indeksowanie jednej kolumny lub czy muszę uwzględnić inne kolumny, takie jak klucz podstawowy i inne kolumny z możliwością wyszukiwania?

Odpowiedz

7

Nie warto tworzyć regularnego indeksu, jeśli przeprowadzasz wyszukiwania "% keyword%" LIKE "% keyword%". Powodem jest to, że indeksowanie działa jak przeszukiwanie słownika, w którym zaczynasz od środka, a następnie dzielisz różnicę, aż znajdziesz słowo. Ta kwerenda wieloznaczna jest jak prośba o wyszukanie słowa zawierającego tekst "to" lub coś takiego - jedynym sposobem znalezienia dopasowań jest zeskanowanie całego słownika.

Można jednak rozważyć wyszukiwanie pełnotekstowe, które jest przeznaczone dla tego rodzaju scenariusza (see here).

0

Najlepszym sposobem, aby się tego dowiedzieć, jest stworzenie zestawu pytań testowych, które przypominają to, co może się zdarzyć w prawdziwym życiu, i próby uruchomienia ich w bazie danych z indeksem i bez niego. Jednak generalnie, jeśli wykonujesz wiele zapytań SELECT i niewiele zapytań UPDATE/DELETE, indeks może przyspieszyć zapytania.

Jednakże, jeśli wykonujesz wiele aktualizacji, indeks może zaszkodzić twojemu wykonaniu, więc musisz wiedzieć, jakiego rodzaju zapytania będzie musiał podjąć twój DB przed podjęciem tej decyzji.

15

nie można utworzyć indeksu w polu varchar (max). Maksymalna ilość bajtów w indeksie wynosi 900. Jeśli kolumna jest większa niż 900 bajtów, można utworzyć indeks, ale każda wstawka z ponad 900 bajtów zakończy się niepowodzeniem.

Proponuję przeczytać o fulltext wyszukiwaniu. Należy ci pasuje w tym przypadku

+0

Diego, rozumiem, że mogę indeksować kolumnę varchar (max) tak długo, jak długo jest nieklastrowym indeksem offline, a kolumna var (max) zawiera wartość INCLUDE, np. UTWÓRZ NIEKLUBOWANY INDEKS IndexName ON TableName (SomeColumn) INCLUDE (VarcharMaxColumn) WITH (ONLINE = OFF) – johna

+1

varchar (max) może być tylko uwzględniony w indeksie, oznacza to, że tylko poziomy liści będą uczestniczyć w indeksie, co oznacza, że ​​prawie nie będą używane w zapytaniu wyszukiwania. – Diego

+1

Z (ONLINE = OFF) nie jest własnością indeksu. Wskazuje, że indeks zostanie ustawiony w trybie offline podczas tworzenia. Jeśli ustawisz go na ON, indeks zostanie utworzony w tempDB, a tabela będzie dostępna podczas procesu tworzenia indeksu. Powinien być używany w przypadku dużych tabel, w których tworzenie indeksu zajmuje dużo czasu, a tabela nie może być niedostępna podczas tworzenia – Diego

20

Najlepszą analogią, jaką kiedykolwiek widziałem, dlaczego indeks nie pomoże '%wildcard%' wyszukiwań:

Weź dwie osoby. Podaj każdemu taką samą książkę telefoniczną. Powiedz osobie po swojej lewej stronie:

Powiedz, ile osób jest w tej książce telefonicznej o nazwisku "Smith".

teraz powiedzieć do osoby po prawej stronie:

Powiedz mi, jak wiele osób w tej książce telefonicznej z imienia „Simon."

Indeks jest jak w książce telefonicznej. Bardzo łatwe do szukania na rzeczy, które są na początku. Bardzo trudne do skanowania w poszukiwaniu rzeczy, które jest w środku lub na końcu.

Każdy czas, który powtórzyłem w sesji, widzę żarówki, więc pomyślałem, że może się przydać, aby się nimi podzielić.

+0

To jest analogia, z której zawsze korzystam. –

Powiązane problemy