Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Oracle Sequence nextval przeskakuje numer w tę i z powrotem

Założę się, że w Twojej bazie danych działa RAC (Real Application Clusters). Zakładając, że tak jest i że tworzysz sekwencję ze wszystkimi ustawieniami domyślnymi, jest to oczekiwane zachowanie.

Domyślnym ustawieniem jest buforowanie 20 wartości. Każdy węzeł w klastrze RAC domyślnie będzie miał osobną pamięć podręczną. Zakładając, że masz klaster z dwoma węzłami A i B, za pierwszym razem nextval jest żądane w A, A buforuje wartości 1-20 i zwraca wartość 1. Jeśli następne żądanie nextval jest tworzony na B, B zapisze w pamięci podręcznej wartości 21-40 i zwróci wartość 21. Stamtąd otrzymana wartość będzie zależeć od węzła, na którym działa Twoje połączenie.

Generalnie nie powinno to stanowić problemu. Sekwencje generują unikalne liczby. Liczby na ogół nie muszą być kolejne. Jeśli naprawdę potrzebujesz wartości, które mają być zwracane sekwencyjnie, ponieważ robisz coś w rodzaju porządkowania według wartości generowanej przez sekwencję w celu określenia „pierwszego” lub „ostatniego” wiersza, możesz użyć ORDER klauzula podczas tworzenia sekwencji, aby wymusić zwracanie wartości w kolejności. Ma to jednak negatywny wpływ na wydajność bazy danych RAC, ponieważ zwiększa ilość komunikacji, która musi przebiegać między węzłami, aby zsynchronizować zwracane wartości. Jeśli chcesz określić „pierwszy” lub „ostatni” wiersz, zazwyczaj lepiej jest dodać date lub timestamp kolumna do tabeli i uporządkować według tego, zamiast zakładać, że klucz podstawowy jest generowany sekwencyjnie.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Konfigurowanie odbiornika w bazie danych Oracle (edycje 12c, 18c i 19c)

  2. Czy ODP.NET wymaga instalacji klienta Oracle?

  3. Co to jest Cofanie i ponawianie w bazie danych Oracle

  4. Jak utworzyć użytkownika i przyznać uprawnienia w Oracle

  5. SQL:Przeanalizuj ciąg znaków oddzielonych przecinkami i użyj jako złączenia