Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

LAST_NUMBER trên chuỗi thần kỳ

Đ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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Chế độ xem cụ thể hóa với trình kích hoạt?

  2. 'Chọn' có luôn sắp xếp theo khóa chính không?

  3. Oracle SQL - Tạo các hàng tổng hợp cho các hàng nhất định bằng cách sử dụng select

  4. TNS:người nghe hiện không biết dịch vụ được yêu cầu trong bộ mô tả kết nối

  5. Bảng BIN $ ... trong bảng ALL_TAB_COLUMNS của Oracle là gì?