Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Czy mogę zoptymalizować zapytanie SELECT DISTINCT x FROM hugeTable, tworząc indeks w kolumnie x?

Prawdopodobnie nie jest to problem indeksowania, ale projektowania danych. Normalizacja, żeby być precyzyjnym. Fakt, że musisz odpytywać różne wartości pola, a nawet chcesz dodać indeks, jest silnym wskaźnikiem, że pole powinno zostać znormalizowane do oddzielnej tabeli z (małym) kluczem sprzężenia. Wtedy odrębne wartości będą dostępne natychmiast po zeskanowaniu znacznie mniejszej tabeli obcej wyszukiwania.

Aktualizacja
W ramach obejścia możesz utworzyć widok indeksowany w agregacie przez pole „odrębne”. COUNT_BIG jest agregatem dozwolonym w widokach indeksowanych:

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Autoinkrementacja SQL Server zależy od wartości innego pola

  2. Pobieranie wyniku dynamicznego SQL do zmiennej dla serwera sql

  3. Dynamiczna konwersja wierszy na kolumny SQL

  4. Zapytanie ODBC na MS SQL Server zwracające pierwsze 255 znaków tylko w PHP PDO (FreeTDS)

  5. Konwertuj „czas” na „datetime2” w SQL Server (przykłady T-SQL)