Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

LAST_NUMBER pada urutan oracle

Ini normal, ya. Dari dokumentasi untuk all_sequences tampilan kamus data , last_number adalah:

Ini dapat dibuat ulang dengan urutan baru:

SQL> create sequence SEQ_PAGE_ID start with 2222292436 increment by 1 cache 20;

sequence SEQ_PAGE_ID created.

SQL> select sequence_name, increment_by, cache_size, last_number
  2  from user_sequences where sequence_name = 'SEQ_PAGE_ID';

SEQUENCE_NAME                  INCREMENT_BY CACHE_SIZE LAST_NUMBER
------------------------------ ------------ ---------- -----------
SEQ_PAGE_ID                               1         20  2222292436 

SQL> select SEQ_PAGE_ID.nextval from dual;

   NEXTVAL
----------
2222292436 

SQL> select sequence_name, increment_by, cache_size, last_number
  2  from user_sequences where sequence_name = 'SEQ_PAGE_ID';

SEQUENCE_NAME                  INCREMENT_BY CACHE_SIZE LAST_NUMBER
------------------------------ ------------ ---------- -----------
SEQ_PAGE_ID                               1         20  2222292456 

last_number melompat dengan ukuran cache, yang normal.

SQL> alter sequence SEQ_PAGE_ID CACHE 5000;

sequence SEQ_PAGE_ID altered.

SQL> select sequence_name, increment_by, cache_size, last_number
  2  from user_sequences where sequence_name = 'SEQ_PAGE_ID';

SEQUENCE_NAME                  INCREMENT_BY CACHE_SIZE LAST_NUMBER
------------------------------ ------------ ---------- -----------
SEQ_PAGE_ID                               1       5000  2222292437 

last_number turun, tetapi sekarang mencerminkan nomor urut terakhir yang dihasilkan. DDL telah (tampaknya) menyebabkan data yang ditulis ke disk diperbarui untuk mencerminkan apa yang terjadi pada nilai saat ini, daripada bagian atas cache - baik cache 20-nilai lama atau cache 5000-nilai baru. Dalam kasus Anda, Anda mendapatkan 2222292447 , yang berarti Anda sepuluh nilai lebih jauh melalui cache daripada saya ketika saya menjalankan alter .

Nilai yang disimpan ke disk sebagian besar ada di sana sehingga jika database macet, ia tahu dari mana harus mengambilnya. Saat restart, urutan akan mulai menghasilkan angka dari last_number yang direkam . Selama berjalan normal itu tidak perlu merujuk kembali ke sana, itu hanya memperbarui nilai pada disk ketika nilai-nilai baru di-cache. Ini mencegah nomor urut diterbitkan kembali setelah crash, tanpa perlu melakukan penguncian yang mahal (lambat) untuk mempertahankan nilai secara real time - bagaimanapun juga, itulah yang harus dihindari oleh cache.

Hanya akan ada masalah jika last_value lebih rendah dari urutan yang dihasilkan sebenarnya, tapi itu tidak bisa terjadi. (Yah, kecuali urutannya diatur ke siklus).

SQL> select SEQ_PAGE_ID.nextval from dual;

   NEXTVAL
----------
2222292437 

Nomor urut berikutnya yang dihasilkan mengikuti dari yang terakhir sebelum ukuran cache berubah; itu tidak menggunakan kembali nilai lama seperti yang mungkin Anda khawatirkan dari nilai kamus.

SQL> select sequence_name, increment_by, cache_size, last_number
  2  from user_sequences where sequence_name = 'SEQ_PAGE_ID';

SEQUENCE_NAME                  INCREMENT_BY CACHE_SIZE LAST_NUMBER
------------------------------ ------------ ---------- -----------
SEQ_PAGE_ID                               1       5000  2222297437 

last_number sekarang menunjukkan nilai tersimpan sebelumnya bertambah dengan ukuran cache 5000. Apa yang ada di kamus data sekarang tidak akan berubah lagi sampai kita menghabiskan semua 5000 nilai dari cache, atau sesuatu terjadi di tempat lain yang memengaruhinya - database sedang dipantulkan , urutannya diubah lagi, dll.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Contoh Pernyataan Oracle FOR LOOP SELECT

  2. Kesalahan saat menggunakan fungsi DBMS_CRYPTO untuk mendekripsi data CLOB

  3. Tambahkan data yang hilang dari bulan atau tahun sebelumnya secara kumulatif

  4. ORA-00900:kesalahan pernyataan SQL tidak valid? Apa yang salah dengan sql saya?

  5. Oracle 11 SQL :Pisahkan 1 baris menjadi x baris dan masukkan kolom baru