W swojej odpowiedzi na pytanie Co jest lepsze: kolumny tożsamości lub wygenerowane unikalne wartości identyfikatora? mrdenny mówi:
Kiedy SQL Denali wyjdzie, będzie obsługiwał sekwencje, które będą bardziej wydajne niż tożsamość, ale sam nie możesz stworzyć czegoś bardziej wydajnego.
Nie jestem tego taki pewien. Znając sekwencje Oracle , muszę albo utworzyć wyzwalacz wstawiania, obudować każdą wstawkę w wywołaniu procedury składowanej, albo modlić się, aby nie zapomnieć o właściwym użyciu sekwencji, gdy wykonuję wstawkę ad-hoc.
Wątpię, aby zalety sekwencji były tak oczywiste.
sql-server
sql-server-2012
sequence
bernd_k
źródło
źródło
Odpowiedzi:
Odpowiem też tutaj. Ma to związek z tym, w jaki sposób
IDENTITY
i jakSEQUENCE
działa.Dzięki
IDENTITY
SQL Server wstępnie buforuje wartości do pamięci, aby były łatwo dostępne. Szczegółowe informacje można znaleźć w odpowiedzi Martina Smitha . Gdy wartości są używane, proces w tle generuje więcej wartości. Jak możesz sobie wyobrazić, ta pula może się dość szybko wyczerpać, pozostawiając aplikację na łasce procesu w tle, który generuje wartości.Za pomocą
SEQUENCE
SQL Server pozwala określić, jak duża powinna być pamięć podręczna. Podczas gdy SQL Server nie zachowuje wartości w pamięci podręcznej, zachowuje tylko bieżącą wartość i najwyższą wartość końcową, znacznie zmniejszy to ilość operacji we / wy potrzebnych do utworzenia wartości.Nie ustawiaj zbyt wysokiego poziomu pamięci podręcznej, ponieważ zmniejszy to liczbę liczb, których można użyć: jeśli SQL Server ulegnie awarii, wszelkie wartości określone w bieżącym zakresie pamięci podręcznej, które nie były używane, zostaną utracone.
Jeśli chodzi o wstawianie wierszy, po prostu określ domyślną wartość dla kolumny, na przykład:
źródło
Odkąd został napisany artykuł Itzika Bena Gana, rozmiar pamięci podręcznej na 10 dla
IDENTITY
wydaje się być zmieniony. Z komentarzy na temat tego elementu połączeniaT-SQL Zapytania książka zawiera poniższa tabela, ale podkreśla, że wartości te nie są udokumentowane lub gwarancją niezmienione.
Artykuł tutaj testuje różne rozmiary pamięci podręcznej sekwencji i wstawia rozmiary partii i przedstawia następujące wyniki.
Co wydaje się wskazywać, że w przypadku dużych wkładek
IDENTITY
wykonuje sięSEQUENCE
. Jednak nie testuje rozmiaru pamięci podręcznej 1000, a także te wyniki są tylko jednym testem. Patrząc konkretnie na wielkość pamięci podręcznej 1000 z różnymi rozmiarami partii wkładek, otrzymałem następujące wyniki (próbowanie każdej wielkości partii 50 razy i agregowanie wyników jak poniżej - cały czas w μs).W przypadku większych partii partia
IDENTITY
wydaje się generalnie szybsza .Książka zapytań TSQL wyjaśnia również, dlaczego
IDENTITY
może mieć przewagę wydajności nad sekwencją.Jest
IDENTITY
to specyficzne dla tabeli iSEQUENCE
nie jest. Jeśli katastrofa miała nastąpić w trakcie wstawiania przed opróżnieniem bufora dziennika, nie ma znaczenia, czy odzyskana tożsamość jest wcześniejsza, ponieważ proces odzyskiwania również cofnie wstawienie, więc SQL Server nie wymusza opróżniania bufora dziennika przy każdej tożsamości zapis dysku związany z pamięcią podręczną. Jednak w przypadku sekwencji jest to wymuszane, ponieważ wartość może być używana w dowolnym celu - w tym poza bazą danych. Tak więc w powyższym przykładzie z milionem wstawek i wielkości pamięci podręcznej 1000 jest to dodatkowy tysiąc logów.Skrypt do odtworzenia
źródło