PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Apa perbedaan antara Seq Scan dan Bitmap heap scan di postgres?

http://www.postgresql.org/docs/8.2/static /using-explain.html

Pada dasarnya, pemindaian sekuensial menuju ke baris yang sebenarnya, dan mulai membaca dari baris 1, dan melanjutkan hingga kueri terpenuhi (ini mungkin bukan seluruh tabel, misalnya, dalam kasus limit)

Pemindaian heap bitmap berarti bahwa PostgreSQL telah menemukan sebagian kecil baris untuk diambil (mis., dari indeks), dan hanya akan mengambil baris tersebut. Ini tentu saja akan membutuhkan lebih banyak pencarian, jadi lebih cepat hanya jika dibutuhkan sebagian kecil dari baris.

Ambil contoh:

create table test (a int primary key, b int unique, c int);
insert into test values (1,1,1), (2,2,2), (3,3,3), (4,4,4), (5,5,5);

Sekarang, kita dapat dengan mudah mendapatkan pemindaian seq:

explain select * from test where a != 4

                       QUERY PLAN                        
---------------------------------------------------------
 Seq Scan on test  (cost=0.00..34.25 rows=1930 width=12)
   Filter: (a <> 4)

Itu melakukan pemindaian berurutan karena memperkirakan akan mengambil sebagian besar tabel; berusaha melakukan itu (daripada membaca besar-besaran tanpa pencarian) akan menjadi konyol.

Sekarang, kita dapat menggunakan indeks:

explain select * from test where a = 4 ;
                              QUERY PLAN                              
----------------------------------------------------------------------
 Index Scan using test_pkey on test  (cost=0.00..8.27 rows=1 width=4)
   Index Cond: (a = 4)

Dan akhirnya, kita bisa mendapatkan beberapa operasi bitmap:

explain select * from test where a = 4 or a = 3;
                                  QUERY PLAN                                  
------------------------------------------------------------------------------
 Bitmap Heap Scan on test  (cost=8.52..13.86 rows=2 width=12)
   Recheck Cond: ((a = 4) OR (a = 3))
   ->  BitmapOr  (cost=8.52..8.52 rows=2 width=0)
         ->  Bitmap Index Scan on test_pkey  (cost=0.00..4.26 rows=1 width=0)
               Index Cond: (a = 4)
         ->  Bitmap Index Scan on test_pkey  (cost=0.00..4.26 rows=1 width=0)
               Index Cond: (a = 3)

Kita dapat membaca ini sebagai:

  1. Buat bitmap dari baris yang kita inginkan untuk a=4. (Pemindaian indeks bitmap)
  2. Buat bitmap dari baris yang kita inginkan untuk a=3. (Pemindaian indeks bitmap)
  3. Atau dua bitmap bersama-sama (BitmapOr)
  4. Lihat baris tersebut di tabel (Bitmap Heap Scan) dan periksa untuk memastikan a=4 atau a=3 (periksa ulang cond)

[Ya, rencana kueri ini bodoh, tapi itu karena kami gagal menganalisis test Jika kami menganalisisnya, semuanya akan menjadi pemindaian berurutan, karena ada 5 baris kecil]




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. kunci baris sampai selanjutnya pilih postgres

  2. Menginstal pgroonga di macosx (dengan Postgres.app)

  3. Cara menyisipkan beberapa baris menggunakan fungsi di PostgreSQL

  4. Bagaimana cara membagi satu baris menjadi beberapa baris dengan satu kueri?

  5. Postgres Tertanam untuk Tes Boot Musim Semi