ho una abbastanza semplice query:SQL Server non utilizzerà il mio indice
SELECT
col1,
col2…
FROM
dbo.My_Table
WHERE
col1 = @col1 AND
col2 = @col2 AND
col3 <= @col3
Si stava eseguendo orribilmente, così ho aggiunto un indice su col1, col2, col3 (int, bit e datetime). Quando ho controllato il piano di query, ignoravo il mio indice. Ho provato a riordinare le colonne nell'indice in ogni configurazione possibile e ha sempre ignorato l'indice. Quando eseguo la query esegue una scansione dell'indice cluster (la dimensione della tabella è compresa tra 700 K e 800 K righe) e richiede 10-12 secondi. Quando lo costringo a usare il mio indice, ritorna istantaneamente. Ho fatto attenzione a svuotare la cache e i buffer tra i test.
Altre cose che ho provato:
UPDATE STATISTICS dbo.My_Table
CREATE STATISTICS tmp_stats ON dbo.My_Table (col1, col2, col3) WITH FULLSCAN
Mi manca qualcosa qui? Odio mettere un suggerimento di indice in una stored procedure, ma SQL Server non sembra proprio avere un indizio su questo. Qualcuno sa qualsiasi altra cosa che potrebbe impedire a SQL Server di riconoscere che l'utilizzo dell'indice è una buona idea?
EDIT: Una delle colonne da restituire è una colonna TEXT, in modo da utilizzare un indice di copertura o un INCLUDE non funzionerà :(
Hai inserito i puntini di sospensione nell'elenco delle colonne, quali altre colonne stai selezionando? E se fosse solo col1, col2 e col3? –
Chris, buon punto ma "Quando impongo di usare il mio indice, ritorna istantaneamente" lo copre. –
I puntini di sospensione sono perché la query restituisce tutte le colonne nella tabella. Suppongo che avrei potuto inserire SELECT * –