W naszej bazie mamy ten stół z 200.000 wierszyDlaczego program SQL Server nie korzysta z mojego indeksu?
CREATE TABLE dbo.UserTask (
UserTask_ID int NOT NULL IDENTITY (1, 1),
UserTask_SequenceNumber int NOT NULL DEFAULT 0,
UserTask_IdEntitat uniqueidentifier NOT NULL,
UserTask_Subject varchar(100) NOT NULL,
UserTask_Description varchar(500) NOT NULL,
.....
.....
CONSTRAINT [PK_UserTask] PRIMARY KEY CLUSTERED
(
[UserTask_ID] ASC
) ON [PRIMARY]
) ON [PRIMARY]
Stworzyłem indeksu na UserTask_IdEntitat
kolumny
CREATE NONCLUSTERED INDEX IX_UserTask_IDEntitat ON dbo.UserTask
(
UserTask_IDEntitat
)
wykonując następujące zapytanie, plan wykonania pokazuje nam, że indeks UserTask_IDEntitat
służy wykonać zapytanie:
SELECT UserTask_ID
FROM UserTask
WHERE UserTask_IdEntitat = @IdEntitat
ORDER BY UserTask_LastSendSystemDateTime desc
ale jeśli dodać kolejną kolumnę w Select
lista, wówczas indeks nie jest używany
SELECT UserTask_ID, UserTask_SequenceNumber, UserTask_IDEntitat, ....., UserTask_Subject
FROM UserTask
WHERE UserTask_IdEntitat = @IdEntitat
ORDER BY UserTask_LastSendSystemDateTime desc
Dlaczego dodanie kolumna różni się od podstawowego klucza sprawia, że plan wykonania SQL Server nie używa indeksu na kolumnie UserTask_IDEntitat
?
Po tym linku http://bytes.com/topic/sql-server/answers/144592-sqlsever-not-using-index wydaje się, że liczba razy, że filtrowana wartość jest powtarzana w kolumnie, Może to spowodować, że indeks nie jest używany, ale próbowałem robić kwerendę z wartości @IdEntitat, która jest powtarzana 60 000 razy i inne, które powtarza się tylko 175 razy, a wyniki są takie same, indeks na kolumnie IDEntitat
jest ignorowany.
To mnie doprowadza do szału !!!
Dzięki za pomoc.
Jeśli jesteś na odpowiedniej wersji, a jest to wspólny zapytania, warto zajrzeć do 'ZAWIERAJĄ 'ing' _SequenceNumber' w indeksie. –
... i 'LastSendSystemDateTime' również, jak sądzę. (Aby pomóc "zamówić przez"). –