Bitmap Scan di PostgreSQL

Bitmap Scan adalah salah satu metode pemindaian (scan) yang digunakan oleh PostgreSQL untuk mengambil data dari tabel. Tujuannya adalah untuk mengoptimalkan kueri yang menggunakan indeks dan kondisi yang kompleks, terutama ketika menggabungkan beberapa indeks (misalnya, dengan operator AND atau OR).

Konsep Dasar

Secara sederhana, Bitmap Scan tidak langsung mengambil baris data dari disk. Sebaliknya, ia bekerja dalam dua tahap:

  1. Tahap Bitmap (Bitmap Heap Scan): PostgreSQL menggunakan satu atau lebih indeks untuk membuat bitmap. Bitmap ini adalah peta yang sangat efisien yang mencatat lokasi (blok atau halaman) dari setiap baris yang memenuhi kondisi kueri.

  2. Tahap Pemindaian (Recheck): Setelah peta selesai dibuat, PostgreSQL menggunakan peta tersebut untuk langsung mengakses blok-blok data yang relevan dari tabel. Karena setiap blok mungkin berisi baris data lain yang tidak memenuhi kriteria, PostgreSQL akan melakukan recheck untuk membuang baris-baris yang tidak relevan, sehingga hanya baris yang dibutuhkan yang dikembalikan ke pengguna.

Cara Kerja

Mari kita gunakan analogi untuk memahaminya:

Bayangkan Anda memiliki sebuah perpustakaan yang sangat besar dan Anda ingin mencari semua buku karya penulis A di rak 1 dan semua buku karya penulis B di rak 2.

  • Tanpa Bitmap Scan: Anda akan berjalan menyusuri setiap rak di perpustakaan, dari awal sampai akhir, mengambil setiap buku, memeriksa penulisnya, dan meletakkannya kembali jika tidak cocok. Ini sangat lambat.

  • Dengan Bitmap Scan:

    1. Anda pergi ke katalog penulis A dan membuat daftar semua nomor rak dan buku miliknya.

    2. Anda pergi ke katalog penulis B dan membuat daftar semua nomor rak dan buku miliknya.

    3. Sekarang Anda memiliki "peta" lokasi semua buku yang Anda butuhkan (ini adalah bitmap).

    4. Anda langsung pergi ke setiap rak yang ada di peta, mengambil semua buku di sana, lalu kembali ke meja Anda.

    5. Di meja, Anda memeriksa ulang setiap buku untuk memastikan penulisnya benar (ini adalah recheck). Setelah itu, Anda hanya menyimpan buku-buku yang Anda inginkan.

Dalam analogi ini, recheck diperlukan karena saat Anda mengambil buku dari rak, Anda mungkin mengambil buku lain yang berada di rak yang sama. Recheck memastikan Anda hanya mendapatkan hasil yang benar-benar Anda cari.


Keuntungan dan Kekurangan

Keuntungan:

  • Sangat Efisien untuk AND dan OR: Bitmap Scan dapat menggabungkan hasil dari beberapa indeks dengan sangat cepat, jauh lebih efisien daripada melakukan pemindaian terpisah untuk setiap kondisi.

  • Mengurangi I/O Disk: Dengan memetakan lokasi data terlebih dahulu, PostgreSQL dapat menghindari pemindaian seluruh tabel dan hanya membaca blok-blok data yang benar-benar diperlukan.

Kekurangan:

  • Membutuhkan Recheck: Langkah tambahan recheck dapat menambah overhead CPU jika banyak data yang harus difilter.

  • Tidak selalu terbaik: Untuk kueri yang sangat selektif (misalnya, mencari satu baris unik dengan ID), pemindaian indeks tunggal (Index Scan) jauh lebih cepat karena tidak ada recheck dan hanya satu baris yang perlu diambil.

Last updated