Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Puis-je optimiser une requête SELECT DISTINCT x FROM hugeTable en créant un index sur la colonne x ?

Il ne s'agit probablement pas d'un problème d'indexation, mais d'un problème de conception des données. Normalisation, pour être précis. Le fait que vous deviez interroger des valeurs distinctes d'un champ, et même vouloir ajouter un index, est un indicateur fort que le champ doit être normalisé dans une table séparée avec une (petite) clé de jointure. Ensuite, les valeurs distinctes seront disponibles immédiatement en analysant la table étrangère de recherche beaucoup plus petite.

Mise à jour
Pour contourner ce problème, vous pouvez créer une vue indexée sur un agrégat par le champ 'distinct'. COUNT_BIG est un agrégat autorisé dans les vues indexées :

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);