sql >> Databáze >  >> RDS >> Oracle

Oracle Sequence nextval je přeskakování čísla tam a zpět

Vsadím se, že ve vaší databázi běží RAC (Real Application Clusters). Za předpokladu, že tomu tak je a že vytvoříte sekvenci se všemi výchozími nastaveními, je to očekávané chování.

Výchozí nastavení je uložit do mezipaměti 20 hodnot. Každý uzel v clusteru RAC bude mít ve výchozím nastavení samostatnou mezipaměť. Za předpokladu, že máte cluster se dvěma uzly A a B, poprvé se objeví nextval je požadován na A, A uloží do mezipaměti hodnoty 1-20 a vrátí hodnotu 1. Pokud další požadavek na nextval je vytvořen na B, B uloží do mezipaměti hodnoty 21-40 a vrátí hodnotu 21. Odtud bude hodnota, kterou získáte, záviset na uzlu, na kterém vaše připojení náhodou běží.

Obecně by to neměl být problém. Sekvence generují jedinečná čísla. Čísla obecně nemusí být po sobě jdoucí. Pokud opravdu potřebujete, aby se hodnoty vracely postupně, protože provádíte něco jako řazení podle hodnoty vygenerované sekvencí k určení „prvního“ nebo „posledního“ řádku, můžete použít ORDER klauzule při vytváření posloupnosti, která vynutí vrácení hodnot v pořadí. To má však negativní dopad na výkon v databázi RAC, protože to zvyšuje množství komunikace, která musí probíhat mezi uzly, aby se synchronizovaly vracené hodnoty. Pokud potřebujete určit „první“ nebo „poslední“ řádek, je obecně lepší přidat date nebo timestamp sloupec do tabulky a seřaďte podle toho, nikoli za předpokladu, že primární klíč je generován postupně.



  1. Ověřování SQL Server vs. ověřování Windows:Které použít a kdy

  2. jak udělat sdružování připojení v Javě?

  3. Jak zjistit, která verze Postgres je spuštěna

  4. Naučte se základy protokolování Java