在解釋命令的輸出中,我找到了兩個術語'Seq Scan'和'Bitmap heap Scan'。有人能告訴我這兩種掃描有什麼區別嗎? (我使用PostgreSQL)postgres中的Seq掃描和位圖堆掃描有什麼區別?
41
A
回答
65
http://www.postgresql.org/docs/8.2/static/using-explain.html
基本上,按順序進行掃描是要實際行,並開始從第1行讀取,並繼續下去,直到查詢被滿足(這可能不是整個表,例如,在限制的情況下)
位圖堆掃描意味着PostgreSQL已經找到了一小部分要讀取的行(例如,從索引),並且將僅獲取那些行。這當然會有更多的搜索,所以只有當它需要一小部分行時才更快。
拿一個例子:
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);
現在,我們可以很容易地得到一個序列掃描:
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)
它沒有按順序進行掃描,因爲它估計它要搶在絕大多數的表;試圖做到這一點(而不是一個大的,不尋常的閱讀)將是愚蠢的。現在
,我們可以使用索引:
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)
最後,我們可以得到一些位圖操作:
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)
我們可以看這是:
- 構建我們希望a = 4的行的位圖。 (位圖索引掃描)
- 構建我們想要的a = 3的位圖。 (位圖索引掃描)
- 或者兩個位圖一起(BitmapOr)
- 看那些行了在該表(位圖堆掃描),並檢查,以確保一個= 4或= 3(複檢COND)
[是,這些查詢計劃是愚蠢的,但那是因爲我們沒有分析test
如果我們分析它,他們全是順序掃描,因爲有5個微小行]
+1
或者位圖掃描也可以是索引掃描的子集。 – WolfmanDragon 2010-01-04 16:51:56
相關問題
- 1. greenplum中的表掃描和seq掃描有什麼區別
- 2. 表掃描和聚簇索引掃描有什麼區別?
- 3. 主動掃描和被動掃描有什麼區別?
- 4. Postgres緩慢的位圖堆掃描
- 5. 什麼是PNO的區別掃描和WLAN預設掃描?
- 6. Postgres:加速位圖堆掃描?
- 7. 一次掃描(掃描)和兩次掃描(掃描)之間的區別
- 8. 如何確定位圖堆掃描和索引掃描?
- 9. 索引掃描,表掃描和索引查找有什麼區別?
- 10. 在Hbase中,ResultScanner和initTableMapperJob之間的掃描有什麼區別
- 11. postgres如何決定是使用索引掃描還是seq掃描?
- 12. SELECT DISTINCT,擺脫位圖堆的掃描
- 13. 什麼是查詢計劃中的「位圖堆掃描」?
- 14. 解析器和掃描儀有什麼區別?
- 15. Ruby字符串掃描和匹配有什麼區別
- 16. 瞭解postgres解釋瓦特/位圖堆/索引掃描
- 17. 掃描,掃描儀類
- 18. GIN索引有什麼問題,無法避免SEQ掃描?
- 19. 位圖掃描0,跨越
- 20. Eclipse插件掃描器和分區掃描器
- 21. 執行seq掃描的Postgres查詢優化
- 22. 爲什麼QO選擇聚簇索引掃描與表掃描?
- 23. Seq Scan在桌上掃描的原因是什麼?
- 24. 範圍掃描vs唯一掃描vs跳過掃描
- 25. Multipage WIA掃描(docfeeder)掃描1頁並阻止掃描器
- 26. 掃描儀不掃描我的輸入
- 27. 掃描儀內的掃描儀錯誤
- 28. 掃描20次的Wifi掃描儀
- 29. 如何識別掃描標籤的條碼掃描器?
- 30. java掃描儀和圖案
簡單地說,「以次掃描「不使用索引(通常較慢),並且所有其他掃描嘗試使用表中定義的索引。 – Gnudiff 2009-01-04 08:33:59