PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Sự khác biệt giữa Seq Scan và Bitmap heap scan trong postgres là gì?

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

Về cơ bản, quá trình quét tuần tự sẽ đến các hàng thực và bắt đầu đọc từ hàng 1 và tiếp tục cho đến khi truy vấn được thỏa mãn (đây có thể không phải là toàn bộ bảng, ví dụ:trong trường hợp giới hạn)

Quét đống bitmap có nghĩa là PostgreSQL đã tìm thấy một tập hợp con nhỏ các hàng để tìm nạp (ví dụ:từ một chỉ mục) và sẽ chỉ tìm nạp các hàng đó. Điều này tất nhiên sẽ có nhiều tìm kiếm hơn, vì vậy chỉ nhanh hơn khi nó cần một tập hợp con nhỏ của các hàng.

Lấy một ví dụ:

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);

Bây giờ, chúng tôi có thể dễ dàng quét 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)

Nó thực hiện quét tuần tự vì nó ước tính nó sẽ chiếm phần lớn bảng; tìm cách làm điều đó (thay vì một bài đọc lớn, không cần tìm kiếm) sẽ là điều ngớ ngẩn.

Bây giờ, chúng ta có thể sử dụng chỉ mục:

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)

Và cuối cùng, chúng ta có thể nhận được một số hoạt động 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)

Chúng ta có thể đọc cái này là:

  1. Xây dựng một bitmap của các hàng mà chúng ta muốn cho a =4. (Quét chỉ mục bitmap)
  2. Xây dựng một bitmap của các hàng mà chúng ta muốn cho a =3. (Quét chỉ mục bitmap)
  3. Hoặc hai bitmap cùng nhau (BitmapOr)
  4. Tra cứu các hàng đó trong bảng (Quét đống bitmap) và kiểm tra để đảm bảo a =4 hoặc a =3 (kiểm tra lại điều kiện)

[Đúng, những kế hoạch truy vấn này thật ngu ngốc, nhưng đó là do chúng tôi không phân tích được test Nếu chúng tôi phân tích nó, tất cả chúng sẽ được quét tuần tự, vì có 5 hàng nhỏ]




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Postgres làm ơn / pgsql LỖI:column column_name không tồn tại

  2. CẬP NHẬT toàn bộ hàng trong PL / pgSQL

  3. Làm cách nào để chạy ứng dụng python và postgres trong một vùng chứa docker?

  4. Làm cách nào để kích hoạt trình biên dịch hàm PostgreSQL?

  5. Làm cách nào để đặt ràng buộc bảng có thể hoãn lại ban đầu trong mô hình django?