Używam programu SQL Server 2008 i odmawia wykonania wyszukiwania w moim indeksie, który obejmuje kolumnę obliczoną.Dlaczego SQL Server nie wykonuje wyszukiwania indeksu przy użyciu mojej kolumny obliczeniowej
Moja tabela wygląda następująco:
CREATE TABLE Person
{
Id uniqueidentifier NOT NULL,
InsertDate datetime NOT NULL,
PhoneNumber NULL,
PhoneNumberComparable AS (MakePhoneNumberComparable(PhoneNumber)) PERSISTED,
... etc...
}
Jest klastrowany klucz podstawowy indeks na kolumnie ID, a także indeks na kolumnie InsertDate.
Istnieje indeks na kolumnie PhoneNumberComparable obliczonej w ten sposób:
CREATE NONCLUSTERED INDEX IX_Person_PhoneNumberComparable ON Person
(
PhoneNumberComparable ASC
)
Indeksy mają do aktualnych statystyk.
Moja kwerenda wygląda następująco:
SELECT TOP 20 * FROM Person
WHERE PhoneNumberComparable = @PhoneNumber
ORDER BY InsertDate DESC
Domyślnie SQL Server zdecyduje się użyć indeksu na InsertDate zamiast indeksu PhoneNumberComparable, powodując bardzo słabe wyniki.
Jeśli spróbuję wymusić użycie indeksu numeru telefonu, poprzez dodanie Z (INDEX = IX_Person_PhoneNumberComparable) do zapytania, SQL próbuje wykonać skanowanie, a nie szukać.
Gdy próbuję użyć FORCESEEK podpowiedź kwerendy, a następnie SQL Server daje mi następujący błąd:
Query processor could not produce a query plan because of the hints defined in this query. Resubmit the query without specifying any hints and without using SET FORCEPLAN.
Więc w zasadzie, z jakiegoś powodu SQL Server odmawia szukać mojego indeksu! Czemu?
EDIT
Zgodnie z sugestiami w komentarzach, ja uproszczone kwerendy, ale problem nadal istnieje (skanowanie na klucz podstawowy jest wykonywana zamiast szukać na indeksie numer telefonu):
SELECT TOP 20 PhoneNumberComparable FROM Person
WHERE PhoneNumberComparable = @PhoneNumber
Co stanie się, gdy spadnie z zapytania zapytanie "ORDER BY InsertDate DESC"? – iruvar
@ 1_CR Jeśli zrzucę ZAMÓWIENIE przez InsertDate DESC, spróbuje użyć indeksu klucza podstawowego. Taki sam problem! – cbp
Ten wątek mówi o podobnym problemie co mój, co oznacza, że jest to błąd w SQL Server 2008: http://www.sqlservercentral.com/Forums/Topic1085414-392-1.aspx – cbp