Điều này là bình thường, có. Từ tài liệu cho all_sequences
chế độ xem từ điển dữ liệu
, last_number
là:
Điều này có thể được tạo lại bằng một chuỗi mới:
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
tăng lên theo kích thước bộ nhớ cache, điều này là bình thường.
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
giảm xuống, nhưng bây giờ phản ánh số thứ tự cuối cùng thực tế được tạo. DDL (dường như) đã khiến dữ liệu ghi vào đĩa được cập nhật để phản ánh những gì xảy ra với giá trị hiện tại, chứ không phải ở trên cùng của bộ nhớ cache - bộ đệm 20 giá trị cũ hoặc bộ đệm 5000 giá trị mới. Trong trường hợp của bạn, bạn có 2222292447
, điều đó chỉ có nghĩa là bạn đã vượt xa hơn mười giá trị trong bộ nhớ cache so với tôi khi tôi chạy alter
.
Giá trị được lưu vào đĩa phần lớn nằm ở đó để nếu cơ sở dữ liệu gặp sự cố, nó sẽ biết lấy từ đâu. Khi khởi động lại, trình tự sẽ bắt đầu tạo các số từ last_number
đã ghi . Trong quá trình chạy bình thường, nó không cần phải tham chiếu lại điều đó, nó chỉ cập nhật giá trị trên đĩa khi các giá trị mới được lưu vào bộ nhớ đệm. Điều này ngăn chặn việc phát hành lại số thứ tự sau khi gặp sự cố, mà không cần thực hiện khóa (chậm) tốn kém để duy trì giá trị trong thời gian thực - đó là điều mà bộ nhớ cache cần tránh, sau cùng.
Sẽ chỉ có vấn đề nếu last_value
thấp hơn một chuỗi được tạo thực tế, nhưng điều đó không thể xảy ra. (Chà, trừ khi trình tự được đặt thành chu kỳ).
SQL> select SEQ_PAGE_ID.nextval from dual;
NEXTVAL
----------
2222292437
Số thứ tự tiếp theo được tạo tiếp theo từ số cuối cùng trước khi thay đổi kích thước bộ nhớ cache; nó không sử dụng lại giá trị cũ như bạn có thể lo lắng về giá trị từ điển.
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
bây giờ hiển thị giá trị được lưu trữ trước đó tăng lên theo kích thước bộ nhớ cache là 5000. Những gì có trong từ điển dữ liệu bây giờ sẽ không thay đổi lại cho đến khi chúng tôi sử dụng tất cả 5000 giá trị tạo thành bộ nhớ cache hoặc điều gì đó xảy ra ở nơi khác ảnh hưởng đến nó - cơ sở dữ liệu đang bị trả lại , trình tự lại được thay đổi, v.v.