2012-11-22 34 views
10

thể trùng lặp:
Oracle RAC and sequencesOracle giá trị Chuỗi không ra lệnh

Tôi có một Oracle RAC cấu hình trong môi trường địa phương của tôi. Tôi đã phân tích một vấn đề với Sequnce rằng số được tạo ra bởi nextVal không được sắp xếp. Giả sử lần đầu tiên tôi nhận được giá trị là 1, lần thứ hai nhận được giá trị là 21 (tôi đã cấu hình trình tự như với mặc định CACHE 20 và NOORDER).

Khi tìm kiếm, tôi đã tìm ra giải pháp mà tôi cần để sắp xếp thứ tự. Tôi có câu hỏi mà là lựa chọn tốt hơn để đi với,

1) CACHE và TRÌNH TỰ

2) nocache và TRÌNH TỰ

Tôi muốn biết cái nào ở trên là lựa chọn tốt hơn và tại sao?

Thứ hai, tôi có thể đạt được thứ tự nếu tôi thay đổi trình tự thành NOCACHE không phân biệt ORDER/NOORDER.

Cảm ơn

Trả lời

15

Thứ hai, tôi có thể đạt được thứ tự nếu tôi thay đổi dãy là nocache không phân biệt TRÌNH TỰ/NOORDER.

có khi NOCACHE có hiệu quả khi bạn buộc ghi vào bảng sys.seq $ trên mỗi gia số, cũng phải nối tiếp qua các nút.

-

Tôi sẽ tranh chấp câu trả lời được chấp nhận trong đó có thể trùng lặp. có một sự khác biệt lớn trong CACHE + ORDER và NOCACHE trong RAC. Bạn không phủ nhận 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 tầng giữa bị suy giảm mạnh khi họ sử dụng NOCACHE trên một trình tự và đang truy cập vào 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ó thứ tự chữ thập). và hiệu suất được cải thiện đáng kể.

tóm tắt: Tốc độ chuỗi sẽ từ nhanh nhất đến chậm nhất là "CACHE NOORDER" -> "CACHE ORDER" và cách WAY đằng sau "NOCACHE".

Đây là một cách dễ dàng kiểm chứng quá:

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

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

Sequence created. 

tức CACHE không có trật tự. Bây giờ chúng tôi sẽ thực hiện hai phiên. Tôi đang sử dụng một 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. 

7-8 giây để chọn 100.000 lần lặp của chuỗi.

Bây giờ, hãy thử NOCACHE (ORDER vs NOORDER là không thích hợp cho việc này, vì chúng tôi buộc phải viết thư để seq $ cho mọi cuộc 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 bộ công việc.

CACHE + ORDER là gì?

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. 

như vậy trong bản tóm tắt cho 100.000 cuộc gọi duy nhất lấy về CACHE NOORDER = 8 giây nocache = 8 phút CACHE ORDER = 25 giây

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

tôi sẽ nếu tôi là bạn, đặt kích thước bộ nhớ cache thích hợp (ps kích thước bộ nhớ cache cao không đặt tải trên bộ nhớ hộp, vì oracle không lưu trữ tất cả các số trong RAM; số) và xem xét ĐẶT HÀNG nếu cần.

+0

Cảm ơn, bây giờ tôi có lý do để đi với "Cache & Order" –

+0

: - Tôi đã tự hỏi rằng bạn có thể cho tôi biết các tham số để thiết lập kích thước bộ nhớ cache là gì? –

+0

Chắc chắn. Nó thực sự trong mẫu của tôi. 'Tạo chuỗi x bắt đầu bằng bộ nhớ cache n; 'n là kích thước bộ nhớ cache (cho 0 sử dụng từ khóa nocache thay vì bộ nhớ cache 0) – DazzaL

Các vấn đề liên quan