Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Kann ich eine SELECT DISTINCT x FROM hugeTable-Abfrage optimieren, indem ich einen Index für Spalte x erstelle?

Dies ist wahrscheinlich kein Problem der Indizierung, sondern des Datendesigns. Normalisierung, um genau zu sein. Die Tatsache, dass Sie unterschiedliche Werte eines Felds abfragen müssen und sogar bereit sind, einen Index hinzuzufügen, ist ein starker Hinweis darauf, dass das Feld in eine separate Tabelle mit einem (kleinen) Join-Schlüssel normalisiert werden sollte. Dann sind die unterschiedlichen Werte sofort verfügbar, indem die viel kleinere Nachschlage-Fremdtabelle durchsucht wird.

Aktualisieren
Als Problemumgehung können Sie eine indizierte Ansicht auf ein Aggregat durch das 'distinct'-Feld. COUNT_BIG ist ein Aggregat, das in indizierten Ansichten zulässig ist:

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