I ciągle widzę ludzi powiedzieć, że indeksy spowolnić update
, delete
a insert
. Jest to używane jako instrukcja zbiorcza, tak jakby była absolutem.
Podczas dostrajania mojej bazy danych w celu poprawy wydajności ciągle napotykam na tę sytuację, która wydaje mi się logicznie sprzeczna z tą regułą i nigdzie nie mogę znaleźć nikogo, kto by powiedział lub wyjaśnił w jakikolwiek inny sposób.
W SQL Server i uważam / zakładam, że większość innych DBMS, twoje indeksy są tworzone na podstawie określonych kolumn, które określisz. Wstawianie i usuwanie zawsze wpływa na cały wiersz, więc nie ma mowy, aby nie wpływały na indeks, ale aktualizacje wydają się nieco bardziej unikalne, mogą w szczególności wpływać tylko na niektóre kolumny.
Jeśli mam kolumny, które nie są uwzględnione w żadnym indeksie i aktualizuję je, czy są one spowolnione tylko dlatego, że mam indeks w innych kolumnach w tej tabeli?
Na przykład powiedzmy w mojej User
tabeli, że mam jeden lub dwa indeksy, klucz podstawowy, który jest kolumną Identity / Auto Increment, i ewentualnie inny w kolumnie z kluczem obcym.
Jeśli zaktualizuję kolumnę bez indeksu bezpośrednio na niej, na przykład podając numer telefonu lub adres, czy ta aktualizacja zostanie spowolniona, ponieważ mam indeksy w tej tabeli w innych kolumnach w obu sytuacjach? Aktualizowane przeze mnie kolumny nie znajdują się w indeksach, więc logicznie indeksy nie powinny być aktualizowane, prawda? Jeśli cokolwiek, sądzę, że zostaną przyspieszone, jeśli użyję indeksów w klauzuli WHERE.
so there is no way they will not affect the index
z wyjątkiem przefiltrowanych indeksów ...Odpowiedzi:
Masz rację, że aktualizacja nieindeksowanej kolumny nie spowoduje zmian w indeksach. W prostym przypadku ogólny wpływ na stół również nie byłby.
Jeśli zapytanie może wykorzystywać Indeks do wyszukiwania danych, może to przyspieszyć wyszukiwanie, ale dokładne zachowanie (w zależności od marki SQL) może różnić się od SQL innych marek SQL. (Używam głównie Microsoft SQL Server.)
Oczywiście aktualizacja kolumny ze znacznie większą ilością danych może spowodować pewne przeniesienie wierszy na różne strony itp.
źródło
W przypadku stosunkowo szybkiego nowoczesnego systemu dodanie jednego indeksu do tabeli OLTP będzie prawdopodobnie praktycznie niewykrywalne z punktu widzenia wydajności dla zdecydowanej większości systemów . To powiedziawszy, nie powinieneś tworzyć niepotrzebnych indeksów i prawdopodobnie nie powinieneś tworzyć indeksów jednokolumnowych dla każdej kolumny w tabeli.
Masz rację, zakładając, że w przypadku wielu zapytań obecność przydatnych indeksów spowoduje bardzo zauważalną poprawę prędkości.
Chociaż wydaje się, że Twoje pytanie dotyczy wydajności, istnieje kilka innych potencjalnych problemów związanych z dodawaniem indeksów, w tym między innymi:
Czas wymagany do utworzenia indeksu może spowodować zablokowanie podczas dodawania indeksu do tabeli. Zamek jest bardzo krótkotrwały i najprawdopodobniej nie spowoduje dużego problemu.
Zmiany indeksu powodują unieważnienie planów wykonania dla wszystkich planów, które odwołują się do podstawowej tabeli. Po ponownej kompilacji tych planów wykonania wydajność może się negatywnie zmienić w przypadku niektórych zapytań.
Modyfikacje indeksu mogą powodować zwracanie przez zapytania błędów, w przypadku których żadne wcześniej nie zostało zwrócone. Weźmy na przykład filtrowany indeks, który został użyty do zwrócenia dat zawartych w polu varchar; jeśli filtr wyeliminował wszystkie wiersze, które nie były datami, a filtr ten został następnie zmieniony, zapytania oparte na tym indeksie mogą teraz nie powieść się podczas próby konwersji danych innych niż data.
Nowy indeks może powodować zmianę kolejności wykonywania, czego skutkiem mogą być zakleszczenia, o ile nie wystąpiły wcześniej.
źródło
Jeśli operacja aktualizacji jest skierowana na nieindeksowaną kolumnę o stałym rozmiarze (np. Liczbę całkowitą), ogólnie rzecz biorąc nie powinna być wolna, ale w porównaniu z instrukcją select, aktualizacja musi zostać ostatecznie zapisana również na wolnym dysku.
źródło