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

Giá trị trình tự Oracle không được sắp xếp

Thứ hai, Tôi có thể đạt được thứ tự không nếu tôi thay đổi trình tự thànhNOCACHE bất kể ORDER / NOORDER.

vâng vì NOCACHE sắp xếp thứ tự một cách hiệu quả khi bạn buộc ghi vào bảng sys.seq $ trên mỗi gia số, điều này cũng phải tuần tự qua các nút.

-

Tôi sẽ tranh chấp câu trả lời được chấp nhận trong bản sao có thể có. có sự khác biệt rất lớn về CACHE + ORDER và NOCACHE trong RAC. Bạn không phủ định CACHE với ORDER; chỉ làm giảm hiệu quả của nó. Cá nhân tôi đã thấy hiệu suất của một ứng dụng bậc trung suy giảm nghiêm trọng khi họ sử dụng NOCACHE theo một trình tự và đang truy cập trên nhiều nút cùng một lúc. Chúng tôi đã chuyển trình tự của họ thành ORDER CACHE (vì họ muốn có một thứ tự khác chủng tộc). và hiệu suất được cải thiện đáng kể.

tóm lại:Tốc độ trình tự sẽ từ nhanh nhất đến chậm nhất là "CACHE NOORDER" -> "CACHE ORDER" và cách WAY phía sau "NOCACHE".

Điều này cũng có thể dễ dàng kiểm tra:

Vì vậy, chúng tôi bắt đầu với một trình tự tiêu chuẩn:

SQL> create sequence daz_test start with 1 increment by 1 cache 100 noorder;

Sequence created.

tức là CACHE không có thứ tự. Bây giờ chúng tôi khởi động hai phiên. Tôi đang sử dụng cơ sở dữ liệu RAC 4 nút 10.2.0.4 trong thử nghiệm này:

kịch bản thử nghiệm của tôi chỉ đơn giản là

select instance_number from v$instance;              
set serverout on
declare                                                     
 v_timer   timestamp with time zone := systimestamp;  
 v_num number(22);                                    
begin                                                  
 for idx in 1..100000                                 
 loop                                                 
   select daz_test.nextval into v_num from dual;      
 end loop;                                            
 dbms_output.put_line(systimestamp - v_timer);        
end;                                                   
/ 
/

bây giờ chúng tôi chạy thử nghiệm đầu tiên (CACHE NOORDER):

SESSION 1                                       SESSION 2
SQL> @run_test                                  SQL> @run_test

INSTANCE_NUMBER                                 INSTANCE_NUMBER
---------------                                 ---------------
              2                                               1


PL/SQL procedure successfully completed.        PL/SQL procedure successfully completed.


PL/SQL procedure successfully completed.        PL/SQL procedure successfully completed.

SQL> @run_test                                  SQL> @run_test

INSTANCE_NUMBER                                 INSTANCE_NUMBER
---------------                                 ---------------
              2                                               1

+000000000 00:00:07.309916000                   +000000000 00:00:07.966913000

PL/SQL procedure successfully completed.        PL/SQL procedure successfully completed.

+000000000 00:00:08.430094000                   +000000000 00:00:07.341760000

PL/SQL procedure successfully completed.        PL/SQL procedure successfully completed.

như vậy 7-8 giây để chọn 100.000 lần lặp của trình tự.

Bây giờ chúng ta hãy thử NOCACHE (ORDER vs NOORDER là không thích hợp cho điều này, vì chúng tôi đang buộc ghi vào seq $ cho mọi lệnh gọi đến chuỗi).

SQL> alter sequence daz_test nocache;

Sequence altered.

SESSION 1                                       SESSION 2
SQL> @run_test                                  SQL> @run_test

INSTANCE_NUMBER                                 INSTANCE_NUMBER
---------------                                 ---------------
              2                                               1

+000000000 00:08:20.040064000                   +000000000 00:08:15.227200000

PL/SQL procedure successfully completed.        PL/SQL procedure successfully completed.

+000000000 00:08:30.140277000                   +000000000 00:08:35.063616000

PL/SQL procedure successfully completed.        PL/SQL procedure successfully completed.

vì vậy chúng tôi đã tăng từ 8 giây lên 8 PHÚT cho cùng một nhóm công việc.

còn CACHE + ORDER thì sao?

SQL> alter sequence daz_test cache 100 order;

Sequence altered.

SQL> @run_test                                  SQL> @run_test

INSTANCE_NUMBER                                 INSTANCE_NUMBER
---------------                                 ---------------
              2                                               1

+000000000 00:00:25.549392000                   +000000000 00:00:26.157107000

PL/SQL procedure successfully completed.        PL/SQL procedure successfully completed.

+000000000 00:00:26.057346000                   +000000000 00:00:25.919005000

PL/SQL procedure successfully completed.        PL/SQL procedure successfully completed.

vì vậy tóm lại cho 100.000 lần tìm nạp cuộc gọi đơn lẻCACHE NOORDER =8 giâyNOCACHE =8 phútCACHE ORDER =25 giây

đối với thứ tự bộ nhớ cache, oracle thực hiện rất nhiều ping giữa các nút RAC, nhưng nó DOESNT phải ghi nội dung trở lại seq $ cho đến khi dung lượng bộ nhớ cache được sử dụng hết, vì tất cả đều được thực hiện trong bộ nhớ.

Tôi sẽ nếu tôi là bạn, hãy đặt kích thước bộ nhớ cache thích hợp (p.s. kích thước bộ nhớ cache cao không gây tải cho bộ nhớ hộp, vì oracle không lưu trữ tất cả các số trong RAM; chỉ số hiện tại + số cuối cùng) và xem xét ĐẶT HÀNG nếu có nhu cầu.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle - Bảng sao chép - Cấu trúc, ràng buộc dữ liệu và tất cả

  2. Đang thoát các ký tự đại diện trong LIKE

  3. ORA-00903:tên bảng không hợp lệ trên PreparedStatement

  4. Hàm NCHR () trong Oracle

  5. Làm cách nào để chèn vào cột BLOB từ một câu lệnh chèn trong sqldeveloper?