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ì?
Trả lời
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ư:
- 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)
- Tạo bitmap của các hàng chúng tôi muốn cho a = 3. (Bitmap chỉ số quét)
- Hoặc hai bitmap với nhau (BitmapOr)
- 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ỏ]
Hoặc quét bitmap cũng có thể là một tập con của quét chỉ mục. – WolfmanDragon
@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
@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
- 1. Sự khác biệt giữa quét và khớp trên chuỗi Ruby
- 2. "Quét heap bitmap" trong kế hoạch truy vấn là gì?
- 3. sự khác nhau giữa touchmove và gesturechange là gì?
- 4. Sự khác nhau giữa Bitmap.Clone() và Bitmap (Bitmap) mới là gì?
- 5. Quét bảng và quét chỉ mục trong SQL
- 6. Sự khác nhau giữa Bitmap và Drawable trong Android là gì?
- 7. Vùng quét giới hạn UIScrollview
- 8. Trong Python, sự khác nhau giữa ".append()" và "+ = []" là gì?
- 9. Sự khác nhau giữa == và = trong Prolog là gì?
- 10. Sự khác nhau giữa // và /// trong Visual Studio là gì?
- 11. Sự khác nhau giữa: = và + = trong tạo tệp là gì?
- 12. Sự khác nhau giữa * và. * Trong MATLAB là gì?
- 13. Sự khác nhau giữa $ @ và $ * trong UNIX là gì?
- 14. Sự khác nhau giữa: = và = trong MySQL là gì?
- 15. Sự khác nhau giữa "||" là gì và "hoặc" trong Perl?
- 16. Sự khác nhau giữa 'eq' và '= ~' trong Perl là gì?
- 17. Sự khác nhau giữa 'và #' trong Lisp là gì?
- 18. Sự khác nhau giữa ngữ cảnh ứng dụng Spring và vùng chứa Spring là gì?
- 19. Sự khác nhau giữa VCS và SCM là gì?
- 20. Sự khác nhau giữa ssize_t và ptrdiff_t là gì?
- 21. Sự khác nhau giữa java.lang.Math và java.lang.StrictMath là gì?
- 22. Sự khác nhau giữa static_cast và reinterpret_cast là gì?
- 23. Sự khác nhau giữa init() và window.init() là gì?
- 24. Sự khác nhau giữa fancyLocalization và preferredLanguage là gì?
- 25. Sự khác nhau giữa CreateObject và Wscript.CreateObject là gì?
- 26. Sự khác nhau giữa CellClick và CellMouseClick là gì?
- 27. Sự khác nhau giữa -0 và 0 là gì?
- 28. Sự khác nhau giữa TCHAR và WCHAR là gì?
- 29. Sự khác nhau giữa `DialogInterface.dismiss()` và `DialogInterface.cancel()` là gì?
- 30. Sự khác nhau giữa fill_parent và wrap_content là gì?
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