41

Trong đầu ra của lệnh giải nghĩa, tôi tìm thấy hai thuật ngữ 'Seq Scan' và 'Bitmap heap Scan'. Ai đó có thể cho tôi biết sự khác biệt giữa hai loại quét này là gì? (Tôi đang sử dụng PostgreSQL)Sự khác nhau giữa quét Seq và quét bitmap trong vùng postgres là gì?

+2

Nói một cách đơn giản, "seq quét "không sử dụng các chỉ mục (thường chậm hơn) và tất cả các lần quét khác cố gắng sử dụng các chỉ mục được xác định trong bảng. – Gnudiff

Trả lời

65

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

Về cơ bản, quá trình quét tuần tự đang xảy ra với hàng thực tế, 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 (điều 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 heap bitmap có nghĩa là PostgreSQL đã tìm thấy một tập nhỏ các hàng để tìm nạp (ví dụ, 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 hơn nữa tìm kiếm, do đó, nhanh hơn chỉ khi nó cần một tậ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 ta có thể dễ dàng có được một seq quét:

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ó đã làm một quét tuần tự bởi vì nó ước tính sẽ của nó để lấy phần lớn của bảng ; tìm cách làm điều đó (thay vì đọc to, vô dụng) sẽ là ngớ ngẩn.

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

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 như:

  1. Xây dựng một bitmap của các hàng chúng ta muốn cho a = 4. (Quét chỉ mục bitmap)
  2. Tạo bitmap của các hàng chúng tôi muốn cho a = 3. (Bitmap chỉ số quét)
  3. Hoặc hai bitmap với nhau (BitmapOr)
  4. Nhìn những hàng trong bảng (Bitmap Heap Scan) và kiểm tra để chắc chắn rằng a = 4 hoặc a = 3 (kiểm tra lại cond)

[Vâng, các kế hoạch truy vấn là ngu ngốc, nhưng đó là bởi vì chúng ta thất bại trong việc phân tích test Đã chúng tôi đã phân tích nó, tất cả họ sẽ được quét liên tục, kể từ khi có 5 hàng nhỏ]

+1

Hoặc quét bitmap cũng có thể là một tập con của quét chỉ mục. – WolfmanDragon

+0

@derobert, ý bạn là gì khi "tìm kiếm"? Không thể tìm thấy bất kỳ đề cập nào về nó ở bất kỳ đâu ... – zapadlo

+1

@Zapadlo Tìm kiếm như trong tìm kiếm đĩa, ví dụ: truy cập ngẫu nhiên thay vì tuần tự. – derobert

Các vấn đề liên quan