Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Nilai Urutan Oracle tidak dipesan

Kedua, Dapatkah saya mencapai pemesanan jika saya mengubah urutan menjadi beNOCACHE terlepas dari ORDER/NOORDER.

ya karena NOCACHE dipesan secara efektif karena Anda memaksa penulisan ke tabel sys.seq$ pada setiap kenaikan, yang juga harus membuat serial di atas node.

--

Saya akan membantah jawaban yang diterima dalam kemungkinan duplikat itu. ada perbedaan besar dalam CACHE + ORDER dan NOCACHE di RAC. Anda tidak meniadakan CACHE dengan ORDER; hanya mengurangi efektivitasnya. Saya pribadi telah melihat kinerja aplikasi tingkat menengah menurun secara drastis karena mereka menggunakan NOCACHE secara berurutan dan mengakses beberapa node sekaligus. Kami mengubah urutan mereka ke ORDER CACHE (karena mereka menginginkan pesanan lintas ras). dan kinerja meningkat secara drastis.

Singkatnya:Kecepatan urutan akan dari yang tercepat ke yang paling lambat sebagai "CACHE NOORDER"->"CACHE ORDER" dan jauh di belakang "NOCACHE".

Ini juga mudah diuji:

Jadi kita mulai dengan urutan standar:

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

Sequence created.

yaitu CACHE tanpa perintah. Sekarang kita jalankan dua sesi. Saya menggunakan database RAC 4 node 10.2.0.4 dalam pengujian ini:

skrip pengujian saya hanya

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;                                                   
/ 
/

sekarang kita jalankan tes pertama (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.

jadi 7-8 detik untuk memilih 100.000 iterasi dari urutan.

Sekarang mari kita coba NOCACHE (ORDER vs NOORDER tidak relevan untuk ini, karena kami memaksa penulisan ke seq$ untuk setiap panggilan ke urutan).

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.

jadi kami melompat dari 8 detik menjadi 8 MENIT untuk set kerja yang sama.

bagaimana dengan CACHE + ORDER?

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.

jadi secara ringkas untuk 100.000 panggilan pengambilanCACHE NOORDER =8 detikNOCACHE =8 menitCACHE ORDER =25 detik

untuk urutan cache, Oracle melakukan banyak ping antara node RAC, tetapi TIDAK harus menulis barang kembali ke seq$ sampai ukuran cache habis, karena semuanya dilakukan di memori.

saya akan jika saya jadi Anda, atur ukuran cache yang sesuai (p.s. ukuran cache yang tinggi tidak membebani memori kotak, karena Oracle tidak menyimpan semua angka dalam RAM; hanya angka + terakhir saat ini) dan pertimbangkan ORDER jika diperlukan.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kembalikan transaksi yang dilakukan

  2. Membatasi catatan yang dikembalikan dari kueri SQL di Oracle

  3. Apakah pernyataan DDL selalu memberi Anda komit implisit, atau bisakah Anda mendapatkan rollback implisit?

  4. Urutan evaluasi klausa Oracle SQL

  5. Bagaimana cara mengembalikan ketika terjadi kesalahan saat menjalankan perintah sql loader?