Wprowadzono SQL Server 2012 Sequence
jako nowa funkcja, taka sama jak w Oracle i Postgres. Gdzie sekwencje są preferowane nad tożsamościami? A po co nam sekwencje?
sql
sql-server
tsql
sql-server-2012
Sleiman Jneidi
źródło
źródło
Odpowiedzi:
Myślę, że tutaj znajdziesz odpowiedź
A tutaj :
i tutaj również:
a na msdn możesz również przeczytać więcej o użyciu i dlaczego go potrzebujemy ( tutaj ):
źródło
Sekwencja i tożsamość są używane do generowania automatycznego numeru, ale główna różnica polega na tym, że tożsamość jest zależna od tabeli, a sekwencja jest niezależna od tabeli.
Jeśli masz scenariusz, w którym musisz utrzymywać numer automatyczny globalnie (w wielu tabelach), również musisz ponownie uruchomić interwał po określonej liczbie i musisz go buforować również dla wydajności, tutaj jest miejsce, w którym potrzebujemy sekwencji, a nie tożsamość.
źródło
Chociaż sekwencje zapewniają większą elastyczność niż kolumny tożsamości, nie stwierdziłem, że mają jakiekolwiek korzyści z wydajności.
Zauważyłem, że wydajność przy użyciu tożsamości była konsekwentnie 3x szybsza niż przy użyciu sekwencji do wstawiania wsadowego.
Wstawiłem ok. 1,5 mln wierszy i wydajność wyniosła:
Wstawiłem wiersze do tabeli, która używała obiektu sekwencji za pośrednictwem domyślnej tabeli:
NEXT VALUE for <seq> for <col_name>
a także próbował określić wartość sekwencji w instrukcji select:
SELECT NEXT VALUE for <seq>, <other columns> from <table>
Oba były tym samym czynnikiem wolniej niż metoda tożsamości. Użyłem domyślnej opcji pamięci podręcznej dla sekwencji.
Artykuł, do którego odwołuje się pierwszy link Ariona, pokazuje wydajność wstawiania wiersz po wierszu, a różnica między tożsamością i sekwencją wynosiła od 16,6 sekundy do 14,3 sekundy dla 10 000 wstawień.
Opcja buforowania ma duży wpływ na wydajność, ale tożsamość jest szybsza w przypadku większych wolumenów (+ 1 mln wierszy)
Zobacz ten link, aby uzyskać dogłębną analizę zgodnie z komentarzem utly4life.
źródło
alter sequence increment by ...
po prostu zwolnienia miejsca dla nowych wierszy, a następnie użyj base + row_number () lub cokolwiek innego dla rzeczywistych wartości.Wiem, że to trochę stare, ale chciałem dodać spostrzeżenie, które mnie ugryzło.
Zmieniłem tożsamość na sekwencję, aby uporządkować indeksy. Później dowiedziałem się, że sekwencja nie przenosi się wraz z replikacją. Po skonfigurowaniu replikacji między dwiema bazami danych zacząłem otrzymywać kluczowe naruszenia, ponieważ sekwencje nie były zsynchronizowane. po prostu coś, na co należy uważać przed podjęciem decyzji.
źródło
Uważam, że najlepszym zastosowaniem Sekwencji nie jest zastępowanie kolumny tożsamości, ale tworzenie pola typu „Numer zamówienia”.
Innymi słowy, numer zamówienia jest widoczny dla użytkownika końcowego i może zawierać reguły biznesowe. Chcesz, aby był unikalny, ale samo użycie kolumny tożsamości też nie jest poprawne.
Na przykład różne typy zamówień mogą wymagać innej kolejności, więc możesz mieć kolejność dla zamówień internetowych, w przeciwieństwie do zamówień wewnętrznych.
Innymi słowy, nie myśl o Sekwencji jako prostym zastępstwie tożsamości, myśl o niej jako użytecznej w przypadkach, gdy tożsamość nie spełnia wymagań biznesowych.
źródło
Ostatnio trzeba było wziąć pod uwagę tożsamość kontra sekwencję. Wygląda na to, że MSFT sugeruje teraz sekwencję, jeśli chcesz zachować tożsamość bez luk. Mieliśmy problem polegający na tym, że istniały ogromne luki w tożsamości, ale na podstawie tego stwierdzenia podkreślenie wyjaśniłoby nasz problem, że SQL buforował tożsamość i po ponownym uruchomieniu utraciliśmy te liczby.
https://docs.microsoft.com/en-us/sql/t-sql/statements/create-table-transact-sql-identity-property?view=sql-server-2017
Kolejne wartości po ponownym uruchomieniu serwera lub innych awariach - SQL Server może buforować wartości tożsamości ze względu na wydajność, a niektóre z przypisanych wartości mogą zostać utracone podczas awarii bazy danych lub ponownego uruchomienia serwera. Może to spowodować luki w wartości tożsamości podczas wstawiania. Jeśli luki są nie do zaakceptowania, aplikacja powinna używać własnego mechanizmu do generowania wartości kluczy. Użycie generatora sekwencji z opcją NOCACHE może ograniczyć luki do transakcji, które nigdy nie zostały zatwierdzone.
źródło
IDENTITY
numerami i ma ten sam problem, co link tutaj opisany, ale możesz go ograniczyć, ustawiając mniejszy rozmiar CACHE, ale wtedy jest kompromis z prędkością.SEQUENCE