Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Posso ottimizzare una query SELECT DISTINCT x FROM hugeTable creando un indice sulla colonna x?

Questo probabilmente non è un problema di indicizzazione, ma di progettazione dei dati. Normalizzazione, per la precisione. Il fatto che sia necessario eseguire query su valori distinti di un campo e persino voler aggiungere un indice è un forte indicatore del fatto che il campo dovrebbe essere normalizzato in una tabella separata con una (piccola) chiave di unione. Quindi i valori distinti saranno immediatamente disponibili eseguendo la scansione della tabella esterna di ricerca molto più piccola.

Aggiornamento
Come soluzione alternativa, puoi creare una vista indicizzata su un aggregato dal campo 'distinto'. COUNT_BIG è un aggregato consentito nelle viste indicizzate:

create view vwDistinct
with schemabinding
as select x, count_big(*)
from schema.hugetable
group by x;

create clustered index cdxDistinct on vwDistinct(x);

select x from vwDistinct with (noexpand);