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.