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

Kumpulkan statistik pada Indeks atau jatuhkan buat?

Perbedaannya adalah, mengumpulkan statistik menyegarkan metadata tentang indeks saat ini sedangkan menjatuhkan dan membuat ulang indeks, eh, menjatuhkan dan membuat ulang indeks.

Mungkin mudah untuk memahami perbedaannya dengan contoh yang berhasil. Jadi mari kita buat tabel dan indeks:

SQL> create table t23 
  2  as select object_id as id, object_name as name from user_objects 
  3  /

Table created.

SQL> create index i23 on t23(id)
  2  /

Index created.

SQL> select o.object_id, i.last_analyzed, i.distinct_keys
  2  from user_objects o
  3       join user_indexes i
  4            on (i.index_name = o.object_name)
  5  where o.object_type = 'INDEX'
  6  and i.index_name = 'I23'
  7  /

 OBJECT_ID CREATED              LAST_ANALYZED        DISTINCT_KEYS
---------- -------------------- -------------------- -------------
    116353 23-NOV-2013 00:15:39 23-NOV-2013 00:15:39           167

1 row selected.

SQL> 

Sejak 11g Oracle secara otomatis mengumpulkan statistik ketika kita membuat indeks. Jadi pembuatan indeks dan analisis terakhir menunjukkan waktu yang sama. Di versi sebelumnya kami harus mengumpulkan statistik secara eksplisit setelah kami membuat indeks. Cari tahu lebih lanjut .

Selanjutnya, kami akan menambahkan beberapa data dan menyegarkan statistik:

SQL> insert into t23 values (9999, 'TEST1')
  2  /

1 row created.

SQL> insert into t23 values (-8888, 'TEST 2')
  2  /

1 row created.

SQL> exec dbms_stats.gather_index_stats(user, 'I23') 

PL/SQL procedure successfully completed.

SQL> select o.object_id, i.last_analyzed, i.distinct_keys
  2  from user_objects o
  3       join user_indexes i
  4            on (i.index_name = o.object_name)
  5  where o.object_type = 'INDEX'
  6  and i.index_name = 'I23'
  7  /

 OBJECT_ID CREATED              LAST_ANALYZED        DISTINCT_KEYS
---------- -------------------- -------------------- -------------
    116353 23-NOV-2013 00:15:39 23-NOV-2013 00:26:28           169

1 row selected.

SQL> 

Sekarang metadata yang berkaitan dengan statistik telah berubah tetapi indeks adalah objek database yang sama. Sedangkan jika kita drop dan membuat ulang indeks kita mendapatkan objek database baru:

SQL> drop index i23
  2  /

Index dropped.

SQL> create index i23 on t23(id) 
  2  /

Index created.

SQL> select o.object_id, i.last_analyzed, i.distinct_keys
  2  from user_objects o
  3       join user_indexes i
  4            on (i.index_name = o.object_name)
  5  where o.object_type = 'INDEX'
  6  and i.index_name = 'I23'
  7  /

 OBJECT_ID CREATED              LAST_ANALYZED        DISTINCT_KEYS
---------- -------------------- -------------------- -------------
    116354 23-NOV-2013 00:27:50 23-NOV-2013 00:27:50           169

1 row selected.

SQL> 

Dalam operasi normal, kita hampir tidak perlu menjatuhkan dan membuat ulang indeks. Ini adalah teknik yang terkadang tepat ketika memuat data dalam jumlah yang sangat besar dan dalam kasus korupsi indeks yang sangat jarang. Jalinan masih memunculkan situs yang merekomendasikan pembangunan kembali indeks secara teratur untuk alasan kinerja (diduga itu "menyeimbangkan kembali" indeks miring) tetapi situs ini tidak menghasilkan tolok ukur untuk membuktikan manfaat jangka panjang, dan tentu saja tidak pernah menyertakan waktu dan Siklus CPU terbuang dengan latihan membangun kembali.

Membangun kembali indeks membutuhkan lebih banyak pekerjaan daripada menyegarkan statistik. Jelas benar, karena membangun kembali termasuk mengumpulkan statistik sebagai sub-tugas. Pertanyaannya adalah apakah lebih efisien untuk melakukan DML massal terhadap tabel dengan indeksnya di tempat dibandingkan dengan menjatuhkan indeks dan membuat kembali sesudahnya. Akan lebih cepat untuk memuat data ke dalam tabel tanpa indeks dan membuatnya kembali setelahnya.

Tidak ada aturan keras dan cepat di sini:itu tergantung pada berapa banyak indeks yang Anda miliki, proporsi baris yang terpengaruh terhadap seluruh ukuran tabel , apakah Anda memerlukan indeks untuk menegakkan batasan integritas relasional, dan seterusnya. Ada juga perbedaan besar antara operasi:Anda mungkin ingin menjatuhkan indeks untuk sisipan massal tetapi mempertahankannya untuk pembaruan, tergantung pada indeks apa yang Anda butuhkan untuk klausa WHERE Anda dan apakah pembaruan memengaruhi kolom yang diindeks.

Singkatnya, Anda perlu membandingkan skenario spesifik Anda sendiri. Ini sering menjadi jawaban untuk pertanyaan performa.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Menggunakan Oracle:Bisakah saya menggunakan variabel yang dibuat 'secara dinamis' dalam klausa pivot?

  2. Bagaimana cara mendapatkan bidang dari listagg dalam tanda kutip?

  3. Unit pengujian pernyataan DDL yang perlu dalam transaksi

  4. Oracle.ManagedDataAccess ke AWS RDS DB - TCPS:SSL Wallet (Magic) Tidak Valid

  5. Petunjuk Oracle WITH dan MATERIALIZE bertindak sebagai transaksi otonom untuk fungsi