Ten artykuł jest lustrzanym artykułem tłumaczenia maszynowego, kliknij tutaj, aby przejść do oryginalnego artykułu.

Widok: 12044|Odpowiedź: 0

[Komunikacja] Problem z wykorzystaniem indeksu, gdy sqlserver obsługuje np. '%keyword%'

[Skopiuj link]
Opublikowano 26.11.2014 15:52:19 | | | |

Zdanie 1: Prefiks dzikiego znaku procent spowoduje, że zapytania SQL zatrzymają indeks i zamiast tego użyją pełnego skanowania tabel. To stwierdzenie jest popularne

Wniosek jest błędny

W rzeczywistości to stwierdzenie nie jest zbyt dokładne. Prefiks wildcard % sprawi, że wyszukiwanie indeksów SQL będzie bardzo wydajne, ale w większości przypadków nadal trafi do indeksu (nie jest wymagany pełny tekst, wystarczy zbudować zwykły indeks)

UTWÓRZ INDEKS NIEKLASTROWANY [Ix_index NAZWA] NA [dbo]. [wkf_ Nazwa stołu]
(
[db_title]  ASC
)

Wykonaj w tym momencie

WYBIERZ top 10 [db_id], [db_Summary],[db_AddDate],[db_title] Z [nazwa biblioteki]. [dbo]. [wkf_database] gdzie [db_title] jak '%dba%' uporządkowane przez 1 desc

Plan zapytania jest wyraźnie widoczny

Przed indeksowaniem porównania:


Wyjątkiem są złożone zapytania Optimalizator zapytań może porzucić indeks na rzecz pełnego skanowania tabel. Dotyczy to nie tylko LIKE '%keyword', ale także złożoności zapytań




Stwierdzenie 2: Percent% prefiksów wildcard sprawi, że zapytania SQL będą indeksowane, a nie ich nie

To stwierdzenie jest bardzo jednostronne i 99% indeksu obniży IO i poprawi efektywność w porównaniu do nieindeksowania, ale kluczowa dopasowość po znalezieniu indeksu jest również częściowo obciążająca wydajność. Jak pokazano na dwóch powyższych rysunkach, jeśli słowa kluczowe są łatwo dopasowane, pełne skanowanie tabeli szybko znajduje dane, a skanowanie indeksu nie oszczędza wystarczająco dużo czasu, by zrekompensować czas potrzebny na akcję dopasowania klucza (większość zapytań online nie ma tego problemu).
Leczenie:
1. Jeśli ci na tym nie zależy, dodatkowe zużycie wydajności nie jest duże. Różne słowa kluczowe mają różną popularność, ale niektóre mają ten problem i można je zignorować
2. Lepszym sposobem jest zbudowanie indeksu nadpisującego (znanego również jako indeks INKLUZY), jeśli warunki na to pozwalają. Założenie: a. Przestrzeń pamięci jest wystarczająca, b nie wpływa znacząco na operacje DML, a c nie ma dużych pól w nadpisanym indeksie

UTWÓRZ INDEKS NIEKLASTROWANY [Ix_index NAZWA] NA [dbo]. [wkf_ Nazwa stołu]
(
[db_title]  ASC
)
INCLUDE ( [db_id],[db_Summary],[db_AddDate])

Obecnie plan zapytań wykonawczych wygląda następująco, co jest znacznie bardziej odświeżające


Powyższe to właśnie przychodzi mi do głowy w kontekście przetwarzania SQLSERVER SELECT * FROM TABLENAME, np. '%Keyword %'






Poprzedni:Replikacja transakcji SQL Server dodaje nowe tabele bez konieczności reinicjalizacji
Następny:Praktyczne sformułowanie SQL: estymacja daty
Zrzeczenie się:
Całe oprogramowanie, materiały programistyczne lub artykuły publikowane przez Code Farmer Network służą wyłącznie celom edukacyjnym i badawczym; Powyższe treści nie mogą być wykorzystywane do celów komercyjnych ani nielegalnych, w przeciwnym razie użytkownicy ponoszą wszelkie konsekwencje. Informacje na tej stronie pochodzą z Internetu, a spory dotyczące praw autorskich nie mają z nią nic wspólnego. Musisz całkowicie usunąć powyższą zawartość z komputera w ciągu 24 godzin od pobrania. Jeśli spodoba Ci się program, wspieraj oryginalne oprogramowanie, kup rejestrację i korzystaj z lepszych, autentycznych usług. W przypadku naruszenia praw prosimy o kontakt mailowy.

Mail To:help@itsvse.com