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

Określ ostatni dodany wiersz, gdy nie ma indeksu

Nie, w SQL Server nie ma predefiniowanej funkcji, która zwróci „ostatni wiersz” tabeli.

Z definicji tabela jest nieuporządkowanym zbiorem wierszy. Wyobraź sobie, że wrzucasz do torby kilka kulek. Teraz otwórz torbę i zapytaj kogoś innego, która kulka trafiła jako pierwsza lub ostatnia. Teraz rzuć je wszystkie na podłogę, a gdy ktoś inny wejdzie do pokoju, zapytaj, który uderzył w podłogę jako pierwszy lub ostatni. Nie możesz tego zrobić, ponieważ nie ma dodatkowych informacji, które wskazywałyby cokolwiek o kolejności, w jakiej padły.

To samo dotyczy tabeli w SQL Server. O ile nie dodasz kolumny IDENTITY, kolumny daty/godziny lub wyzwalacza lub nie użyjesz funkcji zewnętrznych, takich jak śledzenie zmian, CDC, inspekcja itp., SQL Server nie ma możliwości poinformowania Cię, który wiersz został wstawiony jako ostatni. Możesz myśleć że samo wybranie z tabeli bez kolejności według klauzuli wygląda tak jak zwraca dane we właściwej kolejności, jest to czysty zbieg okoliczności. Oto przykład:

CREATE TABLE dbo.floobat
(
  ID INT PRIMARY KEY, 
  n VARCHAR(16), 
  x CHAR(4000) NOT NULL DEFAULT ''
);

INSERT dbo.floobat(ID,n) VALUES(1,'Sparky');
INSERT dbo.floobat(ID,n) VALUES(2,'Aaron');
INSERT dbo.floobat(ID,n) VALUES(3,'Norbert'); -- <-- inserted last

SELECT ID, n FROM dbo.floobat;

Ok, więc domyślnie wydaje się to być w porządku. Wyniki:

ID    n
--    -------
1     Sparky
2     Aaron
3     Norbert -- < yes, this is right

Zróbmy jednak zmianę w tabeli, o której Twoja aplikacja lub cokolwiek innego opiera się na powyższej kolejności:

CREATE NONCLUSTERED INDEX x ON dbo.floobat(n);

SELECT ID, n FROM dbo.floobat;

O o! Wyniki:

ID    n
--    -------
2     Aaron
3     Norbert
1     Sparky -- < oops, this is no longer right

Musisz o tym pamiętać:jeśli nie dołączysz klauzuli ORDER BY, mówisz SQL Server, w którym nie zależy Ci na porządku. Dlatego znajdzie najbardziej wydajny sposób na zwrócenie danych, co może prowadzić do innej zaobserwowanej kolejności. Dodanie powyższego indeksu dało SQL Serverowi lepszą ścieżkę dostępu do pobierania danych. Nadal używał skanowania, ale ten indeks był znacznie cieńszy niż indeks klastrowy (który mógł zmieścić tylko dwa wiersze na stronie).

Nawet bez indeksu prawdopodobnie nie uzyskasz oczekiwanych wyników, ponieważ jest to skomplikowane przez fakt, że Twój Cust_ID kolumna nie jest wstawiana w kolejności rosnącej. Więc jeśli wstawisz 5 i niż 2 , wybranie bez ORDER BY spowoduje w rzeczywistości 2 następnie 5 (zakładając, że nie istnieje lepszy indeks).

Inne rzeczy inne niż tworzenie (lub usuwanie, zmienianie lub przebudowywanie) indeksu mogą spowodować ten sam rodzaj zmiany w zachowaniu kolejności. Zastosuj dodatek Service Pack, CU lub poprawkę; opróżnianie pamięci podręcznej procedur; przy użyciu różnych opcji RECOMPILE; aktualizowanie statystyk; ponowne uruchomienie serwera; dodanie lub wyłączenie flagi śledzenia; zmiana opcji opcji serwera; przeniesienie bazy danych na inny serwer; itd. itd.

Jeśli więc chcesz śledzić te informacje, musisz w jakiś sposób dodać je samodzielnie, tak jak zostało to omówione w kilku innych odpowiedziach.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Zgubiłem bazę danych SQL Server 2008, muszę przywrócić strukturę bazy danych ze schematu LINQ

  2. Jak uruchomić zadanie SQL Server z procedury składowanej?

  3. Połączenie z serwerem SQL czasami działa

  4. Poczekaj na zamknięcie połączeń przed przywróceniem bazy danych SQL Server

  5. SQL Server, nie można wstawić wartości null do pola klucza podstawowego?