Zakładając, że tabela zawiera wystarczające informacje, aby uzasadnić wyszukiwanie indeksu, przy jakiej liczności SQL Server (lub PostgreSQL) zdecyduje się na skanowanie indeksu?Na jakiej liczności SQL Server przełącza się na skanowanie indeksu (w porównaniu do wyszukiwania)?
Powodem, dla którego o to pytam, było wcześniejsze wysłanie pytania (link), w którym dwa zapytania zostały wykonane z tą samą szybkością, ale jeden nie próbował użyć indeksu do przetworzonych kolumn. Po SQL Server zasugerowałem umieścić obejmujący indeks, który zawarte badanych kolumn (zasugerował to dla obu zapytań), zacząłem szukać powodów, dla których miałoby to takie dziwne sugestie.
Eksperymentowałem z tworzeniem indeksów obejmujących i złożonych, ale oba wykonywane w tym samym czasie (mówimy o 3 milionach wierszy).
W końcu doszedłem do wniosku, że wynika to z bardzo dużej liczności danych. Każdy wiersz jest unikalny. Przypuszczam, że to spowodowało, że serwer SQL wybrał skanowanie indeksu. Jednak zapytanie to "WHERE Col1>? AND Col2 <?", Więc jest to trochę mylące.
Moje pytania są następujące:
- Na co liczność BĘDZIE RDBMS zawsze zdecydować się na indeksie skanować?
- Czy ktoś może wyjaśnić, dlaczego SQL Server nie użyłby indeksu, gdy instrukcja WHERE wskazywałaby, że ma to sens?
Dołączyłem plan wykonania.
Świetna odpowiedź @Andrew. To wyjaśnia mi to ładnie i wyjaśnia, dlaczego SQL Server wybrał skanowanie indeksu. – IamIC
@Andrew: "Jeśli chodzi o przechylanie indeksu pokrywającego, to w rzeczywistości nie jest to łatwe, nawet przy 100% wybranych danych indeks obejmujący nadal będzie wymagał przeszukiwania w większości przypadków" - dlaczego tak jest? – IamIC
Silnik planu zapytań to optymalizator oparty na kosztach, ponieważ dostęp do hierarchii indeksów kosztuje 0, a wyszukiwanie każdej strony liścia w indeksie to taki sam koszt, jak skanowanie każdej strony liścia w indeksie (pod względem kosztów). W zależności od użytej klauzuli where widziałem, że robi to jedno i drugie, ale trzeba było sporo wysiłku, aby go zeskanować. Domyślnie szukano – Andrew