Teknik Indeks Bitmap Oracle

Selamat malam lagi!

Kami meluncurkan aliran kedua dari kursus baru kami "Relational DBMS" , yang kami selesaikan sedikit sesuai dengan hasil pelaksanaan pertama: kelas tambahan pada kluster MySQL dan Postgres ternyata diminati oleh buruh pelabuhan dan berbagai "perbaikan file" lainnya. Jadi harapkan pelajaran terbuka (di mana beberapa topik lama telah diambil) dan materi yang menarik. Hari ini kita mempelajari teknik-teknik Oracle.

Ayo pergi.

Indeks bitmap Oracle sangat berbeda dari indeks B-tree standar. Dalam struktur bitmap, array dua dimensi dibuat dengan kolom untuk setiap baris dalam tabel yang diindeks. Setiap kolom mewakili nilai terpisah dalam indeks bitmap. Array dua dimensi ini menunjukkan setiap nilai indeks dikalikan jumlah baris dalam tabel ini.

Oracle mendekompres bitmap (dengan kecepatan pengambilan garis) ke dalam buffer data RAM untuk pemindaian cepat untuk nilai-nilai yang cocok. Nilai-nilai pencocokan ini diteruskan ke Oracle sebagai daftar ID-Baris, dan nilai ID-Baris dapat langsung mengakses informasi yang diperlukan.



Keuntungan khusus dari pengindeksan bitmap dimanifestasikan ketika satu tabel menyertakan beberapa indeks bitmap. Kekuatan setiap kolom mungkin rendah. Membuat beberapa indeks bitmap memberikan pendekatan yang sangat kuat untuk dengan cepat menanggapi pertanyaan SQL yang kompleks.



Menggunakan metodologi pooling bitmap, Oracle menyediakan pengurangan waktu respons kurang dari satu detik ketika bekerja dengan beberapa kolom dengan sejumlah kecil elemen.

Perhatikan juga catatan penting tentang nilai maksimum indeks bitmap Oracle .

Misalnya, bayangkan bahwa ada basis data mobil dengan sejumlah besar kolom berdaya rendah: car_color, car_make, car_model dan car_year. Setiap kolom berisi kurang dari 100 nilai yang berbeda, dan indeks b-tree akan sama sekali tidak berguna dalam database 20 juta mobil.

Namun, menggabungkan indeks ini ke dalam kueri dapat memberikan waktu respons tinggi jauh lebih cepat daripada metode tradisional membaca masing-masing dari 20 juta baris di tabel dasar. Sebagai contoh, misalkan kita ingin menemukan Toyota Corolla biru tua yang diproduksi pada 1981:

select license_plat_nbr from vehicle where color = "blue" and make = "toyota" and year = 1981; 

Untuk bekerja dengan permintaan ini, Oracle menggunakan metode optimasi khusus yang disebut menggabungkan indeks bitmap. Dalam metode ini, setiap daftar Row-ID (RID singkat) dibentuk secara terpisah menggunakan bitmap, dan prosedur penggabungan khusus digunakan untuk membandingkan daftar RID dan mencari nilai yang tumpang tindih.

Ketika jumlah nilai yang berbeda bertambah, ukuran bitmap meningkat secara eksponensial. Jadi indeks 100 nilai dapat berjalan 1.000 kali lebih cepat daripada indeks bitmap dari 1.000 nilai kolom yang berbeda.

Patut diingat bahwa indeks bitmap hanya cocok untuk tabel statis dan tampilan terwujud yang diperbarui pada malam hari dan dibangun kembali setelah pemuatan batch baris. Jika beberapa DML per detik muncul di tabel Anda, HATI-HATI saat menerapkan indeks bitmap!

  • 1 hingga 7 nilai kunci yang berbeda - Permintaan dengan indeks bitmap daya rendah sangat cepat;
  • 8 - 100 nilai kunci yang berbeda - Ketika jumlah nilai yang berbeda meningkat, produktivitas menurun secara proporsional;
  • 100 - 10.000 nilai berbeda - Dengan lebih dari 100 nilai berbeda, indeks bitmap menjadi besar dan kinerja SQL turun dengan cepat;
  • Lebih dari 10.000 nilai kunci berbeda - pada tahap ini, kinerja sepuluh kali lebih rendah dibandingkan dengan indeks dengan 100 nilai berbeda.

Oracle Bitmap Indexes adalah fitur yang sangat kuat dari Oracle, tetapi ada jebakan!

Anda akan ingin menggunakan indeks bitmap dalam kasus berikut:

  1. Kolom tabel ringan - untuk manual DRAFT, pertimbangkan bitmap untuk indeks apa pun dengan kurang dari 100 nilai yang berbeda:

     select region, count(*) from sales group by region; 
  2. Tabel DML RENDAH - masukkan / perbarui / hapus penggunaan harus rendah. Memperbarui indeks bitmap memerlukan banyak sumber daya, sehingga lebih cocok untuk tabel read-only dan tabel batch-updated setiap malam;
  3. Beberapa kolom - kueri SQL Anda merujuk ke beberapa bidang dengan kardinalitas rendah dalam pernyataan Where. Kehadiran indeks bitmap akan memfasilitasi pekerjaan pengoptimal Oracle, yang membuat perkiraan berdasarkan biaya (singkatnya - CBO (Cost-Based Optimizer)).

Pecahkan Masalah Indeks Bitmap Oracle

Masalah implementasi indeks bitmap yang paling umum meliputi yang berikut:

  • Meja kecil - CBO mungkin memerlukan pemindaian tabel penuh jika terlalu kecil!
  • Statistik buruk - Pastikan Anda menganalisis bitmap dengan dbms_stats segera setelah pembuatan:

 CREATE BITMAP INDEX emp_bitmap_idx ON index_demo (gender); exec dbms_stats.gather_index_stats(OWNNAME=>'SCOTT', INDNAME=>'EMP_BITMAP_IDX'); 

  • Pengujian Tooltip - Untuk menggunakan indeks bitmap baru Anda, gunakan tooltip Oracle INDEX:

 select /*+ index(emp emp_bitmap_idx) */ count(*) from emp, dept where emp.deptno = dept.deptno; 

Kami menunggu pertanyaan dan komentar di sini atau datang ke pelajaran terbuka baru kami.

Source: https://habr.com/ru/post/id433090/


All Articles