2009-03-16 7 views
19

Na serwerze Sql mam tabelę z kluczem podstawowym Identity. Często chcę mieć kilka najnowszych rekordów, więc wybieram Top n posortowany po malejącym kluczu podstawowym. Czy powinienem zdefiniować indeks klucza podstawowego jako malejący, czy nie robi to różnicy? tzn. czy są one w porządku rosnącym, to czy sql równie skutecznie działa wstecz?Klawisz podstawowy Rosnąco vs malejąco

+0

Nie powinieneś ** nie ** tworzyć go jako 'desc'. Otrzymasz wiele logicznej fragmentacji z insertów [jak pokazano tutaj] (http://stackoverflow.com/a/9382500/73226) –

Odpowiedz

30

Z czysto zapytaniem punktu widzenia nie ma różnicy, czy klucz jest malejącej lub rosnącej jeśli chcesz ciągnąć N najnowsza lub N najstarsze rekordy:

wewnętrzne algorytmy SQL Server może nawigacja równie wydajnie w obu kierunkach na indeksie jednokolumnowym, bez względu na kolejność zapisywania kluczy. Na przykład określenie DESC w indeksie z jedną kolumną nie tworzy zapytań z klauzulą ​​ORDER BY IndexKeyCol klauzula DESC działa szybciej, niż gdyby dla indeksu określono ASC.

http://msdn.microsoft.com/en-us/library/aa933132(SQL.80).aspx

Jednak pod niemal każdym normalnym okolicznościach chcesz podstawowy klucz do rosnąco i ordinally sekwencyjny, aby zapobiec rozdrobnieniu. SQL Server jest zoptymalizowany do fizycznego dodawania nowych rekordów na końcu pliku bazy danych. Jeśli trzeba wstawić każdy nowy rekord u góry i spychać wszystko w dół, prawdopodobnie spowoduje to prawie 100% fragmentację.

3

Nie ma absolutnie żadnej różnicy.

Nie mogę sobie nawet wyobrazić, dlaczego można to zadeklarować w dowolny sposób.

+3

Z pojedynczym indeksem kolumny, nie robi różnicy, ale ASC i DESC wchodzą w grę gdy masz wiele kolumn w indeksie, a kolejność ma znaczenie dla drugiej/trzeciej/czwartej kolumny/etc. –

+0

To nie ma dla mnie sensu. Jeśli masz dwie wartości pól, sposób w jaki schodzisz z drzewa jest zupełnie obojętny. Czy to tylko domysły, czy masz referencje? – dkretz

+0

Ma sens dla mnie. Jeśli masz indeks o nazwie "A ASC, B DESC", ale większość twoich zapytań to "ORDER BY A ASC, B ASC", którego nie unikniesz sortowania. –