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

Pengambilan Sampel Dinamis Membunuhku dalam 12c

Sebelas hari yang lalu, saya membuat blog tentang bagaimana Adaptive Dynamic Stats menghabiskan sumber daya di database RAC produksi saya.

Setelah memadamkan api itu, saya akan memeriksa beberapa kueri berkinerja buruk yang dilaporkan oleh orang-orang QA kami di Test dan database non-produksi lainnya. Saya melakukan apa yang akan dilakukan Oracle DBA yang baik. Saya mengumpulkan panggilan prosedur tersimpan yang menggandakan masalah. Dalam sesi saya, saya memulai pelacakan SQL dan menjalankan prosedur tersimpan. Butuh waktu 50 detik untuk menyelesaikannya, padahal biasanya butuh 5 detik atau kurang sebelum saya memutakhirkan dari 11.2.0.4 ke 12.1.0.2. Prosedur tersimpan ini berisi sejumlah pernyataan SQL dan jejak SQL tampak seperti tempat yang logis untuk memulai. Saya perlu mengetahui pernyataan SQL mana dalam prosedur yang menyebabkan masalah.

Saya menjalankan file jejak SQL melalui TKPROF dan terkejut dengan hasilnya. Pernyataan SQL dalam prosedur tersimpan tampaknya dieksekusi dengan cukup cepat. Tapi saya disambut oleh banyak pernyataan yang mirip dengan berikut ini:

SELECT /* DS_SVC */ /*+ dynamic_sampling(0) no_sql_tune no_monitoring
 optimizer_features_enable(default) no_parallel */ SUM(C1)
FROM
 (SELECT /*+ qb_name("innerQuery") INDEX_FFS( "XXX"
 "INDEX_NAME") */ 1 AS C1 FROM
 "OWNER"."TABLE_NAME" SAMPLE BLOCK(71.048, 8) SEED(1)
 "XXX") innerQuery

Ini adalah Sampling Dinamis di tempat kerja. Dalam melihat semua pernyataan Sampling Dinamis yang dieksekusi di file jejak saya, saya dapat menentukan bahwa ini menyumbang 45 detik dari keseluruhan waktu proses! Astaga!

Dynamic Sampling seharusnya membantu saya. Waktu yang dihabiskan untuk mendapatkan beberapa contoh statistik seharusnya jauh lebih kecil daripada jumlah waktu yang dihemat dengan menjalankan pernyataan SQL dengan statistik yang lebih baik. Jika tidak, kinerja pernyataan SQL Anda dapat terganggu, seperti kasus saya.

Saya mencatat satu hal yang menurut saya menarik adalah bahwa kueri Pengambilan Sampel Dinamis ini dieksekusi sekali untuk setiap tabel dan sekali untuk setiap indeksnya. Salah satu tabel yang terlibat dalam kueri saya memiliki 7 indeks, jadi untuk satu tabel itu, saya memiliki 8 kueri Pengambilan Sampel Dinamis!

Dalam posting blog saya 11 hari yang lalu, saya telah menyetel parameter optimizer_dynamic_sampling ke 0, yang menghentikan eksekusi kueri ini. Saya belum  memasukkan perubahan itu ke lingkungan Pengujian kami, jadi saya harus melakukannya. Segera setelah saya melakukannya, kinerja kueri kembali normal. Nilai default parameter ini untuk database saya adalah 2. Nilai default Anda dapat berbeda tergantung pada nilai pengaturan optimizer_features_enable. Menurut posting blog ini, nilai 2 berarti pengambilan sampel dinamis akan dimulai ketika setidaknya salah satu tabel tidak memiliki statistik. Tapi sejujurnya, pengambilan sampel dinamis tidak memberi saya manfaat apa pun dan hanya merugikan saya. Jadi saya akan membiarkannya saja untuk saat ini.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Statistik Dinamis Adaptif Membunuh Performa di 12.1.0.2 RAC

  2. Bagaimana Mengubah Struktur Tabel di Oracle?

  3. Menambahkan nama Skema ke entitas di data Spring?

  4. ORA-12560:TNS:kesalahan adaptor protokol

  5. Bagaimana mengubah format tanggal di database oracle