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

Mengapa Oracle menggunakan DBMS_STATS.GATHER_TABLE_STATS?

Sebagian besar database perusahaan, termasuk Oracle, menggunakan pengoptimal berbasis biaya untuk menentukan rencana kueri yang sesuai untuk pernyataan SQL yang diberikan. Ini berarti pengoptimal menggunakan informasi tentang data untuk menentukan cara mengeksekusi kueri daripada mengandalkan aturan (inilah yang dilakukan oleh pengoptimal berbasis aturan yang lebih lama).

Misalnya, bayangkan sebuah tabel untuk aplikasi pelacakan bug sederhana

CREATE TABLE issues (
  issue_id number primary key,
  issue_text clob,
  issue_status varchar2(10)
);

CREATE INDEX idx_issue_status
    ON issues( issue_status );

Jika saya adalah perusahaan besar, saya mungkin memiliki 1 juta baris di tabel ini. Dari jumlah tersebut, 100 memiliki issue_status dari ACTIVE, 10.000 memiliki issue_status ANTRI, dan 989.900 berstatus LENGKAP. Jika saya ingin menjalankan kueri terhadap tabel untuk menemukan masalah aktif saya

SELECT *
  FROM issues
 WHERE issue_status = 'ACTIVE'

pengoptimal punya pilihan. Itu bisa menggunakan indeks di issue_status lalu lakukan pencarian baris tunggal pada tabel untuk setiap baris dalam indeks yang cocok atau dapat melakukan pemindaian tabel pada issues meja. Paket mana yang lebih efisien akan tergantung pada data yang ada di tabel. Jika Oracle mengharapkan kueri untuk mengembalikan sebagian kecil dari data dalam tabel, menggunakan indeks akan lebih efisien. Jika Oracle mengharapkan kueri untuk mengembalikan sebagian besar data dalam tabel, pemindaian tabel akan lebih efisien.

DBMS_STATS.GATHER_TABLE_STATS adalah apa yang mengumpulkan statistik yang memungkinkan Oracle untuk membuat keputusan ini. Ini memberi tahu Oracle bahwa ada sekitar 1 juta baris dalam tabel, bahwa ada 3 nilai berbeda untuk issue_status kolom, dan bahwa data tidak terdistribusi secara merata. Jadi Oracle tahu menggunakan indeks untuk kueri untuk menemukan semua masalah aktif. Tetapi ia juga mengetahui bahwa ketika Anda berbalik dan mencoba mencari semua masalah yang tertutup

SELECT *
  FROM issues
 WHERE issue_status = 'CLOSED'

bahwa akan lebih efisien untuk melakukan pemindaian tabel.

Mengumpulkan statistik memungkinkan rencana kueri berubah seiring waktu seiring dengan perubahan volume data dan distribusi data. Saat pertama kali menginstal pelacak masalah, Anda akan memiliki sedikit masalah SELESAI dan lebih banyak masalah AKTIF dan ANTRIAN. Seiring waktu, jumlah masalah SELESAI meningkat jauh lebih cepat. Saat Anda mendapatkan lebih banyak baris dalam tabel dan fraksi relatif dari baris yang ada dalam berbagai status berubah, rencana kueri akan berubah sehingga, di dunia ideal, Anda selalu mendapatkan rencana yang paling 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. Bagaimana mengatasi ORA-02014:tidak dapat memilih UNTUK PEMBARUAN dari tampilan dengan DISTINCT, GROUP BY

  2. PLS-00428:klausa INTO diharapkan dalam pernyataan SELECT ini

  3. Oracle 11g:Default ke nilai statis saat kueri tidak menghasilkan apa-apa

  4. Format TANGGAL default Oracle

  5. sql statis vs dinamis