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

Partisi Split Cepat

Saya memiliki tabel yang dipartisi untuk beberapa pencatatan aplikasi. Beberapa tahun yang lalu, saya mempartisi tabel dengan satu partisi per bulan. Saat kita mendekati 2016, saatnya bagi saya untuk menambahkan partisi untuk tahun baru. Tabel yang dipartisi memiliki, sebagai dua partisi terakhirnya, partisi untuk Desember 2015 dan partisi menggunakan MAXVALUE. Saya tidak pernah berencana memiliki data apa pun di partisi MAXVALUE. Itu hanya untuk membuat operasi SPLIT PARTITION lebih mudah.

Sebelumnya, saya akan menambahkan partisi dengan perintah yang mirip dengan berikut ini:

ALTER TABLE pelacakan_penggunaan
SPLIT PARTITION usage_tracking_pmax AT (TO_DATE('02/01/2016 00:00:00','MM/DD/YYYY HH24:MI:SS))
INTO (PARTITION usage_tracking_p201601, PARTITION usage_tracking_pmax);
ALTER TABLE pelacakan_penggunaan
SPLIT PARTITION usage_tracking_pmax AT (TO_DATE('03/01/2016 00:00:00','MM/DD/YYYY HH24:MI:SS'))
INTO (PARTITION usage_tracking_p201602, PARTITION usage_tracking_pmax);

Pernyataan SQL di atas akan membagi partisi MAXVALUE menjadi dua partisi. Ada 12 perintah seperti itu, satu untuk setiap bulan.

Tahun ini, ketika saya mencoba menjalankan skrip untuk 2016 di lingkungan non-produksi, saya terkejut menemukan perintah ini membutuhkan waktu sekitar 30 menit untuk menyelesaikannya. Pada tahun-tahun sebelumnya, mereka selesai dalam hitungan detik. Ingat bahwa USAGE_TRACKING_PMAX kosong sehingga tidak ada data yang perlu dipindahkan ke partisi yang sesuai.

Dalam menganalisis aktivitas sesi saya yang melakukan SPLIT, saya dapat dengan jelas melihat peristiwa tunggu file db yang dilacak ke tabel yang dipartisi ini. Jelas bahwa operasi SPLIT sedang membaca partisi max, meskipun itu kosong.

Tahun-tahun sebelumnya bekerja dengan baik, tetapi database ini baru-baru ini ditingkatkan ke Oracle 12c. Saya menemukan informasi tentang cara melakukan operasi partisi split cepat di MOS Note 1268714.1 yang mengatakan ini berlaku untuk Oracle 10.2.0.3 dan lebih tinggi, tetapi saya tidak memiliki masalah apa pun di 11.2.0.4. Itu mungkin hanya keberuntungan yang bodoh dan saya tidak memiliki database 11g untuk memeriksa ini karena semua milik saya telah ditingkatkan. Karena itu, daripada berfokus pada apa yang berubah, saya hanya akan mengatasi masalah dan melanjutkan hari saya.

Per catatan MOS, untuk melakukan partisi split cepat pada partisi kosong ini, saya perlu memastikan bahwa saya memiliki statistik pada partisi kosong.

Saya mengkonfirmasi bahwa NUM_ROWS adalah 0 untuk partisi kosong ini. Jadi saya tidak perlu menghitung statistik pada partisi. Operasi SPLIT PARTITION pertama saya sangat cepat, hanya beberapa detik. Partisi itu kosong dan Oracle tahu itu. Yang mengejutkan saya adalah bahwa partisi baru, USAGE_TRACKING_P201601 dan USAGE_TRACKING_PMAX pergi ke nilai NULL untuk statistik. Ini berarti bahwa melakukan operasi SPLIT PARTITION untuk partisi baru kedua akan memakan waktu lama. Berikut adalah contoh dari apa yang saya maksud. Pertama, kita bisa melihat 0 baris di partisi nilai maksimal.

SQL> pilih num_rows dari dba_tab_partitions
  2  where partition_name='USAGE_TRACKING_PMAX';
 
  NUM_ROWS
-----------sebelum> 
         0

Sekarang saya akan membagi partisi itu.

SQL> ALTER TABLE penggunaan_tracking
  2  SPLIT PARTITION usage_tracking_pmax AT ( TO_DATE('02/01/2016 00:00:00','MM/DD/YYYY HH24:MI:SS') )
  3  INTO (PARTITION usage_tracking_p201601, PARTITION usage_tracking_pmax);
 
Tabel diubah.
Berlalu:00:00:03.13

Perhatikan sekarang bahwa dua partisi terakhir sekarang tidak memiliki statistik.

SQL> pilih num_rows dari dba_tab_partitions
  2  where partition_name='USAGE_TRACKING_PMAX';
 
  NUM_ROWS
-----------sebelum> 
 
 
SQL> pilih num_rows dari dba_tab_partitions
  2  where partition_name='USAGE_TRACKING_P201601';
 
  NUM_ROWS
-----------sebelum> 
 
 

Tanpa statistik, partisi split berikutnya untuk membuat partisi Februari 2016 membutuhkan waktu lama.

SQL> ALTER TABLE nau_system.usage_tracking
  2  SPLIT PARTITION usage_tracking_pmax AT (TO_DATE('03/01/2016 00:00:00','MM/DD/YYYY HH24:MI:SS'))
  3  INTO (PARTITION usage_tracking_p201602, PARTITION usage_tracking_pmax);
 
Tabel diubah.
Berlalu:00:27:41.09

Seperti yang dikatakan catatan MOS, kita memerlukan statistik pada partisi untuk melakukan operasi split cepat. Solusinya adalah dengan menghitung statistik pada partisi, dan kemudian menggunakan satu perintah ALTER TABLE untuk membuat semua partisi sekaligus.

MULAI
 DBMS_STATS.gather_table_stats (tabname=>'USAGE_TRACKING',
 partname => 'USAGE_TRACKING_PMAX',
 perincian => 'PARTISI');
 END;
 /
ALTER TABLE pelacakan_penggunaan
SPLIT PARTITION usage_tracking_pmax INTO
 (PARTITION usage_tracking_p201601 NILAI KURANG DARI (TO_DATE('02/01/2016 00:00:00','MM/DD/YYYY HH24:MI:SS')),
  PARTITION usage_tracking_p201602 NILAI KURANG DARI (TO_DATE('03/01/2016 00:00:00','MM/DD/YYYY HH24:MI:SS')),
  PARTITION usage_tracking_p201603 NILAI KURANG DARI (TO_DATE('04/01/2016 00:00:00','MM/DD/YYYY HH24:MI:SS')),
  PARTITION usage_tracking_p201604 NILAI KURANG DARI (TO_DATE('05/01/2016 00:00:00','MM/DD/YYYY HH24:MI:SS')),
  PARTITION usage_tracking_p201605 NILAI KURANG DARI (TO_DATE('06/01/2016 00:00:00','MM/DD/YYYY HH24:MI:SS')),
  PARTITION usage_tracking_p201606 NILAI KURANG DARI (TO_DATE('07/01/2016 00:00:00','MM/DD/YYYY HH24:MI:SS')),
  PARTITION usage_tracking_p201607 NILAI KURANG DARI (TO_DATE('08/01/2016 00:00:00','MM/DD/YYYY HH24:MI:SS')),
  PARTITION usage_tracking_p201608 NILAI KURANG DARI (TO_DATE('09/01/2016 00:00:00','MM/DD/YYYY HH24:MI:SS')),
  PARTITION usage_tracking_p201609 NILAI KURANG DARI (TO_DATE('10/01/2016 00:00:00','MM/DD/YYYY HH24:MI:SS') ),
  PARTITION usage_tracking_p201610 NILAI KURANG DARI (TO_DATE('11/01/2016 00:00:00','MM/DD/YYYY HH24:MI:SS') ),
  PARTITION usage_tracking_p201611 NILAI KURANG DARI (TO_DATE('12/01/2016 00:00:00','MM/DD/YYYY HH24:MI:SS') ),
  PARTITION usage_tracking_p201612 NILAI KURANG DARI (TO_DATE('01/01/2017 00:00:00','MM/DD/YYYY HH24:MI:SS') ),
  PARTITION usage_tracking_pmax);

Jika saya akan membiarkan skrip melakukan 12 operasi PARTISI SPLIT individu, maka saya perlu menghitung ulang statistik pada partisi maksimal di antara masing-masing. Menggunakan satu perintah lebih efisien.


  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 SQL :stempel waktu di mana klausa

  2. Bagaimana cara mengekspor data dengan Oracle SQL Developer?

  3. GROUP BY dengan MAX(DATE)

  4. Mengkonfigurasi koneksi antara klien dan server Oracle 10g

  5. Oracle LIMIT setara dengan n,m