{"kind": "plan", "major": "18", "item": {"slug": "bitmap-heap-scan", "name": "Bitmap Heap Scan", "name_zh": "BitmapHeapScan", "category": "\u626b\u63cf", "summary": "\u8bbf\u95ee\u4f4d\u56fe\u9009\u4e2d\u7684\u5806\u9875\uff0c\u5e76\u6267\u884c\u5fc5\u8981\u7684\u91cd\u68c0\u3002", "aliases": ["Bitmap Heap Scan", "BitmapHeapScan", "T_BitmapHeapScan"], "content_hash": "48cbc2e31ae1de92cdfbb906238bcbb3efd41819d9034c4a81fcd3893992088e", "versions": {"10": {"facts": [{"label": "\u6838\u5fc3\u8282\u70b9\u6807\u7b7e", "value": "T_BitmapHeapScan"}, {"label": "\u7ed3\u6784\u5316 EXPLAIN \u8282\u70b9\u7c7b\u578b", "value": "Bitmap Heap Scan"}, {"label": "\u8f93\u5165", "value": "\u5143\u7ec4\u4f4d\u7f6e\u4f4d\u56fe\u53ca\u5173\u7cfb"}, {"label": "\u8f93\u51fa", "value": "\u6ee1\u8db3\u6761\u4ef6\u7684\u5806\u5143\u7ec4"}, {"label": "\u6267\u884c\u5668\u521d\u59cb\u5316\u51fd\u6570", "value": "ExecInitBitmapHeapScan"}, {"label": "\u5185\u5b58\u673a\u5236", "value": "unclassified"}], "memory": {"evidence": [{"url": "https://ftp.postgresql.org/pub/source/v10.23/postgresql-10.23.tar.bz2", "path": "src/backend/executor/nodeBitmapHeapscan.c", "label": "src/backend/executor/nodeBitmapHeapscan.c", "sha256": "0664c97e7ab560a379238f0fbb24dd01661688bec4093bc9d13ba21e403cbc8c", "archive_sha256": "94a4b2528372458e5662c18d406629266667c437198160a18cdfd2c4a4d6eee9"}], "mechanism": "unclassified", "description": "\u672c\u6b21\u62bd\u53d6\u4e0d\u4e3a\u6b64\u8282\u70b9\u8bbe\u5b9a\u7edf\u4e00\u7684\u5185\u5b58\u4e0a\u9650\u6216\u843d\u76d8\u7b56\u7565\u3002\u8bf7\u67e5\u770b\u540c\u4e00\u6784\u5efa\u7684\u5b9e\u73b0\u3001\u76f8\u5173\u8868\u8fbe\u5f0f\u6216\u63d0\u4f9b\u65b9\u3002", "source_notes": ["If we are using lossy info, we have to recheck the qual conditions at every tuple.", "We need two separate strategies for lossy and non-lossy cases.", "Bitmap is non-lossy, so we just look through the offsets listed in tbmres; but we have to follow any HOT chain starting at each such offset.", "Bitmap is lossy, so we must examine each item pointer on the page. But we can ignore HOT chains, since we'll check each tuple anyway."]}, "tables": [{"key": "explain-labels", "rows": [{"label": "Bitmap Heap Scan", "identity": "Bitmap Heap Scan"}], "title": "\u672c\u6784\u5efa\u4e2d\u7684 EXPLAIN \u6807\u7b7e", "columns": [{"key": "label", "label": "\u6587\u672c\u683c\u5f0f\u6807\u7b7e"}, {"key": "identity", "label": "\u7ed3\u6784\u5316\u8282\u70b9\u6807\u8bc6"}]}], "related": [{"url": "/wiki/sql/explain/?v=10", "label": "EXPLAIN"}, {"url": "/docs/10/using-explain.html", "label": "\u4f7f\u7528 EXPLAIN"}, {"url": "/docs/10/parallel-plans.html", "label": "\u5e76\u884c\u8ba1\u5212"}, {"url": "/wiki/guc/enable_bitmapscan/?v=10", "label": "enable_bitmapscan"}], "release": {"ref": "PostgreSQL 10.23 source archive", "label": "10.23", "major": "10", "channel": "historical", "revision": "94a4b2528372458e5662c18d406629266667c437198160a18cdfd2c4a4d6eee9", "source_url": "https://ftp.postgresql.org/pub/source/v10.23/postgresql-10.23.tar.bz2", "source_snapshot_utc": ""}, "sources": [{"url": "https://ftp.postgresql.org/pub/source/v10.23/postgresql-10.23.tar.bz2", "line": 953, "path": "src/backend/commands/explain.c", "label": "src/backend/commands/explain.c:953", "sha256": "a785298532047cfeda969e78c3597a343dc1c56d61ba85830b0f16a02a14b5a1", "archive_sha256": "94a4b2528372458e5662c18d406629266667c437198160a18cdfd2c4a4d6eee9"}, {"url": "https://ftp.postgresql.org/pub/source/v10.23/postgresql-10.23.tar.bz2", "line": 232, "path": "src/backend/executor/execProcnode.c", "label": "src/backend/executor/execProcnode.c:232", "sha256": "cea76648bb38ae55f18f989768bee1a4ee025691ceea0f86bccb29dcdc166acc", "archive_sha256": "94a4b2528372458e5662c18d406629266667c437198160a18cdfd2c4a4d6eee9"}, {"url": "https://ftp.postgresql.org/pub/source/v10.23/postgresql-10.23.tar.bz2", "path": "src/backend/executor/nodeBitmapHeapscan.c", "label": "src/backend/executor/nodeBitmapHeapscan.c", "sha256": "0664c97e7ab560a379238f0fbb24dd01661688bec4093bc9d13ba21e403cbc8c", "archive_sha256": "94a4b2528372458e5662c18d406629266667c437198160a18cdfd2c4a4d6eee9"}, {"url": "https://ftp.postgresql.org/pub/source/v10.23/postgresql-10.23.tar.bz2", "path": "src/include/nodes/plannodes.h", "label": "src/include/nodes/plannodes.h", "sha256": "d562c321108844798cd234303fffb618f13d4ee3f3a5ac79bfd963b077e47c22", "archive_sha256": "94a4b2528372458e5662c18d406629266667c437198160a18cdfd2c4a4d6eee9"}, {"url": "https://pg.center/docs/10/parallel-plans.html#PARALLEL-SCANS", "path": "parallel-plans.html", "label": "PostgreSQL 10.23 \u00b7 parallel-plans", "sha256": "cd37ed0ef7e2cf177707f50d9a7258574b4cefdcc087e6ee99a3bf377d960fcb", "language": "en", "original_url": "/docs/10/parallel-plans.html#PARALLEL-SCANS"}, {"url": "https://pg.center/docs/10/using-explain.html#USING-EXPLAIN-BASICS", "path": "using-explain.html", "label": "PostgreSQL 10.23 \u00b7 using-explain", "sha256": "a4b4304aedb0a2da0145cc7c35b03b319a5c7ee3df35a8ef84ab6d3a610f98f3", "language": "en", "original_url": "/docs/10/using-explain.html#USING-EXPLAIN-BASICS"}], "node_tag": "T_BitmapHeapScan", "sections": [{"title": "EXPLAIN \u540d\u79f0\u4e0e\u5c5e\u6027", "paragraphs": ["\u7ed3\u6784\u5316\u683c\u5f0f\u4f7f\u7528\u4e0a\u8ff0 Node Type\u3002\u6587\u672c\u683c\u5f0f\u540d\u79f0\u8fd8\u53ef\u80fd\u5305\u542b\u64cd\u4f5c\u3001\u7b56\u7565\u3001\u8fde\u63a5\u7c7b\u578b\u3001\u626b\u63cf\u65b9\u5411\u6216\u805a\u5408\u9636\u6bb5\u5c5e\u6027\u3002", "\u6b64\u6e90\u7801\u8bb0\u5f55\u7684\u6587\u672c\u540d\u79f0\uff1aBitmap Heap Scan.", "\u5e76\u884c\u611f\u77e5\u4e0e\u5e76\u884c\u5b89\u5168\u662f\u4e0d\u540c\u7684\u8ba1\u5212\u5c5e\u6027\u3002\u5728\u5e76\u884c\u5de5\u4f5c\u8fdb\u7a0b\u5185\u8fd0\u884c\u7684\u8282\u70b9\u4e0d\u4e00\u5b9a\u662f\u5e76\u884c\u611f\u77e5\u8282\u70b9\u3002"]}, {"title": "\u5185\u5b58\u4e0e\u4e34\u65f6\u5b58\u50a8", "paragraphs": ["\u672c\u6b21\u62bd\u53d6\u4e0d\u4e3a\u6b64\u8282\u70b9\u8bbe\u5b9a\u7edf\u4e00\u7684\u5185\u5b58\u4e0a\u9650\u6216\u843d\u76d8\u7b56\u7565\u3002\u8bf7\u67e5\u770b\u540c\u4e00\u6784\u5efa\u7684\u5b9e\u73b0\u3001\u76f8\u5173\u8868\u8fbe\u5f0f\u6216\u63d0\u4f9b\u65b9\u3002", "\u4f7f\u7528\u6709\u635f\u4fe1\u606f\u65f6\uff0c\u5fc5\u987b\u5bf9\u6bcf\u4e2a\u5143\u7ec4\u91cd\u65b0\u68c0\u67e5\u6761\u4ef6\u3002", "\u6709\u635f\u548c\u65e0\u635f\u4e24\u79cd\u60c5\u51b5\u9700\u8981\u5206\u522b\u91c7\u7528\u4e0d\u540c\u7b56\u7565\u3002", "\u4f4d\u56fe\u662f\u65e0\u635f\u7684\uff0c\u56e0\u6b64\u53ea\u9700\u904d\u5386 tbmres \u5217\u51fa\u7684\u504f\u79fb\u91cf\uff0c\u4f46\u5fc5\u987b\u6cbf\u6bcf\u4e2a\u504f\u79fb\u91cf\u8d77\u59cb\u7684 HOT \u94fe\u7ee7\u7eed\u68c0\u67e5\u3002", "\u4f4d\u56fe\u662f\u6709\u635f\u7684\uff0c\u56e0\u6b64\u5fc5\u987b\u68c0\u67e5\u9875\u9762\u4e2d\u7684\u6bcf\u4e2a\u9879\u76ee\u6307\u9488\u3002\u7531\u4e8e\u6bcf\u4e2a\u5143\u7ec4\u90fd\u4f1a\u88ab\u68c0\u67e5\uff0c\u53ef\u4ee5\u5ffd\u7565 HOT \u94fe\u3002"]}, {"title": "\u5e76\u884c\u6267\u884c\u4e0e\u8fd0\u884c\u4fe1\u606f\u91c7\u96c6", "paragraphs": ["\u4ee5\u4e0b\u6e90\u7801\u56de\u8c03\u53ef\u4ee5\u534f\u8c03\u6267\u884c\u6216\u6536\u96c6\u5de5\u4f5c\u8fdb\u7a0b\u7684\u6d4b\u91cf\u6570\u636e\u3002\u56de\u8c03\u5b58\u5728\u4e0d\u4ee3\u8868\u8be5\u8282\u70b9\u666e\u904d\u652f\u6301\u5171\u4eab\u5e76\u884c\u626b\u63cf\u6216\u5171\u4eab\u72b6\u6001\u3002", "\u6b64\u6784\u5efa\u7684\u56de\u8c03\uff1aExecBitmapHeapEstimate, ExecBitmapHeapInitializeDSM, ExecBitmapHeapInitializeWorker, ExecBitmapHeapReInitializeDSM."]}, {"title": "\u540c\u7248\u672c\u624b\u518c\u8bf4\u660e", "paragraphs": ["\u5728 \u5e76\u884c\u4f4d\u56fe\u5806\u626b\u63cf \u4e2d\uff0c\u4f1a\u9009\u62e9\u4e00\u4e2a\u8fdb\u7a0b\u4f5c\u4e3a\u9886\u5bfc\u8005\u3002\u8be5\u8fdb\u7a0b\u6267\u884c\u4e00\u4e2a\u6216\u591a\u4e2a\u7d22\u5f15\u626b\u63cf\uff0c\u5e76\u6784\u5efa\u4e00\u4e2a\u4f4d\u56fe\uff0c\u4ee5\u6307\u793a\u9700\u8981\u8bbf\u95ee\u54ea\u4e9b\u8868\u5757\u3002\u7136\u540e\u8fd9\u4e9b\u5757\u4f1a\u50cf\u5e76\u884c\u987a\u5e8f\u626b\u63cf\u90a3\u6837\u5206\u914d\u7ed9\u534f\u4f5c\u8fdb\u7a0b\u3002\u6362\u53e5\u8bdd\u8bf4\uff0c\u5806\u626b\u63cf\u662f\u5e76\u884c\u6267\u884c\u7684\uff0c\u4f46\u5e95\u5c42\u7d22\u5f15\u626b\u63cf\u4e0d\u662f\u3002"]}, {"title": "\u672c\u7248\u624b\u518c\u4e2d\u7684\u793a\u4f8b", "blocks": [{"code": "EXPLAIN SELECT * FROM tenk1 WHERE unique1 < 100;\n\n                                  QUERY PLAN\n------------------------------------------------------------------------------\n Bitmap Heap Scan on tenk1  (cost=5.07..229.20 rows=101 width=244)\n   Recheck Cond: (unique1 < 100)\n   ->  Bitmap Index Scan on tenk1_unique1  (cost=0.00..5.04 rows=101 width=0)\n         Index Cond: (unique1 < 100)", "source": {"url": "/docs/10/using-explain.html#USING-EXPLAIN-BASICS", "path": "using-explain.html", "label": "PostgreSQL 10.23 \u00b7 using-explain", "sha256": "a4b4304aedb0a2da0145cc7c35b03b319a5c7ee3df35a8ef84ab6d3a610f98f3"}, "paragraphs": ["\u793a\u4f8b\u6458\u81ea PostgreSQL 10.23 \u624b\u518c\uff1b\u672c\u767e\u79d1\u672a\u5b9e\u9645\u6267\u884c\u6b64\u793a\u4f8b\u3002", "\u73b0\u5728\u8fdb\u4e00\u6b65\u6536\u7d27\u6761\u4ef6\uff1a"]}, {"code": "EXPLAIN SELECT * FROM tenk1 WHERE unique1 < 100 AND stringu1 = 'xxx';\n\n                                  QUERY PLAN\n------------------------------------------------------------------------------\n Bitmap Heap Scan on tenk1  (cost=5.04..229.43 rows=1 width=244)\n   Recheck Cond: (unique1 < 100)\n   Filter: (stringu1 = 'xxx'::name)\n   ->  Bitmap Index Scan on tenk1_unique1  (cost=0.00..5.04 rows=101 width=0)\n         Index Cond: (unique1 < 100)", "source": {"url": "/docs/10/using-explain.html#USING-EXPLAIN-BASICS", "path": "using-explain.html", "label": "PostgreSQL 10.23 \u00b7 using-explain", "sha256": "a4b4304aedb0a2da0145cc7c35b03b319a5c7ee3df35a8ef84ab6d3a610f98f3"}, "paragraphs": ["\u793a\u4f8b\u6458\u81ea PostgreSQL 10.23 \u624b\u518c\uff1b\u672c\u767e\u79d1\u672a\u5b9e\u9645\u6267\u884c\u6b64\u793a\u4f8b\u3002", "\u73b0\u5728\u5411 WHERE \u5b50\u53e5\u518d\u6dfb\u52a0\u4e00\u4e2a\u6761\u4ef6\uff1a"]}]}, {"title": "\u6267\u884c\u5668\u5b9e\u73b0\u8bf4\u660e", "paragraphs": ["nodeBitmapHeapscan.c\uff1a\u652f\u6301\u5173\u7cfb\u4f4d\u56fe\u626b\u63cf\u7684\u4f8b\u7a0b\u3002", "\u6ce8\u610f\uff1a\u6b64\u8ba1\u5212\u7c7b\u578b\u5fc5\u987b\u4ec5\u4f7f\u7528\u7b26\u5408 MVCC \u7684\u5feb\u7167\uff0c\u5373\u666e\u901a\u5feb\u7167\uff0c\u800c\u975e SnapshotAny \u6216\u5176\u4ed6\u7279\u6b8a\u5feb\u7167\u3002\u7d22\u5f15\u626b\u63cf\u4e0e\u5806\u626b\u63cf\u76f8\u4e92\u5206\u79bb\uff0c\u8bbf\u95ee\u67d0\u4e2a\u5806 TID \u65f6\uff0c\u65e0\u6cd5\u4fdd\u8bc1\u4fc3\u6210\u8be5\u8bbf\u95ee\u7684\u7d22\u5f15\u5143\u7ec4\u4ecd\u7136\u5b58\u5728\u3002\u5806\u5143\u7ec4\u53ef\u80fd\u5df2\u7ecf\u6d88\u5931\uff08heap_fetch \u80fd\u5904\u7406\u8fd9\u79cd\u60c5\u51b5\uff09\uff0c\u66f4\u4e25\u91cd\u7684\u662f\uff0c\u5176\u4f4d\u7f6e\u53ef\u80fd\u5df2\u88ab\u66f4\u65b0\u7684\u5143\u7ec4\u590d\u7528\u3002\u4f7f\u7528 MVCC \u5feb\u7167\u65f6\uff0c\u65b0\u5143\u7ec4\u5fc5\u5b9a\u65e0\u6cd5\u901a\u8fc7\u65f6\u95f4\u53ef\u89c1\u6027\u68c0\u67e5\uff0c\u56e0\u6b64\u4e0d\u4f1a\u9519\u8bef\u8fd4\u56de\uff1b\u4f7f\u7528\u5176\u4ed6\u5feb\u7167\u5219\u53ef\u80fd\u8fd4\u56de\u4e0d\u7b26\u5408\u7d22\u5f15\u6761\u4ef6\u7684\u5143\u7ec4\u3002", "\u4ece BitmapHeapScan \u8282\u70b9\u7684 currentRelation \u4e2d\u8bfb\u53d6\u4e0b\u4e00\u4e2a\u5143\u7ec4\u3002", "\u5982\u679c\u5c1a\u672a\u6267\u884c\u5e95\u5c42\u7d22\u5f15\u626b\u63cf\uff0c\u5219\u5148\u6267\u884c\uff0c\u518d\u5f00\u59cb\u8fed\u4ee3\u4f4d\u56fe\u3002", "\u9884\u53d6\u4f7f\u7528\u4e24\u4e2a\u8fed\u4ee3\u5668\uff1a\u4e00\u4e2a\u7528\u4e8e\u5b9e\u9645\u626b\u63cf\u7684\u9875\u9762\uff0c\u53e6\u4e00\u4e2a\u9886\u5148\u4e8e\u524d\u8005\u6267\u884c\u9884\u53d6\u3002node->prefetch_pages \u7cbe\u786e\u8bb0\u5f55\u9884\u53d6\u8fed\u4ee3\u5668\u9886\u5148\u7684\u9875\u6570\u3002node->prefetch_target \u5219\u8bb0\u5f55\u671f\u671b\u7684\u9884\u53d6\u8ddd\u79bb\uff0c\u8be5\u503c\u4ece\u8f83\u5c0f\u503c\u5f00\u59cb\uff0c\u9010\u6e10\u589e\u5927\u5230 node->prefetch_maximum\u3002\u8fd9\u6837\u53ef\u4ee5\u907f\u514d\u56e0 LIMIT \u800c\u53ea\u8bfb\u53d6\u5c11\u91cf\u5143\u7ec4\u5c31\u505c\u6b62\u7684\u626b\u63cf\u6267\u884c\u5927\u91cf\u9884\u53d6\u3002"]}, {"code": "case T_BitmapHeapScan:\n\t\t\tpname = sname = \"Bitmap Heap Scan\";\n\t\t\tbreak;", "title": "\u6838\u5fc3\u6e90\u7801\u4e2d\u7684 EXPLAIN \u6807\u8bc6"}], "strategies": [], "description": ["\u8bbf\u95ee\u4f4d\u56fe\u9009\u4e2d\u7684\u5806\u9875\uff0c\u5e76\u6267\u884c\u5fc5\u8981\u7684\u91cd\u68c0\u3002"], "localization": {"status": "complete", "sources": [{"url": "/docs/10/parallel-plans.html", "method": "same-major semantic node", "sha256": "885d4ceb10c77809e522baf5c18257546222c5ed3bdeba157ab2356fd6b1cdc7", "language": "zh", "matched_nodes": ["#PARALLEL-PLANS/div[3]/div[2]/ul[0]/li[1]"]}], "language": "zh", "original_text": {"/versions/10/description/0": "Visits heap pages selected by a bitmap and performs required rechecks.", "/versions/10/facts/0/label": "Core node tag", "/versions/10/facts/1/label": "Structured EXPLAIN Node Type", "/versions/10/facts/2/label": "Inputs", "/versions/10/facts/2/value": "A tuple-location bitmap and relation", "/versions/10/facts/3/label": "Output", "/versions/10/facts/3/value": "Qualified heap tuples", "/versions/10/facts/4/label": "Executor initializer", "/versions/10/facts/5/label": "Memory mechanism", "/versions/10/tables/0/title": "EXPLAIN labels in this source build", "/versions/10/related/1/label": "Using EXPLAIN", "/versions/10/related/2/label": "Parallel plans", "/versions/10/sections/0/title": "EXPLAIN names and attributes", "/versions/10/sections/1/title": "Memory and temporary storage", "/versions/10/sections/2/title": "Parallel execution and instrumentation", "/versions/10/sections/3/title": "Same-version manual discussion", "/versions/10/sections/4/title": "Examples from this manual build", "/versions/10/sections/5/title": "Executor implementation notes", "/versions/10/sections/6/title": "EXPLAIN identity in core source", "/versions/10/memory/description": "This extraction does not assign a universal memory limit or spill policy to this node. Inspect the same-build implementation and its expressions or provider.", "/versions/10/sections/0/paragraphs/0": "Structured formats use the Node Type above. Text-format spellings can also include operation, strategy, join type, scan direction or aggregation-stage attributes.", "/versions/10/sections/0/paragraphs/1": "Text names recorded by this source: Bitmap Heap Scan.", "/versions/10/sections/0/paragraphs/2": "Parallel-aware and parallel-safe are different plan properties. A node running inside a parallel worker is not necessarily a parallel-aware node.", "/versions/10/sections/1/paragraphs/0": "This extraction does not assign a universal memory limit or spill policy to this node. Inspect the same-build implementation and its expressions or provider.", "/versions/10/sections/1/paragraphs/1": "If we are using lossy info, we have to recheck the qual conditions at every tuple.", "/versions/10/sections/1/paragraphs/2": "We need two separate strategies for lossy and non-lossy cases.", "/versions/10/sections/1/paragraphs/3": "Bitmap is non-lossy, so we just look through the offsets listed in tbmres; but we have to follow any HOT chain starting at each such offset.", "/versions/10/sections/1/paragraphs/4": "Bitmap is lossy, so we must examine each item pointer on the page. But we can ignore HOT chains, since we'll check each tuple anyway.", "/versions/10/sections/2/paragraphs/0": "The source callbacks below can coordinate execution or collect worker instrumentation. Their presence is not a blanket claim that this node supports a shared parallel scan or shared state.", "/versions/10/sections/2/paragraphs/1": "Callbacks in this build: ExecBitmapHeapEstimate, ExecBitmapHeapInitializeDSM, ExecBitmapHeapInitializeWorker, ExecBitmapHeapReInitializeDSM.", "/versions/10/sections/3/paragraphs/0": "In a parallel bitmap heap scan , one process is chosen as the leader. That process performs a scan of one or more indexes and builds a bitmap indicating which table blocks need to be visited. These blocks are then divided among the cooperating processes as in a parallel sequential scan. In other words, the heap scan is performed in parallel, but the underlying index scan is not.", "/versions/10/sections/5/paragraphs/0": "nodeBitmapHeapscan.c Routines to support bitmapped scans of relations", "/versions/10/sections/5/paragraphs/1": "NOTE: it is critical that this plan type only be used with MVCC-compliant snapshots (ie, regular snapshots, not SnapshotAny or one of the other special snapshots). The reason is that since index and heap scans are decoupled, there can be no assurance that the index tuple prompting a visit to a particular heap TID still exists when the visit is made. Therefore the tuple might not exist anymore either (which is OK because heap_fetch will cope) --- but worse, the tuple slot could have been re-used for a newer tuple. With an MVCC snapshot the newer tuple is certain to fail the time qual and so it will not be mistakenly returned, but with anything else we might return a tuple that doesn't meet the required index qual conditions.", "/versions/10/sections/5/paragraphs/2": "Retrieve next tuple from the BitmapHeapScan node's currentRelation", "/versions/10/sections/5/paragraphs/3": "If we haven't yet performed the underlying index scan, do it, and begin the iteration over the bitmap.", "/versions/10/sections/5/paragraphs/4": "For prefetching, we use *two* iterators, one for the pages we are actually scanning and another that runs ahead of the first for prefetching. node->prefetch_pages tracks exactly how many pages ahead the prefetch iterator is. Also, node->prefetch_target tracks the desired prefetch distance, which starts small and increases up to the node->prefetch_maximum. This is to avoid doing a lot of prefetching in a scan that stops after a few tuples because of a LIMIT.", "/versions/10/tables/0/columns/0/label": "Text-format label", "/versions/10/tables/0/columns/1/label": "Structured node identity", "/versions/10/sections/4/blocks/0/paragraphs/0": "Example copied from the PostgreSQL 10.23 manual; it was not executed for this collection.", "/versions/10/sections/4/blocks/0/paragraphs/1": "Now, let's make the condition more restrictive:", "/versions/10/sections/4/blocks/1/paragraphs/0": "Example copied from the PostgreSQL 10.23 manual; it was not executed for this collection.", "/versions/10/sections/4/blocks/1/paragraphs/1": "Now let's add another condition to the WHERE clause:"}, "fallback_fields": [], "source_language": "en", "original_snapshot_sha256": "d8a7fd64f167ccd09ce7b9b532fb4b12fb2f68fdf125383995edbe8f7a9a77a1"}, "evidence_kind": "source and documentation", "explain_names": ["Bitmap Heap Scan"], "partial_modes": [], "comparison_data": {"node_tag": "T_BitmapHeapScan", "strategies": [], "text_names": ["Bitmap Heap Scan"], "initializer": "ExecInitBitmapHeapScan", "partial_modes": [], "memory_mechanism": "unclassified", "parallel_callbacks": ["ExecBitmapHeapEstimate", "ExecBitmapHeapInitializeDSM", "ExecBitmapHeapInitializeWorker", "ExecBitmapHeapReInitializeDSM"]}, "comparison_hash": "bd05a85a745255a1c9cb85ef7f1d7684cac042aad27b3d05ee77a5ce928a6d0b", "explain_prefixes": ["Parallel"], "runtime_verified": false, "source_inventory": {"explain": "src/backend/commands/explain.c", "executor": "src/backend/executor/execProcnode.c", "implementation": "src/backend/executor/nodeBitmapHeapscan.c"}, "parallel_callbacks": ["ExecBitmapHeapEstimate", "ExecBitmapHeapInitializeDSM", "ExecBitmapHeapInitializeWorker", "ExecBitmapHeapReInitializeDSM"]}, "11": {"facts": [{"label": "\u6838\u5fc3\u8282\u70b9\u6807\u7b7e", "value": "T_BitmapHeapScan"}, {"label": "\u7ed3\u6784\u5316 EXPLAIN \u8282\u70b9\u7c7b\u578b", "value": "Bitmap Heap Scan"}, {"label": "\u8f93\u5165", "value": "\u5143\u7ec4\u4f4d\u7f6e\u4f4d\u56fe\u53ca\u5173\u7cfb"}, {"label": "\u8f93\u51fa", "value": "\u6ee1\u8db3\u6761\u4ef6\u7684\u5806\u5143\u7ec4"}, {"label": "\u6267\u884c\u5668\u521d\u59cb\u5316\u51fd\u6570", "value": "ExecInitBitmapHeapScan"}, {"label": "\u5185\u5b58\u673a\u5236", "value": "unclassified"}], "memory": {"evidence": [{"url": "https://ftp.postgresql.org/pub/source/v11.22/postgresql-11.22.tar.bz2", "path": "src/backend/executor/nodeBitmapHeapscan.c", "label": "src/backend/executor/nodeBitmapHeapscan.c", "sha256": "d304a6b7c85bb02591773d920eaec2af096bd369a1695d397a97fa93cb0cc748", "archive_sha256": "2cb7c97d7a0d7278851bbc9c61f467b69c094c72b81740b751108e7892ebe1f0"}], "mechanism": "unclassified", "description": "\u672c\u6b21\u62bd\u53d6\u4e0d\u4e3a\u6b64\u8282\u70b9\u8bbe\u5b9a\u7edf\u4e00\u7684\u5185\u5b58\u4e0a\u9650\u6216\u843d\u76d8\u7b56\u7565\u3002\u8bf7\u67e5\u770b\u540c\u4e00\u6784\u5efa\u7684\u5b9e\u73b0\u3001\u76f8\u5173\u8868\u8fbe\u5f0f\u6216\u63d0\u4f9b\u65b9\u3002", "source_notes": ["If we are using lossy info, we have to recheck the qual conditions at every tuple.", "We need two separate strategies for lossy and non-lossy cases.", "Bitmap is non-lossy, so we just look through the offsets listed in tbmres; but we have to follow any HOT chain starting at each such offset.", "Bitmap is lossy, so we must examine each item pointer on the page. But we can ignore HOT chains, since we'll check each tuple anyway."]}, "tables": [{"key": "explain-labels", "rows": [{"label": "Bitmap Heap Scan", "identity": "Bitmap Heap Scan"}], "title": "\u672c\u6784\u5efa\u4e2d\u7684 EXPLAIN \u6807\u7b7e", "columns": [{"key": "label", "label": "\u6587\u672c\u683c\u5f0f\u6807\u7b7e"}, {"key": "identity", "label": "\u7ed3\u6784\u5316\u8282\u70b9\u6807\u8bc6"}]}], "related": [{"url": "/wiki/sql/explain/?v=11", "label": "EXPLAIN"}, {"url": "/docs/11/using-explain.html", "label": "\u4f7f\u7528 EXPLAIN"}, {"url": "/docs/11/parallel-plans.html", "label": "\u5e76\u884c\u8ba1\u5212"}, {"url": "/wiki/guc/enable_bitmapscan/?v=11", "label": "enable_bitmapscan"}], "release": {"ref": "PostgreSQL 11.22 source archive", "label": "11.22", "major": "11", "channel": "historical", "revision": "2cb7c97d7a0d7278851bbc9c61f467b69c094c72b81740b751108e7892ebe1f0", "source_url": "https://ftp.postgresql.org/pub/source/v11.22/postgresql-11.22.tar.bz2", "source_snapshot_utc": ""}, "sources": [{"url": "https://ftp.postgresql.org/pub/source/v11.22/postgresql-11.22.tar.bz2", "line": 1078, "path": "src/backend/commands/explain.c", "label": "src/backend/commands/explain.c:1078", "sha256": "9df8400c1a4377179572ceb916d6020fca4e2760f74bf416d77ed97476523bbd", "archive_sha256": "2cb7c97d7a0d7278851bbc9c61f467b69c094c72b81740b751108e7892ebe1f0"}, {"url": "https://ftp.postgresql.org/pub/source/v11.22/postgresql-11.22.tar.bz2", "line": 232, "path": "src/backend/executor/execProcnode.c", "label": "src/backend/executor/execProcnode.c:232", "sha256": "95ef4d4a5df4c29f14af9763fae2c530449bdacdf3853d9ff297adf1fed6153b", "archive_sha256": "2cb7c97d7a0d7278851bbc9c61f467b69c094c72b81740b751108e7892ebe1f0"}, {"url": "https://ftp.postgresql.org/pub/source/v11.22/postgresql-11.22.tar.bz2", "path": "src/backend/executor/nodeBitmapHeapscan.c", "label": "src/backend/executor/nodeBitmapHeapscan.c", "sha256": "d304a6b7c85bb02591773d920eaec2af096bd369a1695d397a97fa93cb0cc748", "archive_sha256": "2cb7c97d7a0d7278851bbc9c61f467b69c094c72b81740b751108e7892ebe1f0"}, {"url": "https://ftp.postgresql.org/pub/source/v11.22/postgresql-11.22.tar.bz2", "path": "src/include/nodes/plannodes.h", "label": "src/include/nodes/plannodes.h", "sha256": "5e0511194183800e8d6eb293fd4b40639c7d3118e2d199c8e7865ba4fa4cf67f", "archive_sha256": "2cb7c97d7a0d7278851bbc9c61f467b69c094c72b81740b751108e7892ebe1f0"}, {"url": "https://pg.center/docs/11/parallel-plans.html#PARALLEL-SCANS", "path": "parallel-plans.html", "label": "PostgreSQL 11.22 \u00b7 parallel-plans", "sha256": "353df5869034b7665159a74037d9cf3e1800d15efcea3390daaa99aae89fa288", "language": "en", "original_url": "/docs/11/parallel-plans.html#PARALLEL-SCANS"}, {"url": "https://pg.center/docs/11/using-explain.html#USING-EXPLAIN-BASICS", "path": "using-explain.html", "label": "PostgreSQL 11.22 \u00b7 using-explain", "sha256": "8411bc78085d4737e32d7cca103d859da6c6539e33ec5e2fba46e74c6f199d8a", "language": "en", "original_url": "/docs/11/using-explain.html#USING-EXPLAIN-BASICS"}], "node_tag": "T_BitmapHeapScan", "sections": [{"title": "EXPLAIN \u540d\u79f0\u4e0e\u5c5e\u6027", "paragraphs": ["\u7ed3\u6784\u5316\u683c\u5f0f\u4f7f\u7528\u4e0a\u8ff0 Node Type\u3002\u6587\u672c\u683c\u5f0f\u540d\u79f0\u8fd8\u53ef\u80fd\u5305\u542b\u64cd\u4f5c\u3001\u7b56\u7565\u3001\u8fde\u63a5\u7c7b\u578b\u3001\u626b\u63cf\u65b9\u5411\u6216\u805a\u5408\u9636\u6bb5\u5c5e\u6027\u3002", "\u6b64\u6e90\u7801\u8bb0\u5f55\u7684\u6587\u672c\u540d\u79f0\uff1aBitmap Heap Scan.", "\u5e76\u884c\u611f\u77e5\u4e0e\u5e76\u884c\u5b89\u5168\u662f\u4e0d\u540c\u7684\u8ba1\u5212\u5c5e\u6027\u3002\u5728\u5e76\u884c\u5de5\u4f5c\u8fdb\u7a0b\u5185\u8fd0\u884c\u7684\u8282\u70b9\u4e0d\u4e00\u5b9a\u662f\u5e76\u884c\u611f\u77e5\u8282\u70b9\u3002"]}, {"title": "\u5185\u5b58\u4e0e\u4e34\u65f6\u5b58\u50a8", "paragraphs": ["\u672c\u6b21\u62bd\u53d6\u4e0d\u4e3a\u6b64\u8282\u70b9\u8bbe\u5b9a\u7edf\u4e00\u7684\u5185\u5b58\u4e0a\u9650\u6216\u843d\u76d8\u7b56\u7565\u3002\u8bf7\u67e5\u770b\u540c\u4e00\u6784\u5efa\u7684\u5b9e\u73b0\u3001\u76f8\u5173\u8868\u8fbe\u5f0f\u6216\u63d0\u4f9b\u65b9\u3002", "\u4f7f\u7528\u6709\u635f\u4fe1\u606f\u65f6\uff0c\u5fc5\u987b\u5bf9\u6bcf\u4e2a\u5143\u7ec4\u91cd\u65b0\u68c0\u67e5\u6761\u4ef6\u3002", "\u6709\u635f\u548c\u65e0\u635f\u4e24\u79cd\u60c5\u51b5\u9700\u8981\u5206\u522b\u91c7\u7528\u4e0d\u540c\u7b56\u7565\u3002", "\u4f4d\u56fe\u662f\u65e0\u635f\u7684\uff0c\u56e0\u6b64\u53ea\u9700\u904d\u5386 tbmres \u5217\u51fa\u7684\u504f\u79fb\u91cf\uff0c\u4f46\u5fc5\u987b\u6cbf\u6bcf\u4e2a\u504f\u79fb\u91cf\u8d77\u59cb\u7684 HOT \u94fe\u7ee7\u7eed\u68c0\u67e5\u3002", "\u4f4d\u56fe\u662f\u6709\u635f\u7684\uff0c\u56e0\u6b64\u5fc5\u987b\u68c0\u67e5\u9875\u9762\u4e2d\u7684\u6bcf\u4e2a\u9879\u76ee\u6307\u9488\u3002\u7531\u4e8e\u6bcf\u4e2a\u5143\u7ec4\u90fd\u4f1a\u88ab\u68c0\u67e5\uff0c\u53ef\u4ee5\u5ffd\u7565 HOT \u94fe\u3002"]}, {"title": "\u5e76\u884c\u6267\u884c\u4e0e\u8fd0\u884c\u4fe1\u606f\u91c7\u96c6", "paragraphs": ["\u4ee5\u4e0b\u6e90\u7801\u56de\u8c03\u53ef\u4ee5\u534f\u8c03\u6267\u884c\u6216\u6536\u96c6\u5de5\u4f5c\u8fdb\u7a0b\u7684\u6d4b\u91cf\u6570\u636e\u3002\u56de\u8c03\u5b58\u5728\u4e0d\u4ee3\u8868\u8be5\u8282\u70b9\u666e\u904d\u652f\u6301\u5171\u4eab\u5e76\u884c\u626b\u63cf\u6216\u5171\u4eab\u72b6\u6001\u3002", "\u6b64\u6784\u5efa\u7684\u56de\u8c03\uff1aExecBitmapHeapEstimate, ExecBitmapHeapInitializeDSM, ExecBitmapHeapInitializeWorker, ExecBitmapHeapReInitializeDSM."]}, {"title": "\u540c\u7248\u672c\u624b\u518c\u8bf4\u660e", "paragraphs": ["\u5728 \u5e76\u884c\u4f4d\u56fe\u5806\u626b\u63cf \u4e2d\uff0c\u4f1a\u9009\u62e9\u4e00\u4e2a\u8fdb\u7a0b\u4f5c\u4e3a\u9886\u5bfc\u8005\u3002\u8be5\u8fdb\u7a0b\u6267\u884c\u4e00\u4e2a\u6216\u591a\u4e2a\u7d22\u5f15\u626b\u63cf\uff0c\u5e76\u6784\u5efa\u4e00\u4e2a\u4f4d\u56fe\uff0c\u4ee5\u6307\u793a\u9700\u8981\u8bbf\u95ee\u54ea\u4e9b\u8868\u5757\u3002\u7136\u540e\u8fd9\u4e9b\u5757\u4f1a\u50cf\u5e76\u884c\u987a\u5e8f\u626b\u63cf\u90a3\u6837\u5206\u914d\u7ed9\u534f\u4f5c\u8fdb\u7a0b\u3002\u6362\u53e5\u8bdd\u8bf4\uff0c\u5806\u626b\u63cf\u662f\u5e76\u884c\u6267\u884c\u7684\uff0c\u4f46\u5e95\u5c42\u7d22\u5f15\u626b\u63cf\u4e0d\u662f\u3002"]}, {"title": "\u672c\u7248\u624b\u518c\u4e2d\u7684\u793a\u4f8b", "blocks": [{"code": "EXPLAIN SELECT * FROM tenk1 WHERE unique1 < 100;\n\n                                  QUERY PLAN\n------------------------------------------------------------------------------\n Bitmap Heap Scan on tenk1  (cost=5.07..229.20 rows=101 width=244)\n   Recheck Cond: (unique1 < 100)\n   ->  Bitmap Index Scan on tenk1_unique1  (cost=0.00..5.04 rows=101 width=0)\n         Index Cond: (unique1 < 100)", "source": {"url": "/docs/11/using-explain.html#USING-EXPLAIN-BASICS", "path": "using-explain.html", "label": "PostgreSQL 11.22 \u00b7 using-explain", "sha256": "8411bc78085d4737e32d7cca103d859da6c6539e33ec5e2fba46e74c6f199d8a"}, "paragraphs": ["\u793a\u4f8b\u6458\u81ea PostgreSQL 11.22 \u624b\u518c\uff1b\u672c\u767e\u79d1\u672a\u5b9e\u9645\u6267\u884c\u6b64\u793a\u4f8b\u3002", "\u73b0\u5728\u8fdb\u4e00\u6b65\u6536\u7d27\u6761\u4ef6\uff1a"]}, {"code": "EXPLAIN SELECT * FROM tenk1 WHERE unique1 < 100 AND stringu1 = 'xxx';\n\n                                  QUERY PLAN\n------------------------------------------------------------------------------\n Bitmap Heap Scan on tenk1  (cost=5.04..229.43 rows=1 width=244)\n   Recheck Cond: (unique1 < 100)\n   Filter: (stringu1 = 'xxx'::name)\n   ->  Bitmap Index Scan on tenk1_unique1  (cost=0.00..5.04 rows=101 width=0)\n         Index Cond: (unique1 < 100)", "source": {"url": "/docs/11/using-explain.html#USING-EXPLAIN-BASICS", "path": "using-explain.html", "label": "PostgreSQL 11.22 \u00b7 using-explain", "sha256": "8411bc78085d4737e32d7cca103d859da6c6539e33ec5e2fba46e74c6f199d8a"}, "paragraphs": ["\u793a\u4f8b\u6458\u81ea PostgreSQL 11.22 \u624b\u518c\uff1b\u672c\u767e\u79d1\u672a\u5b9e\u9645\u6267\u884c\u6b64\u793a\u4f8b\u3002", "\u73b0\u5728\u5411 WHERE \u5b50\u53e5\u518d\u6dfb\u52a0\u4e00\u4e2a\u6761\u4ef6\uff1a"]}]}, {"title": "\u6267\u884c\u5668\u5b9e\u73b0\u8bf4\u660e", "paragraphs": ["nodeBitmapHeapscan.c\uff1a\u652f\u6301\u5173\u7cfb\u4f4d\u56fe\u626b\u63cf\u7684\u4f8b\u7a0b\u3002", "\u6ce8\u610f\uff1a\u6b64\u8ba1\u5212\u7c7b\u578b\u5fc5\u987b\u4ec5\u4f7f\u7528\u7b26\u5408 MVCC \u7684\u5feb\u7167\uff0c\u5373\u666e\u901a\u5feb\u7167\uff0c\u800c\u975e SnapshotAny \u6216\u5176\u4ed6\u7279\u6b8a\u5feb\u7167\u3002\u7d22\u5f15\u626b\u63cf\u4e0e\u5806\u626b\u63cf\u76f8\u4e92\u5206\u79bb\uff0c\u8bbf\u95ee\u67d0\u4e2a\u5806 TID \u65f6\uff0c\u65e0\u6cd5\u4fdd\u8bc1\u4fc3\u6210\u8be5\u8bbf\u95ee\u7684\u7d22\u5f15\u5143\u7ec4\u4ecd\u7136\u5b58\u5728\u3002\u5806\u5143\u7ec4\u53ef\u80fd\u5df2\u7ecf\u6d88\u5931\uff08heap_fetch \u80fd\u5904\u7406\u8fd9\u79cd\u60c5\u51b5\uff09\uff0c\u66f4\u4e25\u91cd\u7684\u662f\uff0c\u5176\u4f4d\u7f6e\u53ef\u80fd\u5df2\u88ab\u66f4\u65b0\u7684\u5143\u7ec4\u590d\u7528\u3002\u4f7f\u7528 MVCC \u5feb\u7167\u65f6\uff0c\u65b0\u5143\u7ec4\u5fc5\u5b9a\u65e0\u6cd5\u901a\u8fc7\u65f6\u95f4\u53ef\u89c1\u6027\u68c0\u67e5\uff0c\u56e0\u6b64\u4e0d\u4f1a\u9519\u8bef\u8fd4\u56de\uff1b\u4f7f\u7528\u5176\u4ed6\u5feb\u7167\u5219\u53ef\u80fd\u8fd4\u56de\u4e0d\u7b26\u5408\u7d22\u5f15\u6761\u4ef6\u7684\u5143\u7ec4\u3002", "\u4ece BitmapHeapScan \u8282\u70b9\u7684 currentRelation \u4e2d\u8bfb\u53d6\u4e0b\u4e00\u4e2a\u5143\u7ec4\u3002", "\u5982\u679c\u5c1a\u672a\u6267\u884c\u5e95\u5c42\u7d22\u5f15\u626b\u63cf\uff0c\u5219\u5148\u6267\u884c\uff0c\u518d\u5f00\u59cb\u8fed\u4ee3\u4f4d\u56fe\u3002", "\u9884\u53d6\u4f7f\u7528\u4e24\u4e2a\u8fed\u4ee3\u5668\uff1a\u4e00\u4e2a\u7528\u4e8e\u5b9e\u9645\u626b\u63cf\u7684\u9875\u9762\uff0c\u53e6\u4e00\u4e2a\u9886\u5148\u4e8e\u524d\u8005\u6267\u884c\u9884\u53d6\u3002node->prefetch_pages \u7cbe\u786e\u8bb0\u5f55\u9884\u53d6\u8fed\u4ee3\u5668\u9886\u5148\u7684\u9875\u6570\u3002node->prefetch_target \u5219\u8bb0\u5f55\u671f\u671b\u7684\u9884\u53d6\u8ddd\u79bb\uff0c\u8be5\u503c\u4ece\u8f83\u5c0f\u503c\u5f00\u59cb\uff0c\u9010\u6e10\u589e\u5927\u5230 node->prefetch_maximum\u3002\u8fd9\u6837\u53ef\u4ee5\u907f\u514d\u56e0 LIMIT \u800c\u53ea\u8bfb\u53d6\u5c11\u91cf\u5143\u7ec4\u5c31\u505c\u6b62\u7684\u626b\u63cf\u6267\u884c\u5927\u91cf\u9884\u53d6\u3002"]}, {"code": "case T_BitmapHeapScan:\n\t\t\tpname = sname = \"Bitmap Heap Scan\";\n\t\t\tbreak;", "title": "\u6838\u5fc3\u6e90\u7801\u4e2d\u7684 EXPLAIN \u6807\u8bc6"}], "strategies": [], "description": ["\u8bbf\u95ee\u4f4d\u56fe\u9009\u4e2d\u7684\u5806\u9875\uff0c\u5e76\u6267\u884c\u5fc5\u8981\u7684\u91cd\u68c0\u3002"], "localization": {"status": "complete", "sources": [{"url": "/docs/11/parallel-plans.html", "method": "same-major semantic node", "sha256": "963d71be1a9c27fcc3f5c60b2479c7b94c6d85bfc4e1e20289a1c0e6f284ec85", "language": "zh", "matched_nodes": ["#PARALLEL-PLANS/div[3]/div[2]/ul[0]/li[1]"]}], "language": "zh", "original_text": {"/versions/11/description/0": "Visits heap pages selected by a bitmap and performs required rechecks.", "/versions/11/facts/0/label": "Core node tag", "/versions/11/facts/1/label": "Structured EXPLAIN Node Type", "/versions/11/facts/2/label": "Inputs", "/versions/11/facts/2/value": "A tuple-location bitmap and relation", "/versions/11/facts/3/label": "Output", "/versions/11/facts/3/value": "Qualified heap tuples", "/versions/11/facts/4/label": "Executor initializer", "/versions/11/facts/5/label": "Memory mechanism", "/versions/11/tables/0/title": "EXPLAIN labels in this source build", "/versions/11/related/1/label": "Using EXPLAIN", "/versions/11/related/2/label": "Parallel plans", "/versions/11/sections/0/title": "EXPLAIN names and attributes", "/versions/11/sections/1/title": "Memory and temporary storage", "/versions/11/sections/2/title": "Parallel execution and instrumentation", "/versions/11/sections/3/title": "Same-version manual discussion", "/versions/11/sections/4/title": "Examples from this manual build", "/versions/11/sections/5/title": "Executor implementation notes", "/versions/11/sections/6/title": "EXPLAIN identity in core source", "/versions/11/memory/description": "This extraction does not assign a universal memory limit or spill policy to this node. Inspect the same-build implementation and its expressions or provider.", "/versions/11/sections/0/paragraphs/0": "Structured formats use the Node Type above. Text-format spellings can also include operation, strategy, join type, scan direction or aggregation-stage attributes.", "/versions/11/sections/0/paragraphs/1": "Text names recorded by this source: Bitmap Heap Scan.", "/versions/11/sections/0/paragraphs/2": "Parallel-aware and parallel-safe are different plan properties. A node running inside a parallel worker is not necessarily a parallel-aware node.", "/versions/11/sections/1/paragraphs/0": "This extraction does not assign a universal memory limit or spill policy to this node. Inspect the same-build implementation and its expressions or provider.", "/versions/11/sections/1/paragraphs/1": "If we are using lossy info, we have to recheck the qual conditions at every tuple.", "/versions/11/sections/1/paragraphs/2": "We need two separate strategies for lossy and non-lossy cases.", "/versions/11/sections/1/paragraphs/3": "Bitmap is non-lossy, so we just look through the offsets listed in tbmres; but we have to follow any HOT chain starting at each such offset.", "/versions/11/sections/1/paragraphs/4": "Bitmap is lossy, so we must examine each item pointer on the page. But we can ignore HOT chains, since we'll check each tuple anyway.", "/versions/11/sections/2/paragraphs/0": "The source callbacks below can coordinate execution or collect worker instrumentation. Their presence is not a blanket claim that this node supports a shared parallel scan or shared state.", "/versions/11/sections/2/paragraphs/1": "Callbacks in this build: ExecBitmapHeapEstimate, ExecBitmapHeapInitializeDSM, ExecBitmapHeapInitializeWorker, ExecBitmapHeapReInitializeDSM.", "/versions/11/sections/3/paragraphs/0": "In a parallel bitmap heap scan , one process is chosen as the leader. That process performs a scan of one or more indexes and builds a bitmap indicating which table blocks need to be visited. These blocks are then divided among the cooperating processes as in a parallel sequential scan. In other words, the heap scan is performed in parallel, but the underlying index scan is not.", "/versions/11/sections/5/paragraphs/0": "nodeBitmapHeapscan.c Routines to support bitmapped scans of relations", "/versions/11/sections/5/paragraphs/1": "NOTE: it is critical that this plan type only be used with MVCC-compliant snapshots (ie, regular snapshots, not SnapshotAny or one of the other special snapshots). The reason is that since index and heap scans are decoupled, there can be no assurance that the index tuple prompting a visit to a particular heap TID still exists when the visit is made. Therefore the tuple might not exist anymore either (which is OK because heap_fetch will cope) --- but worse, the tuple slot could have been re-used for a newer tuple. With an MVCC snapshot the newer tuple is certain to fail the time qual and so it will not be mistakenly returned, but with anything else we might return a tuple that doesn't meet the required index qual conditions.", "/versions/11/sections/5/paragraphs/2": "Retrieve next tuple from the BitmapHeapScan node's currentRelation", "/versions/11/sections/5/paragraphs/3": "If we haven't yet performed the underlying index scan, do it, and begin the iteration over the bitmap.", "/versions/11/sections/5/paragraphs/4": "For prefetching, we use *two* iterators, one for the pages we are actually scanning and another that runs ahead of the first for prefetching. node->prefetch_pages tracks exactly how many pages ahead the prefetch iterator is. Also, node->prefetch_target tracks the desired prefetch distance, which starts small and increases up to the node->prefetch_maximum. This is to avoid doing a lot of prefetching in a scan that stops after a few tuples because of a LIMIT.", "/versions/11/tables/0/columns/0/label": "Text-format label", "/versions/11/tables/0/columns/1/label": "Structured node identity", "/versions/11/sections/4/blocks/0/paragraphs/0": "Example copied from the PostgreSQL 11.22 manual; it was not executed for this collection.", "/versions/11/sections/4/blocks/0/paragraphs/1": "Now, let's make the condition more restrictive:", "/versions/11/sections/4/blocks/1/paragraphs/0": "Example copied from the PostgreSQL 11.22 manual; it was not executed for this collection.", "/versions/11/sections/4/blocks/1/paragraphs/1": "Now let's add another condition to the WHERE clause:"}, "fallback_fields": [], "source_language": "en", "original_snapshot_sha256": "08df0e443c24d4d8523ad6f6bf759a4297583147c299ca451587feb5516d3b50"}, "evidence_kind": "source and documentation", "explain_names": ["Bitmap Heap Scan"], "partial_modes": [], "comparison_data": {"node_tag": "T_BitmapHeapScan", "strategies": [], "text_names": ["Bitmap Heap Scan"], "initializer": "ExecInitBitmapHeapScan", "partial_modes": [], "memory_mechanism": "unclassified", "parallel_callbacks": ["ExecBitmapHeapEstimate", "ExecBitmapHeapInitializeDSM", "ExecBitmapHeapInitializeWorker", "ExecBitmapHeapReInitializeDSM"]}, "comparison_hash": "bd05a85a745255a1c9cb85ef7f1d7684cac042aad27b3d05ee77a5ce928a6d0b", "explain_prefixes": ["Parallel"], "runtime_verified": false, "source_inventory": {"explain": "src/backend/commands/explain.c", "executor": "src/backend/executor/execProcnode.c", "implementation": "src/backend/executor/nodeBitmapHeapscan.c"}, "parallel_callbacks": ["ExecBitmapHeapEstimate", "ExecBitmapHeapInitializeDSM", "ExecBitmapHeapInitializeWorker", "ExecBitmapHeapReInitializeDSM"]}, "12": {"facts": [{"label": "\u6838\u5fc3\u8282\u70b9\u6807\u7b7e", "value": "T_BitmapHeapScan"}, {"label": "\u7ed3\u6784\u5316 EXPLAIN \u8282\u70b9\u7c7b\u578b", "value": "Bitmap Heap Scan"}, {"label": "\u8f93\u5165", "value": "\u5143\u7ec4\u4f4d\u7f6e\u4f4d\u56fe\u53ca\u5173\u7cfb"}, {"label": "\u8f93\u51fa", "value": "\u6ee1\u8db3\u6761\u4ef6\u7684\u5806\u5143\u7ec4"}, {"label": "\u6267\u884c\u5668\u521d\u59cb\u5316\u51fd\u6570", "value": "ExecInitBitmapHeapScan"}, {"label": "\u5185\u5b58\u673a\u5236", "value": "unclassified"}], "memory": {"evidence": [{"url": "https://ftp.postgresql.org/pub/source/v12.22/postgresql-12.22.tar.bz2", "path": "src/backend/executor/nodeBitmapHeapscan.c", "label": "src/backend/executor/nodeBitmapHeapscan.c", "sha256": "ddf8aafd291ca899a7929bd49fbdd9ce91085b3f436847816dcb82e11af12130", "archive_sha256": "8df3c0474782589d3c6f374b5133b1bd14d168086edbc13c6e72e67dd4527a3b"}], "mechanism": "unclassified", "description": "\u672c\u6b21\u62bd\u53d6\u4e0d\u4e3a\u6b64\u8282\u70b9\u8bbe\u5b9a\u7edf\u4e00\u7684\u5185\u5b58\u4e0a\u9650\u6216\u843d\u76d8\u7b56\u7565\u3002\u8bf7\u67e5\u770b\u540c\u4e00\u6784\u5efa\u7684\u5b9e\u73b0\u3001\u76f8\u5173\u8868\u8fbe\u5f0f\u6216\u63d0\u4f9b\u65b9\u3002", "source_notes": ["If we are using lossy info, we have to recheck the qual conditions at every tuple."]}, "tables": [{"key": "explain-labels", "rows": [{"label": "Bitmap Heap Scan", "identity": "Bitmap Heap Scan"}], "title": "\u672c\u6784\u5efa\u4e2d\u7684 EXPLAIN \u6807\u7b7e", "columns": [{"key": "label", "label": "\u6587\u672c\u683c\u5f0f\u6807\u7b7e"}, {"key": "identity", "label": "\u7ed3\u6784\u5316\u8282\u70b9\u6807\u8bc6"}]}], "related": [{"url": "/wiki/sql/explain/?v=12", "label": "EXPLAIN"}, {"url": "/docs/12/using-explain.html", "label": "\u4f7f\u7528 EXPLAIN"}, {"url": "/docs/12/parallel-plans.html", "label": "\u5e76\u884c\u8ba1\u5212"}, {"url": "/wiki/guc/enable_bitmapscan/?v=12", "label": "enable_bitmapscan"}], "release": {"ref": "PostgreSQL 12.22 source archive", "label": "12.22", "major": "12", "channel": "historical", "revision": "8df3c0474782589d3c6f374b5133b1bd14d168086edbc13c6e72e67dd4527a3b", "source_url": "https://ftp.postgresql.org/pub/source/v12.22/postgresql-12.22.tar.bz2", "source_snapshot_utc": ""}, "sources": [{"url": "https://ftp.postgresql.org/pub/source/v12.22/postgresql-12.22.tar.bz2", "line": 1149, "path": "src/backend/commands/explain.c", "label": "src/backend/commands/explain.c:1149", "sha256": "d02ea84fdaa201de5d9360645a9f24bfbd2c31f7d45a639e09560ac0e6b6471d", "archive_sha256": "8df3c0474782589d3c6f374b5133b1bd14d168086edbc13c6e72e67dd4527a3b"}, {"url": "https://ftp.postgresql.org/pub/source/v12.22/postgresql-12.22.tar.bz2", "line": 232, "path": "src/backend/executor/execProcnode.c", "label": "src/backend/executor/execProcnode.c:232", "sha256": "311b17379fe54e3f342fe5ad41c43afbdfa1b844978db2bb2eb22b82520d3256", "archive_sha256": "8df3c0474782589d3c6f374b5133b1bd14d168086edbc13c6e72e67dd4527a3b"}, {"url": "https://ftp.postgresql.org/pub/source/v12.22/postgresql-12.22.tar.bz2", "path": "src/backend/executor/nodeBitmapHeapscan.c", "label": "src/backend/executor/nodeBitmapHeapscan.c", "sha256": "ddf8aafd291ca899a7929bd49fbdd9ce91085b3f436847816dcb82e11af12130", "archive_sha256": "8df3c0474782589d3c6f374b5133b1bd14d168086edbc13c6e72e67dd4527a3b"}, {"url": "https://ftp.postgresql.org/pub/source/v12.22/postgresql-12.22.tar.bz2", "path": "src/include/nodes/plannodes.h", "label": "src/include/nodes/plannodes.h", "sha256": "b0c4a0aeb48660ce06e5e700d5529ca9066fd16682bd15783d6e71b5420b07b0", "archive_sha256": "8df3c0474782589d3c6f374b5133b1bd14d168086edbc13c6e72e67dd4527a3b"}, {"url": "https://pg.center/docs/12/parallel-plans.html#PARALLEL-SCANS", "path": "parallel-plans.html", "label": "PostgreSQL 12.22 \u00b7 parallel-plans", "sha256": "fa33380814ee65998f524524f8681d70cf3b1198d54b39847b00462b01517ffb", "language": "en", "original_url": "/docs/12/parallel-plans.html#PARALLEL-SCANS"}, {"url": "https://pg.center/docs/12/using-explain.html#USING-EXPLAIN-BASICS", "path": "using-explain.html", "label": "PostgreSQL 12.22 \u00b7 using-explain", "sha256": "06297525f2180b07e752837a3351be9c871b56559f535bcd0a67dec9baac10c0", "language": "en", "original_url": "/docs/12/using-explain.html#USING-EXPLAIN-BASICS"}], "node_tag": "T_BitmapHeapScan", "sections": [{"title": "EXPLAIN \u540d\u79f0\u4e0e\u5c5e\u6027", "paragraphs": ["\u7ed3\u6784\u5316\u683c\u5f0f\u4f7f\u7528\u4e0a\u8ff0 Node Type\u3002\u6587\u672c\u683c\u5f0f\u540d\u79f0\u8fd8\u53ef\u80fd\u5305\u542b\u64cd\u4f5c\u3001\u7b56\u7565\u3001\u8fde\u63a5\u7c7b\u578b\u3001\u626b\u63cf\u65b9\u5411\u6216\u805a\u5408\u9636\u6bb5\u5c5e\u6027\u3002", "\u6b64\u6e90\u7801\u8bb0\u5f55\u7684\u6587\u672c\u540d\u79f0\uff1aBitmap Heap Scan.", "\u5e76\u884c\u611f\u77e5\u4e0e\u5e76\u884c\u5b89\u5168\u662f\u4e0d\u540c\u7684\u8ba1\u5212\u5c5e\u6027\u3002\u5728\u5e76\u884c\u5de5\u4f5c\u8fdb\u7a0b\u5185\u8fd0\u884c\u7684\u8282\u70b9\u4e0d\u4e00\u5b9a\u662f\u5e76\u884c\u611f\u77e5\u8282\u70b9\u3002"]}, {"title": "\u5185\u5b58\u4e0e\u4e34\u65f6\u5b58\u50a8", "paragraphs": ["\u672c\u6b21\u62bd\u53d6\u4e0d\u4e3a\u6b64\u8282\u70b9\u8bbe\u5b9a\u7edf\u4e00\u7684\u5185\u5b58\u4e0a\u9650\u6216\u843d\u76d8\u7b56\u7565\u3002\u8bf7\u67e5\u770b\u540c\u4e00\u6784\u5efa\u7684\u5b9e\u73b0\u3001\u76f8\u5173\u8868\u8fbe\u5f0f\u6216\u63d0\u4f9b\u65b9\u3002", "\u4f7f\u7528\u6709\u635f\u4fe1\u606f\u65f6\uff0c\u5fc5\u987b\u5bf9\u6bcf\u4e2a\u5143\u7ec4\u91cd\u65b0\u68c0\u67e5\u6761\u4ef6\u3002"]}, {"title": "\u5e76\u884c\u6267\u884c\u4e0e\u8fd0\u884c\u4fe1\u606f\u91c7\u96c6", "paragraphs": ["\u4ee5\u4e0b\u6e90\u7801\u56de\u8c03\u53ef\u4ee5\u534f\u8c03\u6267\u884c\u6216\u6536\u96c6\u5de5\u4f5c\u8fdb\u7a0b\u7684\u6d4b\u91cf\u6570\u636e\u3002\u56de\u8c03\u5b58\u5728\u4e0d\u4ee3\u8868\u8be5\u8282\u70b9\u666e\u904d\u652f\u6301\u5171\u4eab\u5e76\u884c\u626b\u63cf\u6216\u5171\u4eab\u72b6\u6001\u3002", "\u6b64\u6784\u5efa\u7684\u56de\u8c03\uff1aExecBitmapHeapEstimate, ExecBitmapHeapInitializeDSM, ExecBitmapHeapInitializeWorker, ExecBitmapHeapReInitializeDSM."]}, {"title": "\u540c\u7248\u672c\u624b\u518c\u8bf4\u660e", "paragraphs": ["\u5728 \u5e76\u884c\u4f4d\u56fe\u5806\u626b\u63cf \u4e2d\uff0c\u4f1a\u9009\u62e9\u4e00\u4e2a\u8fdb\u7a0b\u4f5c\u4e3a\u9886\u5bfc\u8005\u3002\u8be5\u8fdb\u7a0b\u6267\u884c\u4e00\u4e2a\u6216\u591a\u4e2a\u7d22\u5f15\u626b\u63cf\uff0c\u5e76\u6784\u5efa\u4e00\u4e2a\u4f4d\u56fe\uff0c\u4ee5\u6307\u793a\u9700\u8981\u8bbf\u95ee\u54ea\u4e9b\u8868\u5757\u3002\u7136\u540e\u8fd9\u4e9b\u5757\u4f1a\u50cf\u5e76\u884c\u987a\u5e8f\u626b\u63cf\u90a3\u6837\u5206\u914d\u7ed9\u534f\u4f5c\u8fdb\u7a0b\u3002\u6362\u53e5\u8bdd\u8bf4\uff0c\u5806\u626b\u63cf\u662f\u5e76\u884c\u6267\u884c\u7684\uff0c\u4f46\u5e95\u5c42\u7d22\u5f15\u626b\u63cf\u4e0d\u662f\u3002"]}, {"title": "\u672c\u7248\u624b\u518c\u4e2d\u7684\u793a\u4f8b", "blocks": [{"code": "EXPLAIN SELECT * FROM tenk1 WHERE unique1 < 100;\n\n                                  QUERY PLAN\n------------------------------------------------------------------------------\n Bitmap Heap Scan on tenk1  (cost=5.07..229.20 rows=101 width=244)\n   Recheck Cond: (unique1 < 100)\n   ->  Bitmap Index Scan on tenk1_unique1  (cost=0.00..5.04 rows=101 width=0)\n         Index Cond: (unique1 < 100)", "source": {"url": "/docs/12/using-explain.html#USING-EXPLAIN-BASICS", "path": "using-explain.html", "label": "PostgreSQL 12.22 \u00b7 using-explain", "sha256": "06297525f2180b07e752837a3351be9c871b56559f535bcd0a67dec9baac10c0"}, "paragraphs": ["\u793a\u4f8b\u6458\u81ea PostgreSQL 12.22 \u624b\u518c\uff1b\u672c\u767e\u79d1\u672a\u5b9e\u9645\u6267\u884c\u6b64\u793a\u4f8b\u3002", "\u73b0\u5728\u8fdb\u4e00\u6b65\u6536\u7d27\u6761\u4ef6\uff1a"]}, {"code": "EXPLAIN SELECT * FROM tenk1 WHERE unique1 < 100 AND stringu1 = 'xxx';\n\n                                  QUERY PLAN\n------------------------------------------------------------------------------\n Bitmap Heap Scan on tenk1  (cost=5.04..229.43 rows=1 width=244)\n   Recheck Cond: (unique1 < 100)\n   Filter: (stringu1 = 'xxx'::name)\n   ->  Bitmap Index Scan on tenk1_unique1  (cost=0.00..5.04 rows=101 width=0)\n         Index Cond: (unique1 < 100)", "source": {"url": "/docs/12/using-explain.html#USING-EXPLAIN-BASICS", "path": "using-explain.html", "label": "PostgreSQL 12.22 \u00b7 using-explain", "sha256": "06297525f2180b07e752837a3351be9c871b56559f535bcd0a67dec9baac10c0"}, "paragraphs": ["\u793a\u4f8b\u6458\u81ea PostgreSQL 12.22 \u624b\u518c\uff1b\u672c\u767e\u79d1\u672a\u5b9e\u9645\u6267\u884c\u6b64\u793a\u4f8b\u3002", "\u73b0\u5728\u5411 WHERE \u5b50\u53e5\u518d\u6dfb\u52a0\u4e00\u4e2a\u6761\u4ef6\uff1a"]}]}, {"title": "\u6267\u884c\u5668\u5b9e\u73b0\u8bf4\u660e", "paragraphs": ["nodeBitmapHeapscan.c\uff1a\u652f\u6301\u5173\u7cfb\u4f4d\u56fe\u626b\u63cf\u7684\u4f8b\u7a0b\u3002", "\u6ce8\u610f\uff1a\u6b64\u8ba1\u5212\u7c7b\u578b\u5fc5\u987b\u4ec5\u4f7f\u7528\u7b26\u5408 MVCC \u7684\u5feb\u7167\uff0c\u5373\u666e\u901a\u5feb\u7167\uff0c\u800c\u975e SnapshotAny \u6216\u5176\u4ed6\u7279\u6b8a\u5feb\u7167\u3002\u7d22\u5f15\u626b\u63cf\u4e0e\u5806\u626b\u63cf\u76f8\u4e92\u5206\u79bb\uff0c\u8bbf\u95ee\u67d0\u4e2a\u5806 TID \u65f6\uff0c\u65e0\u6cd5\u4fdd\u8bc1\u4fc3\u6210\u8be5\u8bbf\u95ee\u7684\u7d22\u5f15\u5143\u7ec4\u4ecd\u7136\u5b58\u5728\u3002\u5806\u5143\u7ec4\u53ef\u80fd\u5df2\u7ecf\u6d88\u5931\uff08heap_fetch \u80fd\u5904\u7406\u8fd9\u79cd\u60c5\u51b5\uff09\uff0c\u66f4\u4e25\u91cd\u7684\u662f\uff0c\u5176\u4f4d\u7f6e\u53ef\u80fd\u5df2\u88ab\u66f4\u65b0\u7684\u5143\u7ec4\u590d\u7528\u3002\u4f7f\u7528 MVCC \u5feb\u7167\u65f6\uff0c\u65b0\u5143\u7ec4\u5fc5\u5b9a\u65e0\u6cd5\u901a\u8fc7\u65f6\u95f4\u53ef\u89c1\u6027\u68c0\u67e5\uff0c\u56e0\u6b64\u4e0d\u4f1a\u9519\u8bef\u8fd4\u56de\uff1b\u4f7f\u7528\u5176\u4ed6\u5feb\u7167\u5219\u53ef\u80fd\u8fd4\u56de\u4e0d\u7b26\u5408\u7d22\u5f15\u6761\u4ef6\u7684\u5143\u7ec4\u3002", "\u4ece BitmapHeapScan \u8282\u70b9\u7684 currentRelation \u4e2d\u8bfb\u53d6\u4e0b\u4e00\u4e2a\u5143\u7ec4\u3002", "\u5982\u679c\u5c1a\u672a\u6267\u884c\u5e95\u5c42\u7d22\u5f15\u626b\u63cf\uff0c\u5219\u5148\u6267\u884c\uff0c\u518d\u5f00\u59cb\u8fed\u4ee3\u4f4d\u56fe\u3002", "\u9884\u53d6\u4f7f\u7528\u4e24\u4e2a\u8fed\u4ee3\u5668\uff1a\u4e00\u4e2a\u7528\u4e8e\u5b9e\u9645\u626b\u63cf\u7684\u9875\u9762\uff0c\u53e6\u4e00\u4e2a\u9886\u5148\u4e8e\u524d\u8005\u6267\u884c\u9884\u53d6\u3002node->prefetch_pages \u7cbe\u786e\u8bb0\u5f55\u9884\u53d6\u8fed\u4ee3\u5668\u9886\u5148\u7684\u9875\u6570\u3002node->prefetch_target \u5219\u8bb0\u5f55\u671f\u671b\u7684\u9884\u53d6\u8ddd\u79bb\uff0c\u8be5\u503c\u4ece\u8f83\u5c0f\u503c\u5f00\u59cb\uff0c\u9010\u6e10\u589e\u5927\u5230 node->prefetch_maximum\u3002\u8fd9\u6837\u53ef\u4ee5\u907f\u514d\u56e0 LIMIT \u800c\u53ea\u8bfb\u53d6\u5c11\u91cf\u5143\u7ec4\u5c31\u505c\u6b62\u7684\u626b\u63cf\u6267\u884c\u5927\u91cf\u9884\u53d6\u3002"]}, {"code": "case T_BitmapHeapScan:\n\t\t\tpname = sname = \"Bitmap Heap Scan\";\n\t\t\tbreak;", "title": "\u6838\u5fc3\u6e90\u7801\u4e2d\u7684 EXPLAIN \u6807\u8bc6"}], "strategies": [], "description": ["\u8bbf\u95ee\u4f4d\u56fe\u9009\u4e2d\u7684\u5806\u9875\uff0c\u5e76\u6267\u884c\u5fc5\u8981\u7684\u91cd\u68c0\u3002"], "localization": {"status": "complete", "sources": [{"url": "/docs/12/parallel-plans.html", "method": "same-major semantic node", "sha256": "4aaca92475f243dcddffd80d9af558330f8f3b0ac3cbe8872b0d2901e14fe684", "language": "zh", "matched_nodes": ["#PARALLEL-PLANS/div[3]/div[2]/ul[0]/li[1]"]}], "language": "zh", "original_text": {"/versions/12/description/0": "Visits heap pages selected by a bitmap and performs required rechecks.", "/versions/12/facts/0/label": "Core node tag", "/versions/12/facts/1/label": "Structured EXPLAIN Node Type", "/versions/12/facts/2/label": "Inputs", "/versions/12/facts/2/value": "A tuple-location bitmap and relation", "/versions/12/facts/3/label": "Output", "/versions/12/facts/3/value": "Qualified heap tuples", "/versions/12/facts/4/label": "Executor initializer", "/versions/12/facts/5/label": "Memory mechanism", "/versions/12/tables/0/title": "EXPLAIN labels in this source build", "/versions/12/related/1/label": "Using EXPLAIN", "/versions/12/related/2/label": "Parallel plans", "/versions/12/sections/0/title": "EXPLAIN names and attributes", "/versions/12/sections/1/title": "Memory and temporary storage", "/versions/12/sections/2/title": "Parallel execution and instrumentation", "/versions/12/sections/3/title": "Same-version manual discussion", "/versions/12/sections/4/title": "Examples from this manual build", "/versions/12/sections/5/title": "Executor implementation notes", "/versions/12/sections/6/title": "EXPLAIN identity in core source", "/versions/12/memory/description": "This extraction does not assign a universal memory limit or spill policy to this node. Inspect the same-build implementation and its expressions or provider.", "/versions/12/sections/0/paragraphs/0": "Structured formats use the Node Type above. Text-format spellings can also include operation, strategy, join type, scan direction or aggregation-stage attributes.", "/versions/12/sections/0/paragraphs/1": "Text names recorded by this source: Bitmap Heap Scan.", "/versions/12/sections/0/paragraphs/2": "Parallel-aware and parallel-safe are different plan properties. A node running inside a parallel worker is not necessarily a parallel-aware node.", "/versions/12/sections/1/paragraphs/0": "This extraction does not assign a universal memory limit or spill policy to this node. Inspect the same-build implementation and its expressions or provider.", "/versions/12/sections/1/paragraphs/1": "If we are using lossy info, we have to recheck the qual conditions at every tuple.", "/versions/12/sections/2/paragraphs/0": "The source callbacks below can coordinate execution or collect worker instrumentation. Their presence is not a blanket claim that this node supports a shared parallel scan or shared state.", "/versions/12/sections/2/paragraphs/1": "Callbacks in this build: ExecBitmapHeapEstimate, ExecBitmapHeapInitializeDSM, ExecBitmapHeapInitializeWorker, ExecBitmapHeapReInitializeDSM.", "/versions/12/sections/3/paragraphs/0": "In a parallel bitmap heap scan , one process is chosen as the leader. That process performs a scan of one or more indexes and builds a bitmap indicating which table blocks need to be visited. These blocks are then divided among the cooperating processes as in a parallel sequential scan. In other words, the heap scan is performed in parallel, but the underlying index scan is not.", "/versions/12/sections/5/paragraphs/0": "nodeBitmapHeapscan.c Routines to support bitmapped scans of relations", "/versions/12/sections/5/paragraphs/1": "NOTE: it is critical that this plan type only be used with MVCC-compliant snapshots (ie, regular snapshots, not SnapshotAny or one of the other special snapshots). The reason is that since index and heap scans are decoupled, there can be no assurance that the index tuple prompting a visit to a particular heap TID still exists when the visit is made. Therefore the tuple might not exist anymore either (which is OK because heap_fetch will cope) --- but worse, the tuple slot could have been re-used for a newer tuple. With an MVCC snapshot the newer tuple is certain to fail the time qual and so it will not be mistakenly returned, but with anything else we might return a tuple that doesn't meet the required index qual conditions.", "/versions/12/sections/5/paragraphs/2": "Retrieve next tuple from the BitmapHeapScan node's currentRelation", "/versions/12/sections/5/paragraphs/3": "If we haven't yet performed the underlying index scan, do it, and begin the iteration over the bitmap.", "/versions/12/sections/5/paragraphs/4": "For prefetching, we use *two* iterators, one for the pages we are actually scanning and another that runs ahead of the first for prefetching. node->prefetch_pages tracks exactly how many pages ahead the prefetch iterator is. Also, node->prefetch_target tracks the desired prefetch distance, which starts small and increases up to the node->prefetch_maximum. This is to avoid doing a lot of prefetching in a scan that stops after a few tuples because of a LIMIT.", "/versions/12/tables/0/columns/0/label": "Text-format label", "/versions/12/tables/0/columns/1/label": "Structured node identity", "/versions/12/sections/4/blocks/0/paragraphs/0": "Example copied from the PostgreSQL 12.22 manual; it was not executed for this collection.", "/versions/12/sections/4/blocks/0/paragraphs/1": "Now, let's make the condition more restrictive:", "/versions/12/sections/4/blocks/1/paragraphs/0": "Example copied from the PostgreSQL 12.22 manual; it was not executed for this collection.", "/versions/12/sections/4/blocks/1/paragraphs/1": "Now let's add another condition to the WHERE clause:"}, "fallback_fields": [], "source_language": "en", "original_snapshot_sha256": "a29395d6c38a3358dbec285c322f3038a409cbec12344957d99059282c9c4362"}, "evidence_kind": "source and documentation", "explain_names": ["Bitmap Heap Scan"], "partial_modes": [], "comparison_data": {"node_tag": "T_BitmapHeapScan", "strategies": [], "text_names": ["Bitmap Heap Scan"], "initializer": "ExecInitBitmapHeapScan", "partial_modes": [], "memory_mechanism": "unclassified", "parallel_callbacks": ["ExecBitmapHeapEstimate", "ExecBitmapHeapInitializeDSM", "ExecBitmapHeapInitializeWorker", "ExecBitmapHeapReInitializeDSM"]}, "comparison_hash": "bd05a85a745255a1c9cb85ef7f1d7684cac042aad27b3d05ee77a5ce928a6d0b", "explain_prefixes": ["Parallel"], "runtime_verified": false, "source_inventory": {"explain": "src/backend/commands/explain.c", "executor": "src/backend/executor/execProcnode.c", "implementation": "src/backend/executor/nodeBitmapHeapscan.c"}, "parallel_callbacks": ["ExecBitmapHeapEstimate", "ExecBitmapHeapInitializeDSM", "ExecBitmapHeapInitializeWorker", "ExecBitmapHeapReInitializeDSM"]}, "13": {"facts": [{"label": "\u6838\u5fc3\u8282\u70b9\u6807\u7b7e", "value": "T_BitmapHeapScan"}, {"label": "\u7ed3\u6784\u5316 EXPLAIN \u8282\u70b9\u7c7b\u578b", "value": "Bitmap Heap Scan"}, {"label": "\u8f93\u5165", "value": "\u5143\u7ec4\u4f4d\u7f6e\u4f4d\u56fe\u53ca\u5173\u7cfb"}, {"label": "\u8f93\u51fa", "value": "\u6ee1\u8db3\u6761\u4ef6\u7684\u5806\u5143\u7ec4"}, {"label": "\u6267\u884c\u5668\u521d\u59cb\u5316\u51fd\u6570", "value": "ExecInitBitmapHeapScan"}, {"label": "\u5185\u5b58\u673a\u5236", "value": "unclassified"}], "memory": {"evidence": [{"url": "https://ftp.postgresql.org/pub/source/v13.23/postgresql-13.23.tar.bz2", "path": "src/backend/executor/nodeBitmapHeapscan.c", "label": "src/backend/executor/nodeBitmapHeapscan.c", "sha256": "88b47820d96c9457b2eb0d61a0557312bfe013d6d7a68cc6df077757c392a2dd", "archive_sha256": "6ec3c82726af92b7dec873fa1cdf881eca92a4219787dfad05acb6b10e041fd6"}], "mechanism": "unclassified", "description": "\u672c\u6b21\u62bd\u53d6\u4e0d\u4e3a\u6b64\u8282\u70b9\u8bbe\u5b9a\u7edf\u4e00\u7684\u5185\u5b58\u4e0a\u9650\u6216\u843d\u76d8\u7b56\u7565\u3002\u8bf7\u67e5\u770b\u540c\u4e00\u6784\u5efa\u7684\u5b9e\u73b0\u3001\u76f8\u5173\u8868\u8fbe\u5f0f\u6216\u63d0\u4f9b\u65b9\u3002", "source_notes": ["If we are using lossy info, we have to recheck the qual conditions at every tuple."]}, "tables": [{"key": "explain-labels", "rows": [{"label": "Bitmap Heap Scan", "identity": "Bitmap Heap Scan"}], "title": "\u672c\u6784\u5efa\u4e2d\u7684 EXPLAIN \u6807\u7b7e", "columns": [{"key": "label", "label": "\u6587\u672c\u683c\u5f0f\u6807\u7b7e"}, {"key": "identity", "label": "\u7ed3\u6784\u5316\u8282\u70b9\u6807\u8bc6"}]}], "related": [{"url": "/wiki/sql/explain/?v=13", "label": "EXPLAIN"}, {"url": "/docs/13/using-explain.html", "label": "\u4f7f\u7528 EXPLAIN"}, {"url": "/docs/13/parallel-plans.html", "label": "\u5e76\u884c\u8ba1\u5212"}, {"url": "/wiki/guc/enable_bitmapscan/?v=13", "label": "enable_bitmapscan"}], "release": {"ref": "PostgreSQL 13.23 source archive", "label": "13.23", "major": "13", "channel": "historical", "revision": "6ec3c82726af92b7dec873fa1cdf881eca92a4219787dfad05acb6b10e041fd6", "source_url": "https://ftp.postgresql.org/pub/source/v13.23/postgresql-13.23.tar.bz2", "source_snapshot_utc": ""}, "sources": [{"url": "https://ftp.postgresql.org/pub/source/v13.23/postgresql-13.23.tar.bz2", "line": 1207, "path": "src/backend/commands/explain.c", "label": "src/backend/commands/explain.c:1207", "sha256": "541713e0e7f1c9cc352c2b6028964d440c19d2678a4463000094c24a88c1e730", "archive_sha256": "6ec3c82726af92b7dec873fa1cdf881eca92a4219787dfad05acb6b10e041fd6"}, {"url": "https://ftp.postgresql.org/pub/source/v13.23/postgresql-13.23.tar.bz2", "line": 232, "path": "src/backend/executor/execProcnode.c", "label": "src/backend/executor/execProcnode.c:232", "sha256": "d085ee99acfa00587e6ade3a1d9f8108a0566beedbbee3f54a50c9fc0cc2e875", "archive_sha256": "6ec3c82726af92b7dec873fa1cdf881eca92a4219787dfad05acb6b10e041fd6"}, {"url": "https://ftp.postgresql.org/pub/source/v13.23/postgresql-13.23.tar.bz2", "path": "src/backend/executor/nodeBitmapHeapscan.c", "label": "src/backend/executor/nodeBitmapHeapscan.c", "sha256": "88b47820d96c9457b2eb0d61a0557312bfe013d6d7a68cc6df077757c392a2dd", "archive_sha256": "6ec3c82726af92b7dec873fa1cdf881eca92a4219787dfad05acb6b10e041fd6"}, {"url": "https://ftp.postgresql.org/pub/source/v13.23/postgresql-13.23.tar.bz2", "path": "src/include/nodes/plannodes.h", "label": "src/include/nodes/plannodes.h", "sha256": "dcb296833777b02008c4b6bae8e8f7c6423b7ffba21f36702597c9d596d039ab", "archive_sha256": "6ec3c82726af92b7dec873fa1cdf881eca92a4219787dfad05acb6b10e041fd6"}, {"url": "https://pg.center/docs/13/parallel-plans.html#PARALLEL-SCANS", "path": "parallel-plans.html", "label": "PostgreSQL 13.23 \u00b7 parallel-plans", "sha256": "025ad8564a8461b676c9153f9e084429cca0ef86c968090689b082120060f3d0", "language": "en", "original_url": "/docs/13/parallel-plans.html#PARALLEL-SCANS"}, {"url": "https://pg.center/docs/13/using-explain.html#USING-EXPLAIN-BASICS", "path": "using-explain.html", "label": "PostgreSQL 13.23 \u00b7 using-explain", "sha256": "650fd8629382d5dc8f9f8412c50ec5f32442a9ad2f98ca88e5348a7c2bd0ac7a", "language": "en", "original_url": "/docs/13/using-explain.html#USING-EXPLAIN-BASICS"}], "node_tag": "T_BitmapHeapScan", "sections": [{"title": "EXPLAIN \u540d\u79f0\u4e0e\u5c5e\u6027", "paragraphs": ["\u7ed3\u6784\u5316\u683c\u5f0f\u4f7f\u7528\u4e0a\u8ff0 Node Type\u3002\u6587\u672c\u683c\u5f0f\u540d\u79f0\u8fd8\u53ef\u80fd\u5305\u542b\u64cd\u4f5c\u3001\u7b56\u7565\u3001\u8fde\u63a5\u7c7b\u578b\u3001\u626b\u63cf\u65b9\u5411\u6216\u805a\u5408\u9636\u6bb5\u5c5e\u6027\u3002", "\u6b64\u6e90\u7801\u8bb0\u5f55\u7684\u6587\u672c\u540d\u79f0\uff1aBitmap Heap Scan.", "\u5e76\u884c\u611f\u77e5\u4e0e\u5e76\u884c\u5b89\u5168\u662f\u4e0d\u540c\u7684\u8ba1\u5212\u5c5e\u6027\u3002\u5728\u5e76\u884c\u5de5\u4f5c\u8fdb\u7a0b\u5185\u8fd0\u884c\u7684\u8282\u70b9\u4e0d\u4e00\u5b9a\u662f\u5e76\u884c\u611f\u77e5\u8282\u70b9\u3002"]}, {"title": "\u5185\u5b58\u4e0e\u4e34\u65f6\u5b58\u50a8", "paragraphs": ["\u672c\u6b21\u62bd\u53d6\u4e0d\u4e3a\u6b64\u8282\u70b9\u8bbe\u5b9a\u7edf\u4e00\u7684\u5185\u5b58\u4e0a\u9650\u6216\u843d\u76d8\u7b56\u7565\u3002\u8bf7\u67e5\u770b\u540c\u4e00\u6784\u5efa\u7684\u5b9e\u73b0\u3001\u76f8\u5173\u8868\u8fbe\u5f0f\u6216\u63d0\u4f9b\u65b9\u3002", "\u4f7f\u7528\u6709\u635f\u4fe1\u606f\u65f6\uff0c\u5fc5\u987b\u5bf9\u6bcf\u4e2a\u5143\u7ec4\u91cd\u65b0\u68c0\u67e5\u6761\u4ef6\u3002"]}, {"title": "\u5e76\u884c\u6267\u884c\u4e0e\u8fd0\u884c\u4fe1\u606f\u91c7\u96c6", "paragraphs": ["\u4ee5\u4e0b\u6e90\u7801\u56de\u8c03\u53ef\u4ee5\u534f\u8c03\u6267\u884c\u6216\u6536\u96c6\u5de5\u4f5c\u8fdb\u7a0b\u7684\u6d4b\u91cf\u6570\u636e\u3002\u56de\u8c03\u5b58\u5728\u4e0d\u4ee3\u8868\u8be5\u8282\u70b9\u666e\u904d\u652f\u6301\u5171\u4eab\u5e76\u884c\u626b\u63cf\u6216\u5171\u4eab\u72b6\u6001\u3002", "\u6b64\u6784\u5efa\u7684\u56de\u8c03\uff1aExecBitmapHeapEstimate, ExecBitmapHeapInitializeDSM, ExecBitmapHeapInitializeWorker, ExecBitmapHeapReInitializeDSM."]}, {"title": "\u540c\u7248\u672c\u624b\u518c\u8bf4\u660e", "paragraphs": ["\u5728 \u5e76\u884c\u4f4d\u56fe\u5806\u626b\u63cf \u4e2d\uff0c\u4f1a\u9009\u62e9\u4e00\u4e2a\u8fdb\u7a0b\u4f5c\u4e3a\u9886\u5bfc\u8005\u3002\u8be5\u8fdb\u7a0b\u6267\u884c\u4e00\u4e2a\u6216\u591a\u4e2a\u7d22\u5f15\u626b\u63cf\uff0c\u5e76\u6784\u5efa\u4e00\u4e2a\u4f4d\u56fe\uff0c\u4ee5\u6307\u793a\u9700\u8981\u8bbf\u95ee\u54ea\u4e9b\u8868\u5757\u3002\u7136\u540e\u8fd9\u4e9b\u5757\u4f1a\u50cf\u5e76\u884c\u987a\u5e8f\u626b\u63cf\u90a3\u6837\u5206\u914d\u7ed9\u534f\u4f5c\u8fdb\u7a0b\u3002\u6362\u53e5\u8bdd\u8bf4\uff0c\u5806\u626b\u63cf\u662f\u5e76\u884c\u6267\u884c\u7684\uff0c\u4f46\u5e95\u5c42\u7d22\u5f15\u626b\u63cf\u4e0d\u662f\u3002"]}, {"title": "\u672c\u7248\u624b\u518c\u4e2d\u7684\u793a\u4f8b", "blocks": [{"code": "EXPLAIN SELECT * FROM tenk1 WHERE unique1 < 100;\n\n                                  QUERY PLAN\n------------------------------------------------------------------------------\n Bitmap Heap Scan on tenk1  (cost=5.07..229.20 rows=101 width=244)\n   Recheck Cond: (unique1 < 100)\n   ->  Bitmap Index Scan on tenk1_unique1  (cost=0.00..5.04 rows=101 width=0)\n         Index Cond: (unique1 < 100)", "source": {"url": "/docs/13/using-explain.html#USING-EXPLAIN-BASICS", "path": "using-explain.html", "label": "PostgreSQL 13.23 \u00b7 using-explain", "sha256": "650fd8629382d5dc8f9f8412c50ec5f32442a9ad2f98ca88e5348a7c2bd0ac7a"}, "paragraphs": ["\u793a\u4f8b\u6458\u81ea PostgreSQL 13.23 \u624b\u518c\uff1b\u672c\u767e\u79d1\u672a\u5b9e\u9645\u6267\u884c\u6b64\u793a\u4f8b\u3002", "\u73b0\u5728\u8fdb\u4e00\u6b65\u6536\u7d27\u6761\u4ef6\uff1a"]}, {"code": "EXPLAIN SELECT * FROM tenk1 WHERE unique1 < 100 AND stringu1 = 'xxx';\n\n                                  QUERY PLAN\n------------------------------------------------------------------------------\n Bitmap Heap Scan on tenk1  (cost=5.04..229.43 rows=1 width=244)\n   Recheck Cond: (unique1 < 100)\n   Filter: (stringu1 = 'xxx'::name)\n   ->  Bitmap Index Scan on tenk1_unique1  (cost=0.00..5.04 rows=101 width=0)\n         Index Cond: (unique1 < 100)", "source": {"url": "/docs/13/using-explain.html#USING-EXPLAIN-BASICS", "path": "using-explain.html", "label": "PostgreSQL 13.23 \u00b7 using-explain", "sha256": "650fd8629382d5dc8f9f8412c50ec5f32442a9ad2f98ca88e5348a7c2bd0ac7a"}, "paragraphs": ["\u793a\u4f8b\u6458\u81ea PostgreSQL 13.23 \u624b\u518c\uff1b\u672c\u767e\u79d1\u672a\u5b9e\u9645\u6267\u884c\u6b64\u793a\u4f8b\u3002", "\u73b0\u5728\u5411 WHERE \u5b50\u53e5\u518d\u6dfb\u52a0\u4e00\u4e2a\u6761\u4ef6\uff1a"]}]}, {"title": "\u6267\u884c\u5668\u5b9e\u73b0\u8bf4\u660e", "paragraphs": ["nodeBitmapHeapscan.c\uff1a\u652f\u6301\u5173\u7cfb\u4f4d\u56fe\u626b\u63cf\u7684\u4f8b\u7a0b\u3002", "\u6ce8\u610f\uff1a\u6b64\u8ba1\u5212\u7c7b\u578b\u5fc5\u987b\u4ec5\u4f7f\u7528\u7b26\u5408 MVCC \u7684\u5feb\u7167\uff0c\u5373\u666e\u901a\u5feb\u7167\uff0c\u800c\u975e SnapshotAny \u6216\u5176\u4ed6\u7279\u6b8a\u5feb\u7167\u3002\u7d22\u5f15\u626b\u63cf\u4e0e\u5806\u626b\u63cf\u76f8\u4e92\u5206\u79bb\uff0c\u8bbf\u95ee\u67d0\u4e2a\u5806 TID \u65f6\uff0c\u65e0\u6cd5\u4fdd\u8bc1\u4fc3\u6210\u8be5\u8bbf\u95ee\u7684\u7d22\u5f15\u5143\u7ec4\u4ecd\u7136\u5b58\u5728\u3002\u5806\u5143\u7ec4\u53ef\u80fd\u5df2\u7ecf\u6d88\u5931\uff08heap_fetch \u80fd\u5904\u7406\u8fd9\u79cd\u60c5\u51b5\uff09\uff0c\u66f4\u4e25\u91cd\u7684\u662f\uff0c\u5176\u4f4d\u7f6e\u53ef\u80fd\u5df2\u88ab\u66f4\u65b0\u7684\u5143\u7ec4\u590d\u7528\u3002\u4f7f\u7528 MVCC \u5feb\u7167\u65f6\uff0c\u65b0\u5143\u7ec4\u5fc5\u5b9a\u65e0\u6cd5\u901a\u8fc7\u65f6\u95f4\u53ef\u89c1\u6027\u68c0\u67e5\uff0c\u56e0\u6b64\u4e0d\u4f1a\u9519\u8bef\u8fd4\u56de\uff1b\u4f7f\u7528\u5176\u4ed6\u5feb\u7167\u5219\u53ef\u80fd\u8fd4\u56de\u4e0d\u7b26\u5408\u7d22\u5f15\u6761\u4ef6\u7684\u5143\u7ec4\u3002", "\u4ece BitmapHeapScan \u8282\u70b9\u7684 currentRelation \u4e2d\u8bfb\u53d6\u4e0b\u4e00\u4e2a\u5143\u7ec4\u3002", "\u5982\u679c\u5c1a\u672a\u6267\u884c\u5e95\u5c42\u7d22\u5f15\u626b\u63cf\uff0c\u5219\u5148\u6267\u884c\uff0c\u518d\u5f00\u59cb\u8fed\u4ee3\u4f4d\u56fe\u3002", "\u9884\u53d6\u4f7f\u7528\u4e24\u4e2a\u8fed\u4ee3\u5668\uff1a\u4e00\u4e2a\u7528\u4e8e\u5b9e\u9645\u626b\u63cf\u7684\u9875\u9762\uff0c\u53e6\u4e00\u4e2a\u9886\u5148\u4e8e\u524d\u8005\u6267\u884c\u9884\u53d6\u3002node->prefetch_pages \u7cbe\u786e\u8bb0\u5f55\u9884\u53d6\u8fed\u4ee3\u5668\u9886\u5148\u7684\u9875\u6570\u3002node->prefetch_target \u5219\u8bb0\u5f55\u671f\u671b\u7684\u9884\u53d6\u8ddd\u79bb\uff0c\u8be5\u503c\u4ece\u8f83\u5c0f\u503c\u5f00\u59cb\uff0c\u9010\u6e10\u589e\u5927\u5230 node->prefetch_maximum\u3002\u8fd9\u6837\u53ef\u4ee5\u907f\u514d\u56e0 LIMIT \u800c\u53ea\u8bfb\u53d6\u5c11\u91cf\u5143\u7ec4\u5c31\u505c\u6b62\u7684\u626b\u63cf\u6267\u884c\u5927\u91cf\u9884\u53d6\u3002"]}, {"code": "case T_BitmapHeapScan:\n\t\t\tpname = sname = \"Bitmap Heap Scan\";\n\t\t\tbreak;", "title": "\u6838\u5fc3\u6e90\u7801\u4e2d\u7684 EXPLAIN \u6807\u8bc6"}], "strategies": [], "description": ["\u8bbf\u95ee\u4f4d\u56fe\u9009\u4e2d\u7684\u5806\u9875\uff0c\u5e76\u6267\u884c\u5fc5\u8981\u7684\u91cd\u68c0\u3002"], "localization": {"status": "complete", "sources": [{"url": "/docs/13/parallel-plans.html", "method": "same-major semantic node", "sha256": "bbbbbd9cc27db6811c388e9c4951a9641c48871942bc709cec203e4271518c50", "language": "zh", "matched_nodes": ["#PARALLEL-PLANS/div[3]/div[2]/ul[0]/li[1]"]}], "language": "zh", "original_text": {"/versions/13/description/0": "Visits heap pages selected by a bitmap and performs required rechecks.", "/versions/13/facts/0/label": "Core node tag", "/versions/13/facts/1/label": "Structured EXPLAIN Node Type", "/versions/13/facts/2/label": "Inputs", "/versions/13/facts/2/value": "A tuple-location bitmap and relation", "/versions/13/facts/3/label": "Output", "/versions/13/facts/3/value": "Qualified heap tuples", "/versions/13/facts/4/label": "Executor initializer", "/versions/13/facts/5/label": "Memory mechanism", "/versions/13/tables/0/title": "EXPLAIN labels in this source build", "/versions/13/related/1/label": "Using EXPLAIN", "/versions/13/related/2/label": "Parallel plans", "/versions/13/sections/0/title": "EXPLAIN names and attributes", "/versions/13/sections/1/title": "Memory and temporary storage", "/versions/13/sections/2/title": "Parallel execution and instrumentation", "/versions/13/sections/3/title": "Same-version manual discussion", "/versions/13/sections/4/title": "Examples from this manual build", "/versions/13/sections/5/title": "Executor implementation notes", "/versions/13/sections/6/title": "EXPLAIN identity in core source", "/versions/13/memory/description": "This extraction does not assign a universal memory limit or spill policy to this node. Inspect the same-build implementation and its expressions or provider.", "/versions/13/sections/0/paragraphs/0": "Structured formats use the Node Type above. Text-format spellings can also include operation, strategy, join type, scan direction or aggregation-stage attributes.", "/versions/13/sections/0/paragraphs/1": "Text names recorded by this source: Bitmap Heap Scan.", "/versions/13/sections/0/paragraphs/2": "Parallel-aware and parallel-safe are different plan properties. A node running inside a parallel worker is not necessarily a parallel-aware node.", "/versions/13/sections/1/paragraphs/0": "This extraction does not assign a universal memory limit or spill policy to this node. Inspect the same-build implementation and its expressions or provider.", "/versions/13/sections/1/paragraphs/1": "If we are using lossy info, we have to recheck the qual conditions at every tuple.", "/versions/13/sections/2/paragraphs/0": "The source callbacks below can coordinate execution or collect worker instrumentation. Their presence is not a blanket claim that this node supports a shared parallel scan or shared state.", "/versions/13/sections/2/paragraphs/1": "Callbacks in this build: ExecBitmapHeapEstimate, ExecBitmapHeapInitializeDSM, ExecBitmapHeapInitializeWorker, ExecBitmapHeapReInitializeDSM.", "/versions/13/sections/3/paragraphs/0": "In a parallel bitmap heap scan , one process is chosen as the leader. That process performs a scan of one or more indexes and builds a bitmap indicating which table blocks need to be visited. These blocks are then divided among the cooperating processes as in a parallel sequential scan. In other words, the heap scan is performed in parallel, but the underlying index scan is not.", "/versions/13/sections/5/paragraphs/0": "nodeBitmapHeapscan.c Routines to support bitmapped scans of relations", "/versions/13/sections/5/paragraphs/1": "NOTE: it is critical that this plan type only be used with MVCC-compliant snapshots (ie, regular snapshots, not SnapshotAny or one of the other special snapshots). The reason is that since index and heap scans are decoupled, there can be no assurance that the index tuple prompting a visit to a particular heap TID still exists when the visit is made. Therefore the tuple might not exist anymore either (which is OK because heap_fetch will cope) --- but worse, the tuple slot could have been re-used for a newer tuple. With an MVCC snapshot the newer tuple is certain to fail the time qual and so it will not be mistakenly returned, but with anything else we might return a tuple that doesn't meet the required index qual conditions.", "/versions/13/sections/5/paragraphs/2": "Retrieve next tuple from the BitmapHeapScan node's currentRelation", "/versions/13/sections/5/paragraphs/3": "If we haven't yet performed the underlying index scan, do it, and begin the iteration over the bitmap.", "/versions/13/sections/5/paragraphs/4": "For prefetching, we use *two* iterators, one for the pages we are actually scanning and another that runs ahead of the first for prefetching. node->prefetch_pages tracks exactly how many pages ahead the prefetch iterator is. Also, node->prefetch_target tracks the desired prefetch distance, which starts small and increases up to the node->prefetch_maximum. This is to avoid doing a lot of prefetching in a scan that stops after a few tuples because of a LIMIT.", "/versions/13/tables/0/columns/0/label": "Text-format label", "/versions/13/tables/0/columns/1/label": "Structured node identity", "/versions/13/sections/4/blocks/0/paragraphs/0": "Example copied from the PostgreSQL 13.23 manual; it was not executed for this collection.", "/versions/13/sections/4/blocks/0/paragraphs/1": "Now, let's make the condition more restrictive:", "/versions/13/sections/4/blocks/1/paragraphs/0": "Example copied from the PostgreSQL 13.23 manual; it was not executed for this collection.", "/versions/13/sections/4/blocks/1/paragraphs/1": "Now let's add another condition to the WHERE clause:"}, "fallback_fields": [], "source_language": "en", "original_snapshot_sha256": "5476460b9c0715f2c0e5fb97ab83f0a72a7d8203c9ca2efa4762a9fe4ea18472"}, "evidence_kind": "source and documentation", "explain_names": ["Bitmap Heap Scan"], "partial_modes": [], "comparison_data": {"node_tag": "T_BitmapHeapScan", "strategies": [], "text_names": ["Bitmap Heap Scan"], "initializer": "ExecInitBitmapHeapScan", "partial_modes": [], "memory_mechanism": "unclassified", "parallel_callbacks": ["ExecBitmapHeapEstimate", "ExecBitmapHeapInitializeDSM", "ExecBitmapHeapInitializeWorker", "ExecBitmapHeapReInitializeDSM"]}, "comparison_hash": "bd05a85a745255a1c9cb85ef7f1d7684cac042aad27b3d05ee77a5ce928a6d0b", "explain_prefixes": ["Parallel"], "runtime_verified": false, "source_inventory": {"explain": "src/backend/commands/explain.c", "executor": "src/backend/executor/execProcnode.c", "implementation": "src/backend/executor/nodeBitmapHeapscan.c"}, "parallel_callbacks": ["ExecBitmapHeapEstimate", "ExecBitmapHeapInitializeDSM", "ExecBitmapHeapInitializeWorker", "ExecBitmapHeapReInitializeDSM"]}, "14": {"facts": [{"label": "\u6838\u5fc3\u8282\u70b9\u6807\u7b7e", "value": "T_BitmapHeapScan"}, {"label": "\u7ed3\u6784\u5316 EXPLAIN \u8282\u70b9\u7c7b\u578b", "value": "Bitmap Heap Scan"}, {"label": "\u8f93\u5165", "value": "\u5143\u7ec4\u4f4d\u7f6e\u4f4d\u56fe\u53ca\u5173\u7cfb"}, {"label": "\u8f93\u51fa", "value": "\u6ee1\u8db3\u6761\u4ef6\u7684\u5806\u5143\u7ec4"}, {"label": "\u6267\u884c\u5668\u521d\u59cb\u5316\u51fd\u6570", "value": "ExecInitBitmapHeapScan"}, {"label": "\u5185\u5b58\u673a\u5236", "value": "unclassified"}], "memory": {"evidence": [{"url": "https://ftp.postgresql.org/pub/source/v14.24/postgresql-14.24.tar.bz2", "path": "src/backend/executor/nodeBitmapHeapscan.c", "label": "src/backend/executor/nodeBitmapHeapscan.c", "sha256": "7b6814e583eb2fcf3259e3dc9c6891911e37ec26d88ba9b2a724d655f4bccaf0", "archive_sha256": "a7fa7ed3d558172355f51406097a7bd4f6b473be80f311ef7cda96bf383d8897"}], "mechanism": "unclassified", "description": "\u672c\u6b21\u62bd\u53d6\u4e0d\u4e3a\u6b64\u8282\u70b9\u8bbe\u5b9a\u7edf\u4e00\u7684\u5185\u5b58\u4e0a\u9650\u6216\u843d\u76d8\u7b56\u7565\u3002\u8bf7\u67e5\u770b\u540c\u4e00\u6784\u5efa\u7684\u5b9e\u73b0\u3001\u76f8\u5173\u8868\u8fbe\u5f0f\u6216\u63d0\u4f9b\u65b9\u3002", "source_notes": ["If we are using lossy info, we have to recheck the qual conditions at every tuple."]}, "tables": [{"key": "explain-labels", "rows": [{"label": "Bitmap Heap Scan", "identity": "Bitmap Heap Scan"}], "title": "\u672c\u6784\u5efa\u4e2d\u7684 EXPLAIN \u6807\u7b7e", "columns": [{"key": "label", "label": "\u6587\u672c\u683c\u5f0f\u6807\u7b7e"}, {"key": "identity", "label": "\u7ed3\u6784\u5316\u8282\u70b9\u6807\u8bc6"}]}], "related": [{"url": "/wiki/sql/explain/?v=14", "label": "EXPLAIN"}, {"url": "/docs/14/using-explain.html", "label": "\u4f7f\u7528 EXPLAIN"}, {"url": "/docs/14/parallel-plans.html", "label": "\u5e76\u884c\u8ba1\u5212"}, {"url": "/wiki/guc/enable_bitmapscan/?v=14", "label": "enable_bitmapscan"}], "release": {"ref": "PostgreSQL 14.24 source archive", "label": "14.24", "major": "14", "channel": "stable", "revision": "a7fa7ed3d558172355f51406097a7bd4f6b473be80f311ef7cda96bf383d8897", "source_url": "https://ftp.postgresql.org/pub/source/v14.24/postgresql-14.24.tar.bz2", "source_snapshot_utc": ""}, "sources": [{"url": "https://ftp.postgresql.org/pub/source/v14.24/postgresql-14.24.tar.bz2", "line": 1243, "path": "src/backend/commands/explain.c", "label": "src/backend/commands/explain.c:1243", "sha256": "e091be4e2a083b8dea39ccd09beedede22c1716ef974da66c214a44f48be8c41", "archive_sha256": "a7fa7ed3d558172355f51406097a7bd4f6b473be80f311ef7cda96bf383d8897"}, {"url": "https://ftp.postgresql.org/pub/source/v14.24/postgresql-14.24.tar.bz2", "line": 234, "path": "src/backend/executor/execProcnode.c", "label": "src/backend/executor/execProcnode.c:234", "sha256": "72da1c5ad457f1d92a39ab73531701794df858419e3b89d6e6cb7079634e68fa", "archive_sha256": "a7fa7ed3d558172355f51406097a7bd4f6b473be80f311ef7cda96bf383d8897"}, {"url": "https://ftp.postgresql.org/pub/source/v14.24/postgresql-14.24.tar.bz2", "path": "src/backend/executor/nodeBitmapHeapscan.c", "label": "src/backend/executor/nodeBitmapHeapscan.c", "sha256": "7b6814e583eb2fcf3259e3dc9c6891911e37ec26d88ba9b2a724d655f4bccaf0", "archive_sha256": "a7fa7ed3d558172355f51406097a7bd4f6b473be80f311ef7cda96bf383d8897"}, {"url": "https://ftp.postgresql.org/pub/source/v14.24/postgresql-14.24.tar.bz2", "path": "src/include/nodes/plannodes.h", "label": "src/include/nodes/plannodes.h", "sha256": "302f51a16b570dba7ec4e7bc045f7df5800d21630280354d1a24025f3baec75d", "archive_sha256": "a7fa7ed3d558172355f51406097a7bd4f6b473be80f311ef7cda96bf383d8897"}, {"url": "https://pg.center/docs/14/parallel-plans.html#PARALLEL-SCANS", "path": "parallel-plans.html", "label": "PostgreSQL 14.24 \u00b7 parallel-plans", "sha256": "71fc3525781b74150364925e123cd8598fdebe0e05326706f2bc2e1ffa0b88a4", "language": "en", "original_url": "/docs/14/parallel-plans.html#PARALLEL-SCANS"}, {"url": "https://pg.center/docs/14/using-explain.html#USING-EXPLAIN-BASICS", "path": "using-explain.html", "label": "PostgreSQL 14.24 \u00b7 using-explain", "sha256": "7f5ab59cb21a035ada45ea3426c5d1cca3f781273483677f73fdd76753555206", "language": "en", "original_url": "/docs/14/using-explain.html#USING-EXPLAIN-BASICS"}], "node_tag": "T_BitmapHeapScan", "sections": [{"title": "EXPLAIN \u540d\u79f0\u4e0e\u5c5e\u6027", "paragraphs": ["\u7ed3\u6784\u5316\u683c\u5f0f\u4f7f\u7528\u4e0a\u8ff0 Node Type\u3002\u6587\u672c\u683c\u5f0f\u540d\u79f0\u8fd8\u53ef\u80fd\u5305\u542b\u64cd\u4f5c\u3001\u7b56\u7565\u3001\u8fde\u63a5\u7c7b\u578b\u3001\u626b\u63cf\u65b9\u5411\u6216\u805a\u5408\u9636\u6bb5\u5c5e\u6027\u3002", "\u6b64\u6e90\u7801\u8bb0\u5f55\u7684\u6587\u672c\u540d\u79f0\uff1aBitmap Heap Scan.", "\u5e76\u884c\u611f\u77e5\u4e0e\u5e76\u884c\u5b89\u5168\u662f\u4e0d\u540c\u7684\u8ba1\u5212\u5c5e\u6027\u3002\u5728\u5e76\u884c\u5de5\u4f5c\u8fdb\u7a0b\u5185\u8fd0\u884c\u7684\u8282\u70b9\u4e0d\u4e00\u5b9a\u662f\u5e76\u884c\u611f\u77e5\u8282\u70b9\u3002"]}, {"title": "\u5185\u5b58\u4e0e\u4e34\u65f6\u5b58\u50a8", "paragraphs": ["\u672c\u6b21\u62bd\u53d6\u4e0d\u4e3a\u6b64\u8282\u70b9\u8bbe\u5b9a\u7edf\u4e00\u7684\u5185\u5b58\u4e0a\u9650\u6216\u843d\u76d8\u7b56\u7565\u3002\u8bf7\u67e5\u770b\u540c\u4e00\u6784\u5efa\u7684\u5b9e\u73b0\u3001\u76f8\u5173\u8868\u8fbe\u5f0f\u6216\u63d0\u4f9b\u65b9\u3002", "\u4f7f\u7528\u6709\u635f\u4fe1\u606f\u65f6\uff0c\u5fc5\u987b\u5bf9\u6bcf\u4e2a\u5143\u7ec4\u91cd\u65b0\u68c0\u67e5\u6761\u4ef6\u3002"]}, {"title": "\u5e76\u884c\u6267\u884c\u4e0e\u8fd0\u884c\u4fe1\u606f\u91c7\u96c6", "paragraphs": ["\u4ee5\u4e0b\u6e90\u7801\u56de\u8c03\u53ef\u4ee5\u534f\u8c03\u6267\u884c\u6216\u6536\u96c6\u5de5\u4f5c\u8fdb\u7a0b\u7684\u6d4b\u91cf\u6570\u636e\u3002\u56de\u8c03\u5b58\u5728\u4e0d\u4ee3\u8868\u8be5\u8282\u70b9\u666e\u904d\u652f\u6301\u5171\u4eab\u5e76\u884c\u626b\u63cf\u6216\u5171\u4eab\u72b6\u6001\u3002", "\u6b64\u6784\u5efa\u7684\u56de\u8c03\uff1aExecBitmapHeapEstimate, ExecBitmapHeapInitializeDSM, ExecBitmapHeapInitializeWorker, ExecBitmapHeapReInitializeDSM."]}, {"title": "\u540c\u7248\u672c\u624b\u518c\u8bf4\u660e", "paragraphs": ["\u5728 \u5e76\u884c\u4f4d\u56fe\u5806\u626b\u63cf \u4e2d\uff0c\u4f1a\u9009\u62e9\u4e00\u4e2a\u8fdb\u7a0b\u4f5c\u4e3a\u9886\u5bfc\u8005\u3002\u8be5\u8fdb\u7a0b\u6267\u884c\u4e00\u4e2a\u6216\u591a\u4e2a\u7d22\u5f15\u626b\u63cf\uff0c\u5e76\u6784\u5efa\u4e00\u4e2a\u4f4d\u56fe\uff0c\u4ee5\u6307\u793a\u9700\u8981\u8bbf\u95ee\u54ea\u4e9b\u8868\u5757\u3002\u7136\u540e\u8fd9\u4e9b\u5757\u4f1a\u50cf\u5e76\u884c\u987a\u5e8f\u626b\u63cf\u90a3\u6837\u5206\u914d\u7ed9\u534f\u4f5c\u8fdb\u7a0b\u3002\u6362\u53e5\u8bdd\u8bf4\uff0c\u5806\u626b\u63cf\u662f\u5e76\u884c\u6267\u884c\u7684\uff0c\u4f46\u5e95\u5c42\u7d22\u5f15\u626b\u63cf\u4e0d\u662f\u3002"]}, {"title": "\u672c\u7248\u624b\u518c\u4e2d\u7684\u793a\u4f8b", "blocks": [{"code": "EXPLAIN SELECT * FROM tenk1 WHERE unique1 < 100;\n\n                                  QUERY PLAN\n------------------------------------------------------------------------------\n Bitmap Heap Scan on tenk1  (cost=5.07..229.20 rows=101 width=244)\n   Recheck Cond: (unique1 < 100)\n   ->  Bitmap Index Scan on tenk1_unique1  (cost=0.00..5.04 rows=101 width=0)\n         Index Cond: (unique1 < 100)", "source": {"url": "/docs/14/using-explain.html#USING-EXPLAIN-BASICS", "path": "using-explain.html", "label": "PostgreSQL 14.24 \u00b7 using-explain", "sha256": "7f5ab59cb21a035ada45ea3426c5d1cca3f781273483677f73fdd76753555206"}, "paragraphs": ["\u793a\u4f8b\u6458\u81ea PostgreSQL 14.24 \u624b\u518c\uff1b\u672c\u767e\u79d1\u672a\u5b9e\u9645\u6267\u884c\u6b64\u793a\u4f8b\u3002", "\u73b0\u5728\u8fdb\u4e00\u6b65\u6536\u7d27\u6761\u4ef6\uff1a"]}, {"code": "EXPLAIN SELECT * FROM tenk1 WHERE unique1 < 100 AND stringu1 = 'xxx';\n\n                                  QUERY PLAN\n------------------------------------------------------------------------------\n Bitmap Heap Scan on tenk1  (cost=5.04..229.43 rows=1 width=244)\n   Recheck Cond: (unique1 < 100)\n   Filter: (stringu1 = 'xxx'::name)\n   ->  Bitmap Index Scan on tenk1_unique1  (cost=0.00..5.04 rows=101 width=0)\n         Index Cond: (unique1 < 100)", "source": {"url": "/docs/14/using-explain.html#USING-EXPLAIN-BASICS", "path": "using-explain.html", "label": "PostgreSQL 14.24 \u00b7 using-explain", "sha256": "7f5ab59cb21a035ada45ea3426c5d1cca3f781273483677f73fdd76753555206"}, "paragraphs": ["\u793a\u4f8b\u6458\u81ea PostgreSQL 14.24 \u624b\u518c\uff1b\u672c\u767e\u79d1\u672a\u5b9e\u9645\u6267\u884c\u6b64\u793a\u4f8b\u3002", "\u73b0\u5728\u5411 WHERE \u5b50\u53e5\u518d\u6dfb\u52a0\u4e00\u4e2a\u6761\u4ef6\uff1a"]}]}, {"title": "\u6267\u884c\u5668\u5b9e\u73b0\u8bf4\u660e", "paragraphs": ["nodeBitmapHeapscan.c\uff1a\u652f\u6301\u5173\u7cfb\u4f4d\u56fe\u626b\u63cf\u7684\u4f8b\u7a0b\u3002", "\u6ce8\u610f\uff1a\u6b64\u8ba1\u5212\u7c7b\u578b\u5fc5\u987b\u4ec5\u4f7f\u7528\u7b26\u5408 MVCC \u7684\u5feb\u7167\uff0c\u5373\u666e\u901a\u5feb\u7167\uff0c\u800c\u975e SnapshotAny \u6216\u5176\u4ed6\u7279\u6b8a\u5feb\u7167\u3002\u7d22\u5f15\u626b\u63cf\u4e0e\u5806\u626b\u63cf\u76f8\u4e92\u5206\u79bb\uff0c\u8bbf\u95ee\u67d0\u4e2a\u5806 TID \u65f6\uff0c\u65e0\u6cd5\u4fdd\u8bc1\u4fc3\u6210\u8be5\u8bbf\u95ee\u7684\u7d22\u5f15\u5143\u7ec4\u4ecd\u7136\u5b58\u5728\u3002\u5806\u5143\u7ec4\u53ef\u80fd\u5df2\u7ecf\u6d88\u5931\uff08heap_fetch \u80fd\u5904\u7406\u8fd9\u79cd\u60c5\u51b5\uff09\uff0c\u66f4\u4e25\u91cd\u7684\u662f\uff0c\u5176\u4f4d\u7f6e\u53ef\u80fd\u5df2\u88ab\u66f4\u65b0\u7684\u5143\u7ec4\u590d\u7528\u3002\u4f7f\u7528 MVCC \u5feb\u7167\u65f6\uff0c\u65b0\u5143\u7ec4\u5fc5\u5b9a\u65e0\u6cd5\u901a\u8fc7\u65f6\u95f4\u53ef\u89c1\u6027\u68c0\u67e5\uff0c\u56e0\u6b64\u4e0d\u4f1a\u9519\u8bef\u8fd4\u56de\uff1b\u4f7f\u7528\u5176\u4ed6\u5feb\u7167\u5219\u53ef\u80fd\u8fd4\u56de\u4e0d\u7b26\u5408\u7d22\u5f15\u6761\u4ef6\u7684\u5143\u7ec4\u3002", "\u4ece BitmapHeapScan \u8282\u70b9\u7684 currentRelation \u4e2d\u8bfb\u53d6\u4e0b\u4e00\u4e2a\u5143\u7ec4\u3002", "\u5982\u679c\u5c1a\u672a\u6267\u884c\u5e95\u5c42\u7d22\u5f15\u626b\u63cf\uff0c\u5219\u5148\u6267\u884c\uff0c\u518d\u5f00\u59cb\u8fed\u4ee3\u4f4d\u56fe\u3002", "\u9884\u53d6\u4f7f\u7528\u4e24\u4e2a\u8fed\u4ee3\u5668\uff1a\u4e00\u4e2a\u7528\u4e8e\u5b9e\u9645\u626b\u63cf\u7684\u9875\u9762\uff0c\u53e6\u4e00\u4e2a\u9886\u5148\u4e8e\u524d\u8005\u6267\u884c\u9884\u53d6\u3002node->prefetch_pages \u7cbe\u786e\u8bb0\u5f55\u9884\u53d6\u8fed\u4ee3\u5668\u9886\u5148\u7684\u9875\u6570\u3002node->prefetch_target \u5219\u8bb0\u5f55\u671f\u671b\u7684\u9884\u53d6\u8ddd\u79bb\uff0c\u8be5\u503c\u4ece\u8f83\u5c0f\u503c\u5f00\u59cb\uff0c\u9010\u6e10\u589e\u5927\u5230 node->prefetch_maximum\u3002\u8fd9\u6837\u53ef\u4ee5\u907f\u514d\u56e0 LIMIT \u800c\u53ea\u8bfb\u53d6\u5c11\u91cf\u5143\u7ec4\u5c31\u505c\u6b62\u7684\u626b\u63cf\u6267\u884c\u5927\u91cf\u9884\u53d6\u3002"]}, {"code": "case T_BitmapHeapScan:\n\t\t\tpname = sname = \"Bitmap Heap Scan\";\n\t\t\tbreak;", "title": "\u6838\u5fc3\u6e90\u7801\u4e2d\u7684 EXPLAIN \u6807\u8bc6"}], "strategies": [], "description": ["\u8bbf\u95ee\u4f4d\u56fe\u9009\u4e2d\u7684\u5806\u9875\uff0c\u5e76\u6267\u884c\u5fc5\u8981\u7684\u91cd\u68c0\u3002"], "localization": {"status": "complete", "sources": [{"url": "/docs/14/parallel-plans.html", "method": "same-major semantic node", "sha256": "27ba0fab61ef7b5aa518b18597a7cd30f9560e5cf2b383016d31e59518892f88", "language": "zh", "matched_nodes": ["#PARALLEL-PLANS/div[3]/div[2]/ul[0]/li[1]"]}], "language": "zh", "original_text": {"/versions/14/description/0": "Visits heap pages selected by a bitmap and performs required rechecks.", "/versions/14/facts/0/label": "Core node tag", "/versions/14/facts/1/label": "Structured EXPLAIN Node Type", "/versions/14/facts/2/label": "Inputs", "/versions/14/facts/2/value": "A tuple-location bitmap and relation", "/versions/14/facts/3/label": "Output", "/versions/14/facts/3/value": "Qualified heap tuples", "/versions/14/facts/4/label": "Executor initializer", "/versions/14/facts/5/label": "Memory mechanism", "/versions/14/tables/0/title": "EXPLAIN labels in this source build", "/versions/14/related/1/label": "Using EXPLAIN", "/versions/14/related/2/label": "Parallel plans", "/versions/14/sections/0/title": "EXPLAIN names and attributes", "/versions/14/sections/1/title": "Memory and temporary storage", "/versions/14/sections/2/title": "Parallel execution and instrumentation", "/versions/14/sections/3/title": "Same-version manual discussion", "/versions/14/sections/4/title": "Examples from this manual build", "/versions/14/sections/5/title": "Executor implementation notes", "/versions/14/sections/6/title": "EXPLAIN identity in core source", "/versions/14/memory/description": "This extraction does not assign a universal memory limit or spill policy to this node. Inspect the same-build implementation and its expressions or provider.", "/versions/14/sections/0/paragraphs/0": "Structured formats use the Node Type above. Text-format spellings can also include operation, strategy, join type, scan direction or aggregation-stage attributes.", "/versions/14/sections/0/paragraphs/1": "Text names recorded by this source: Bitmap Heap Scan.", "/versions/14/sections/0/paragraphs/2": "Parallel-aware and parallel-safe are different plan properties. A node running inside a parallel worker is not necessarily a parallel-aware node.", "/versions/14/sections/1/paragraphs/0": "This extraction does not assign a universal memory limit or spill policy to this node. Inspect the same-build implementation and its expressions or provider.", "/versions/14/sections/1/paragraphs/1": "If we are using lossy info, we have to recheck the qual conditions at every tuple.", "/versions/14/sections/2/paragraphs/0": "The source callbacks below can coordinate execution or collect worker instrumentation. Their presence is not a blanket claim that this node supports a shared parallel scan or shared state.", "/versions/14/sections/2/paragraphs/1": "Callbacks in this build: ExecBitmapHeapEstimate, ExecBitmapHeapInitializeDSM, ExecBitmapHeapInitializeWorker, ExecBitmapHeapReInitializeDSM.", "/versions/14/sections/3/paragraphs/0": "In a parallel bitmap heap scan , one process is chosen as the leader. That process performs a scan of one or more indexes and builds a bitmap indicating which table blocks need to be visited. These blocks are then divided among the cooperating processes as in a parallel sequential scan. In other words, the heap scan is performed in parallel, but the underlying index scan is not.", "/versions/14/sections/5/paragraphs/0": "nodeBitmapHeapscan.c Routines to support bitmapped scans of relations", "/versions/14/sections/5/paragraphs/1": "NOTE: it is critical that this plan type only be used with MVCC-compliant snapshots (ie, regular snapshots, not SnapshotAny or one of the other special snapshots). The reason is that since index and heap scans are decoupled, there can be no assurance that the index tuple prompting a visit to a particular heap TID still exists when the visit is made. Therefore the tuple might not exist anymore either (which is OK because heap_fetch will cope) --- but worse, the tuple slot could have been re-used for a newer tuple. With an MVCC snapshot the newer tuple is certain to fail the time qual and so it will not be mistakenly returned, but with anything else we might return a tuple that doesn't meet the required index qual conditions.", "/versions/14/sections/5/paragraphs/2": "Retrieve next tuple from the BitmapHeapScan node's currentRelation", "/versions/14/sections/5/paragraphs/3": "If we haven't yet performed the underlying index scan, do it, and begin the iteration over the bitmap.", "/versions/14/sections/5/paragraphs/4": "For prefetching, we use *two* iterators, one for the pages we are actually scanning and another that runs ahead of the first for prefetching. node->prefetch_pages tracks exactly how many pages ahead the prefetch iterator is. Also, node->prefetch_target tracks the desired prefetch distance, which starts small and increases up to the node->prefetch_maximum. This is to avoid doing a lot of prefetching in a scan that stops after a few tuples because of a LIMIT.", "/versions/14/tables/0/columns/0/label": "Text-format label", "/versions/14/tables/0/columns/1/label": "Structured node identity", "/versions/14/sections/4/blocks/0/paragraphs/0": "Example copied from the PostgreSQL 14.24 manual; it was not executed for this collection.", "/versions/14/sections/4/blocks/0/paragraphs/1": "Now, let's make the condition more restrictive:", "/versions/14/sections/4/blocks/1/paragraphs/0": "Example copied from the PostgreSQL 14.24 manual; it was not executed for this collection.", "/versions/14/sections/4/blocks/1/paragraphs/1": "Now let's add another condition to the WHERE clause:"}, "fallback_fields": [], "source_language": "en", "original_snapshot_sha256": "050c1d7a45037c0ca85de5a124313bd99edbfb1cf4c70a2125ea802c9f076ba7"}, "evidence_kind": "source and documentation", "explain_names": ["Bitmap Heap Scan"], "partial_modes": [], "comparison_data": {"node_tag": "T_BitmapHeapScan", "strategies": [], "text_names": ["Bitmap Heap Scan"], "initializer": "ExecInitBitmapHeapScan", "partial_modes": [], "memory_mechanism": "unclassified", "parallel_callbacks": ["ExecBitmapHeapEstimate", "ExecBitmapHeapInitializeDSM", "ExecBitmapHeapInitializeWorker", "ExecBitmapHeapReInitializeDSM"]}, "comparison_hash": "bd05a85a745255a1c9cb85ef7f1d7684cac042aad27b3d05ee77a5ce928a6d0b", "explain_prefixes": ["Parallel", "Async"], "runtime_verified": false, "source_inventory": {"explain": "src/backend/commands/explain.c", "executor": "src/backend/executor/execProcnode.c", "implementation": "src/backend/executor/nodeBitmapHeapscan.c"}, "parallel_callbacks": ["ExecBitmapHeapEstimate", "ExecBitmapHeapInitializeDSM", "ExecBitmapHeapInitializeWorker", "ExecBitmapHeapReInitializeDSM"]}, "15": {"facts": [{"label": "\u6838\u5fc3\u8282\u70b9\u6807\u7b7e", "value": "T_BitmapHeapScan"}, {"label": "\u7ed3\u6784\u5316 EXPLAIN \u8282\u70b9\u7c7b\u578b", "value": "Bitmap Heap Scan"}, {"label": "\u8f93\u5165", "value": "\u5143\u7ec4\u4f4d\u7f6e\u4f4d\u56fe\u53ca\u5173\u7cfb"}, {"label": "\u8f93\u51fa", "value": "\u6ee1\u8db3\u6761\u4ef6\u7684\u5806\u5143\u7ec4"}, {"label": "\u6267\u884c\u5668\u521d\u59cb\u5316\u51fd\u6570", "value": "ExecInitBitmapHeapScan"}, {"label": "\u5185\u5b58\u673a\u5236", "value": "unclassified"}], "memory": {"evidence": [{"url": "https://ftp.postgresql.org/pub/source/v15.19/postgresql-15.19.tar.bz2", "path": "src/backend/executor/nodeBitmapHeapscan.c", "label": "src/backend/executor/nodeBitmapHeapscan.c", "sha256": "901b40844c35e6532b00a1fff3b8db28d0479d21fab3898a60c175dc25e99c69", "archive_sha256": "e1a64a87a46b825b88c082e4518161a47aab53c45694964f8ba1df28f7859f89"}], "mechanism": "unclassified", "description": "\u672c\u6b21\u62bd\u53d6\u4e0d\u4e3a\u6b64\u8282\u70b9\u8bbe\u5b9a\u7edf\u4e00\u7684\u5185\u5b58\u4e0a\u9650\u6216\u843d\u76d8\u7b56\u7565\u3002\u8bf7\u67e5\u770b\u540c\u4e00\u6784\u5efa\u7684\u5b9e\u73b0\u3001\u76f8\u5173\u8868\u8fbe\u5f0f\u6216\u63d0\u4f9b\u65b9\u3002", "source_notes": ["If we are using lossy info, we have to recheck the qual conditions at every tuple."]}, "tables": [{"key": "explain-labels", "rows": [{"label": "Bitmap Heap Scan", "identity": "Bitmap Heap Scan"}], "title": "\u672c\u6784\u5efa\u4e2d\u7684 EXPLAIN \u6807\u7b7e", "columns": [{"key": "label", "label": "\u6587\u672c\u683c\u5f0f\u6807\u7b7e"}, {"key": "identity", "label": "\u7ed3\u6784\u5316\u8282\u70b9\u6807\u8bc6"}]}], "related": [{"url": "/wiki/sql/explain/?v=15", "label": "EXPLAIN"}, {"url": "/docs/15/using-explain.html", "label": "\u4f7f\u7528 EXPLAIN"}, {"url": "/docs/15/parallel-plans.html", "label": "\u5e76\u884c\u8ba1\u5212"}, {"url": "/wiki/guc/enable_bitmapscan/?v=15", "label": "enable_bitmapscan"}], "release": {"ref": "PostgreSQL 15.19 source archive", "label": "15.19", "major": "15", "channel": "stable", "revision": "e1a64a87a46b825b88c082e4518161a47aab53c45694964f8ba1df28f7859f89", "source_url": "https://ftp.postgresql.org/pub/source/v15.19/postgresql-15.19.tar.bz2", "source_snapshot_utc": ""}, "sources": [{"url": "https://ftp.postgresql.org/pub/source/v15.19/postgresql-15.19.tar.bz2", "line": 1246, "path": "src/backend/commands/explain.c", "label": "src/backend/commands/explain.c:1246", "sha256": "bb3b442d0f1b098aa8707335250102f027a596cd94117308bd16d1d36b258f5c", "archive_sha256": "e1a64a87a46b825b88c082e4518161a47aab53c45694964f8ba1df28f7859f89"}, {"url": "https://ftp.postgresql.org/pub/source/v15.19/postgresql-15.19.tar.bz2", "line": 234, "path": "src/backend/executor/execProcnode.c", "label": "src/backend/executor/execProcnode.c:234", "sha256": "19836c50a272741a4eac653541e655437c2e00710a541e5348d6a277d0669d7c", "archive_sha256": "e1a64a87a46b825b88c082e4518161a47aab53c45694964f8ba1df28f7859f89"}, {"url": "https://ftp.postgresql.org/pub/source/v15.19/postgresql-15.19.tar.bz2", "path": "src/backend/executor/nodeBitmapHeapscan.c", "label": "src/backend/executor/nodeBitmapHeapscan.c", "sha256": "901b40844c35e6532b00a1fff3b8db28d0479d21fab3898a60c175dc25e99c69", "archive_sha256": "e1a64a87a46b825b88c082e4518161a47aab53c45694964f8ba1df28f7859f89"}, {"url": "https://ftp.postgresql.org/pub/source/v15.19/postgresql-15.19.tar.bz2", "path": "src/include/nodes/plannodes.h", "label": "src/include/nodes/plannodes.h", "sha256": "fb4a4c8165495299131173680bc02a950d88e1ff610231fd97997bc0c9afc1d7", "archive_sha256": "e1a64a87a46b825b88c082e4518161a47aab53c45694964f8ba1df28f7859f89"}, {"url": "https://pg.center/docs/15/parallel-plans.html#PARALLEL-SCANS", "path": "parallel-plans.html", "label": "PostgreSQL 15.19 \u00b7 parallel-plans", "sha256": "ec9345488a15cdc05d3e0b0849763e2bf0b864ad17de786c5f023db5dab1ea96", "language": "en", "original_url": "/docs/15/parallel-plans.html#PARALLEL-SCANS"}, {"url": "https://pg.center/docs/15/using-explain.html#USING-EXPLAIN-BASICS", "path": "using-explain.html", "label": "PostgreSQL 15.19 \u00b7 using-explain", "sha256": "d1f509457c647da453d2575c772d91022a0f115dd84f9a3b20f5ff25a243648f", "language": "en", "original_url": "/docs/15/using-explain.html#USING-EXPLAIN-BASICS"}], "node_tag": "T_BitmapHeapScan", "sections": [{"title": "EXPLAIN \u540d\u79f0\u4e0e\u5c5e\u6027", "paragraphs": ["\u7ed3\u6784\u5316\u683c\u5f0f\u4f7f\u7528\u4e0a\u8ff0 Node Type\u3002\u6587\u672c\u683c\u5f0f\u540d\u79f0\u8fd8\u53ef\u80fd\u5305\u542b\u64cd\u4f5c\u3001\u7b56\u7565\u3001\u8fde\u63a5\u7c7b\u578b\u3001\u626b\u63cf\u65b9\u5411\u6216\u805a\u5408\u9636\u6bb5\u5c5e\u6027\u3002", "\u6b64\u6e90\u7801\u8bb0\u5f55\u7684\u6587\u672c\u540d\u79f0\uff1aBitmap Heap Scan.", "\u5e76\u884c\u611f\u77e5\u4e0e\u5e76\u884c\u5b89\u5168\u662f\u4e0d\u540c\u7684\u8ba1\u5212\u5c5e\u6027\u3002\u5728\u5e76\u884c\u5de5\u4f5c\u8fdb\u7a0b\u5185\u8fd0\u884c\u7684\u8282\u70b9\u4e0d\u4e00\u5b9a\u662f\u5e76\u884c\u611f\u77e5\u8282\u70b9\u3002"]}, {"title": "\u5185\u5b58\u4e0e\u4e34\u65f6\u5b58\u50a8", "paragraphs": ["\u672c\u6b21\u62bd\u53d6\u4e0d\u4e3a\u6b64\u8282\u70b9\u8bbe\u5b9a\u7edf\u4e00\u7684\u5185\u5b58\u4e0a\u9650\u6216\u843d\u76d8\u7b56\u7565\u3002\u8bf7\u67e5\u770b\u540c\u4e00\u6784\u5efa\u7684\u5b9e\u73b0\u3001\u76f8\u5173\u8868\u8fbe\u5f0f\u6216\u63d0\u4f9b\u65b9\u3002", "\u4f7f\u7528\u6709\u635f\u4fe1\u606f\u65f6\uff0c\u5fc5\u987b\u5bf9\u6bcf\u4e2a\u5143\u7ec4\u91cd\u65b0\u68c0\u67e5\u6761\u4ef6\u3002"]}, {"title": "\u5e76\u884c\u6267\u884c\u4e0e\u8fd0\u884c\u4fe1\u606f\u91c7\u96c6", "paragraphs": ["\u4ee5\u4e0b\u6e90\u7801\u56de\u8c03\u53ef\u4ee5\u534f\u8c03\u6267\u884c\u6216\u6536\u96c6\u5de5\u4f5c\u8fdb\u7a0b\u7684\u6d4b\u91cf\u6570\u636e\u3002\u56de\u8c03\u5b58\u5728\u4e0d\u4ee3\u8868\u8be5\u8282\u70b9\u666e\u904d\u652f\u6301\u5171\u4eab\u5e76\u884c\u626b\u63cf\u6216\u5171\u4eab\u72b6\u6001\u3002", "\u6b64\u6784\u5efa\u7684\u56de\u8c03\uff1aExecBitmapHeapEstimate, ExecBitmapHeapInitializeDSM, ExecBitmapHeapInitializeWorker, ExecBitmapHeapReInitializeDSM."]}, {"title": "\u540c\u7248\u672c\u624b\u518c\u8bf4\u660e", "paragraphs": ["\u5728 \u5e76\u884c\u4f4d\u56fe\u5806\u626b\u63cf \u4e2d\uff0c\u4f1a\u9009\u62e9\u4e00\u4e2a\u8fdb\u7a0b\u4f5c\u4e3a\u9886\u5bfc\u8005\u3002\u8be5\u8fdb\u7a0b\u6267\u884c\u4e00\u4e2a\u6216\u591a\u4e2a\u7d22\u5f15\u626b\u63cf\uff0c\u5e76\u6784\u5efa\u4e00\u4e2a\u4f4d\u56fe\uff0c\u4ee5\u6307\u793a\u9700\u8981\u8bbf\u95ee\u54ea\u4e9b\u8868\u5757\u3002\u7136\u540e\u8fd9\u4e9b\u5757\u4f1a\u50cf\u5e76\u884c\u987a\u5e8f\u626b\u63cf\u90a3\u6837\u5206\u914d\u7ed9\u534f\u4f5c\u8fdb\u7a0b\u3002\u6362\u53e5\u8bdd\u8bf4\uff0c\u5806\u626b\u63cf\u662f\u5e76\u884c\u6267\u884c\u7684\uff0c\u4f46\u5e95\u5c42\u7d22\u5f15\u626b\u63cf\u4e0d\u662f\u3002"]}, {"title": "\u672c\u7248\u624b\u518c\u4e2d\u7684\u793a\u4f8b", "blocks": [{"code": "EXPLAIN SELECT * FROM tenk1 WHERE unique1 < 100;\n\n                                  QUERY PLAN\n------------------------------------------------------------------------------\n Bitmap Heap Scan on tenk1  (cost=5.07..229.20 rows=101 width=244)\n   Recheck Cond: (unique1 < 100)\n   ->  Bitmap Index Scan on tenk1_unique1  (cost=0.00..5.04 rows=101 width=0)\n         Index Cond: (unique1 < 100)", "source": {"url": "/docs/15/using-explain.html#USING-EXPLAIN-BASICS", "path": "using-explain.html", "label": "PostgreSQL 15.19 \u00b7 using-explain", "sha256": "d1f509457c647da453d2575c772d91022a0f115dd84f9a3b20f5ff25a243648f"}, "paragraphs": ["\u793a\u4f8b\u6458\u81ea PostgreSQL 15.19 \u624b\u518c\uff1b\u672c\u767e\u79d1\u672a\u5b9e\u9645\u6267\u884c\u6b64\u793a\u4f8b\u3002", "\u73b0\u5728\u8fdb\u4e00\u6b65\u6536\u7d27\u6761\u4ef6\uff1a"]}, {"code": "EXPLAIN SELECT * FROM tenk1 WHERE unique1 < 100 AND stringu1 = 'xxx';\n\n                                  QUERY PLAN\n------------------------------------------------------------------------------\n Bitmap Heap Scan on tenk1  (cost=5.04..229.43 rows=1 width=244)\n   Recheck Cond: (unique1 < 100)\n   Filter: (stringu1 = 'xxx'::name)\n   ->  Bitmap Index Scan on tenk1_unique1  (cost=0.00..5.04 rows=101 width=0)\n         Index Cond: (unique1 < 100)", "source": {"url": "/docs/15/using-explain.html#USING-EXPLAIN-BASICS", "path": "using-explain.html", "label": "PostgreSQL 15.19 \u00b7 using-explain", "sha256": "d1f509457c647da453d2575c772d91022a0f115dd84f9a3b20f5ff25a243648f"}, "paragraphs": ["\u793a\u4f8b\u6458\u81ea PostgreSQL 15.19 \u624b\u518c\uff1b\u672c\u767e\u79d1\u672a\u5b9e\u9645\u6267\u884c\u6b64\u793a\u4f8b\u3002", "\u73b0\u5728\u5411 WHERE \u5b50\u53e5\u518d\u6dfb\u52a0\u4e00\u4e2a\u6761\u4ef6\uff1a"]}]}, {"title": "\u6267\u884c\u5668\u5b9e\u73b0\u8bf4\u660e", "paragraphs": ["nodeBitmapHeapscan.c\uff1a\u652f\u6301\u5173\u7cfb\u4f4d\u56fe\u626b\u63cf\u7684\u4f8b\u7a0b\u3002", "\u6ce8\u610f\uff1a\u6b64\u8ba1\u5212\u7c7b\u578b\u5fc5\u987b\u4ec5\u4f7f\u7528\u7b26\u5408 MVCC \u7684\u5feb\u7167\uff0c\u5373\u666e\u901a\u5feb\u7167\uff0c\u800c\u975e SnapshotAny \u6216\u5176\u4ed6\u7279\u6b8a\u5feb\u7167\u3002\u7d22\u5f15\u626b\u63cf\u4e0e\u5806\u626b\u63cf\u76f8\u4e92\u5206\u79bb\uff0c\u8bbf\u95ee\u67d0\u4e2a\u5806 TID \u65f6\uff0c\u65e0\u6cd5\u4fdd\u8bc1\u4fc3\u6210\u8be5\u8bbf\u95ee\u7684\u7d22\u5f15\u5143\u7ec4\u4ecd\u7136\u5b58\u5728\u3002\u5806\u5143\u7ec4\u53ef\u80fd\u5df2\u7ecf\u6d88\u5931\uff08heap_fetch \u80fd\u5904\u7406\u8fd9\u79cd\u60c5\u51b5\uff09\uff0c\u66f4\u4e25\u91cd\u7684\u662f\uff0c\u5176\u4f4d\u7f6e\u53ef\u80fd\u5df2\u88ab\u66f4\u65b0\u7684\u5143\u7ec4\u590d\u7528\u3002\u4f7f\u7528 MVCC \u5feb\u7167\u65f6\uff0c\u65b0\u5143\u7ec4\u5fc5\u5b9a\u65e0\u6cd5\u901a\u8fc7\u65f6\u95f4\u53ef\u89c1\u6027\u68c0\u67e5\uff0c\u56e0\u6b64\u4e0d\u4f1a\u9519\u8bef\u8fd4\u56de\uff1b\u4f7f\u7528\u5176\u4ed6\u5feb\u7167\u5219\u53ef\u80fd\u8fd4\u56de\u4e0d\u7b26\u5408\u7d22\u5f15\u6761\u4ef6\u7684\u5143\u7ec4\u3002", "\u4ece BitmapHeapScan \u8282\u70b9\u7684 currentRelation \u4e2d\u8bfb\u53d6\u4e0b\u4e00\u4e2a\u5143\u7ec4\u3002", "\u5982\u679c\u5c1a\u672a\u6267\u884c\u5e95\u5c42\u7d22\u5f15\u626b\u63cf\uff0c\u5219\u5148\u6267\u884c\uff0c\u518d\u5f00\u59cb\u8fed\u4ee3\u4f4d\u56fe\u3002", "\u9884\u53d6\u4f7f\u7528\u4e24\u4e2a\u8fed\u4ee3\u5668\uff1a\u4e00\u4e2a\u7528\u4e8e\u5b9e\u9645\u626b\u63cf\u7684\u9875\u9762\uff0c\u53e6\u4e00\u4e2a\u9886\u5148\u4e8e\u524d\u8005\u6267\u884c\u9884\u53d6\u3002node->prefetch_pages \u7cbe\u786e\u8bb0\u5f55\u9884\u53d6\u8fed\u4ee3\u5668\u9886\u5148\u7684\u9875\u6570\u3002node->prefetch_target \u5219\u8bb0\u5f55\u671f\u671b\u7684\u9884\u53d6\u8ddd\u79bb\uff0c\u8be5\u503c\u4ece\u8f83\u5c0f\u503c\u5f00\u59cb\uff0c\u9010\u6e10\u589e\u5927\u5230 node->prefetch_maximum\u3002\u8fd9\u6837\u53ef\u4ee5\u907f\u514d\u56e0 LIMIT \u800c\u53ea\u8bfb\u53d6\u5c11\u91cf\u5143\u7ec4\u5c31\u505c\u6b62\u7684\u626b\u63cf\u6267\u884c\u5927\u91cf\u9884\u53d6\u3002"]}, {"code": "case T_BitmapHeapScan:\n\t\t\tpname = sname = \"Bitmap Heap Scan\";\n\t\t\tbreak;", "title": "\u6838\u5fc3\u6e90\u7801\u4e2d\u7684 EXPLAIN \u6807\u8bc6"}], "strategies": [], "description": ["\u8bbf\u95ee\u4f4d\u56fe\u9009\u4e2d\u7684\u5806\u9875\uff0c\u5e76\u6267\u884c\u5fc5\u8981\u7684\u91cd\u68c0\u3002"], "localization": {"status": "complete", "sources": [{"url": "/docs/15/parallel-plans.html", "method": "same-major semantic node", "sha256": "f854eb236b7b7015acb3d4356b2199700ef6396672fbb271f4325b656c16e6c3", "language": "zh", "matched_nodes": ["#PARALLEL-PLANS/div[3]/div[2]/ul[0]/li[1]"]}], "language": "zh", "original_text": {"/versions/15/description/0": "Visits heap pages selected by a bitmap and performs required rechecks.", "/versions/15/facts/0/label": "Core node tag", "/versions/15/facts/1/label": "Structured EXPLAIN Node Type", "/versions/15/facts/2/label": "Inputs", "/versions/15/facts/2/value": "A tuple-location bitmap and relation", "/versions/15/facts/3/label": "Output", "/versions/15/facts/3/value": "Qualified heap tuples", "/versions/15/facts/4/label": "Executor initializer", "/versions/15/facts/5/label": "Memory mechanism", "/versions/15/tables/0/title": "EXPLAIN labels in this source build", "/versions/15/related/1/label": "Using EXPLAIN", "/versions/15/related/2/label": "Parallel plans", "/versions/15/sections/0/title": "EXPLAIN names and attributes", "/versions/15/sections/1/title": "Memory and temporary storage", "/versions/15/sections/2/title": "Parallel execution and instrumentation", "/versions/15/sections/3/title": "Same-version manual discussion", "/versions/15/sections/4/title": "Examples from this manual build", "/versions/15/sections/5/title": "Executor implementation notes", "/versions/15/sections/6/title": "EXPLAIN identity in core source", "/versions/15/memory/description": "This extraction does not assign a universal memory limit or spill policy to this node. Inspect the same-build implementation and its expressions or provider.", "/versions/15/sections/0/paragraphs/0": "Structured formats use the Node Type above. Text-format spellings can also include operation, strategy, join type, scan direction or aggregation-stage attributes.", "/versions/15/sections/0/paragraphs/1": "Text names recorded by this source: Bitmap Heap Scan.", "/versions/15/sections/0/paragraphs/2": "Parallel-aware and parallel-safe are different plan properties. A node running inside a parallel worker is not necessarily a parallel-aware node.", "/versions/15/sections/1/paragraphs/0": "This extraction does not assign a universal memory limit or spill policy to this node. Inspect the same-build implementation and its expressions or provider.", "/versions/15/sections/1/paragraphs/1": "If we are using lossy info, we have to recheck the qual conditions at every tuple.", "/versions/15/sections/2/paragraphs/0": "The source callbacks below can coordinate execution or collect worker instrumentation. Their presence is not a blanket claim that this node supports a shared parallel scan or shared state.", "/versions/15/sections/2/paragraphs/1": "Callbacks in this build: ExecBitmapHeapEstimate, ExecBitmapHeapInitializeDSM, ExecBitmapHeapInitializeWorker, ExecBitmapHeapReInitializeDSM.", "/versions/15/sections/3/paragraphs/0": "In a parallel bitmap heap scan , one process is chosen as the leader. That process performs a scan of one or more indexes and builds a bitmap indicating which table blocks need to be visited. These blocks are then divided among the cooperating processes as in a parallel sequential scan. In other words, the heap scan is performed in parallel, but the underlying index scan is not.", "/versions/15/sections/5/paragraphs/0": "nodeBitmapHeapscan.c Routines to support bitmapped scans of relations", "/versions/15/sections/5/paragraphs/1": "NOTE: it is critical that this plan type only be used with MVCC-compliant snapshots (ie, regular snapshots, not SnapshotAny or one of the other special snapshots). The reason is that since index and heap scans are decoupled, there can be no assurance that the index tuple prompting a visit to a particular heap TID still exists when the visit is made. Therefore the tuple might not exist anymore either (which is OK because heap_fetch will cope) --- but worse, the tuple slot could have been re-used for a newer tuple. With an MVCC snapshot the newer tuple is certain to fail the time qual and so it will not be mistakenly returned, but with anything else we might return a tuple that doesn't meet the required index qual conditions.", "/versions/15/sections/5/paragraphs/2": "Retrieve next tuple from the BitmapHeapScan node's currentRelation", "/versions/15/sections/5/paragraphs/3": "If we haven't yet performed the underlying index scan, do it, and begin the iteration over the bitmap.", "/versions/15/sections/5/paragraphs/4": "For prefetching, we use *two* iterators, one for the pages we are actually scanning and another that runs ahead of the first for prefetching. node->prefetch_pages tracks exactly how many pages ahead the prefetch iterator is. Also, node->prefetch_target tracks the desired prefetch distance, which starts small and increases up to the node->prefetch_maximum. This is to avoid doing a lot of prefetching in a scan that stops after a few tuples because of a LIMIT.", "/versions/15/tables/0/columns/0/label": "Text-format label", "/versions/15/tables/0/columns/1/label": "Structured node identity", "/versions/15/sections/4/blocks/0/paragraphs/0": "Example copied from the PostgreSQL 15.19 manual; it was not executed for this collection.", "/versions/15/sections/4/blocks/0/paragraphs/1": "Now, let's make the condition more restrictive:", "/versions/15/sections/4/blocks/1/paragraphs/0": "Example copied from the PostgreSQL 15.19 manual; it was not executed for this collection.", "/versions/15/sections/4/blocks/1/paragraphs/1": "Now let's add another condition to the WHERE clause:"}, "fallback_fields": [], "source_language": "en", "original_snapshot_sha256": "cfb19c14d45ecb8e0afb5b7e4bb0273de3c49aa16e2018394cae441b16cee321"}, "evidence_kind": "source and documentation", "explain_names": ["Bitmap Heap Scan"], "partial_modes": [], "comparison_data": {"node_tag": "T_BitmapHeapScan", "strategies": [], "text_names": ["Bitmap Heap Scan"], "initializer": "ExecInitBitmapHeapScan", "partial_modes": [], "memory_mechanism": "unclassified", "parallel_callbacks": ["ExecBitmapHeapEstimate", "ExecBitmapHeapInitializeDSM", "ExecBitmapHeapInitializeWorker", "ExecBitmapHeapReInitializeDSM"]}, "comparison_hash": "bd05a85a745255a1c9cb85ef7f1d7684cac042aad27b3d05ee77a5ce928a6d0b", "explain_prefixes": ["Parallel", "Async"], "runtime_verified": false, "source_inventory": {"explain": "src/backend/commands/explain.c", "executor": "src/backend/executor/execProcnode.c", "implementation": "src/backend/executor/nodeBitmapHeapscan.c"}, "parallel_callbacks": ["ExecBitmapHeapEstimate", "ExecBitmapHeapInitializeDSM", "ExecBitmapHeapInitializeWorker", "ExecBitmapHeapReInitializeDSM"]}, "16": {"facts": [{"label": "\u6838\u5fc3\u8282\u70b9\u6807\u7b7e", "value": "T_BitmapHeapScan"}, {"label": "\u7ed3\u6784\u5316 EXPLAIN \u8282\u70b9\u7c7b\u578b", "value": "Bitmap Heap Scan"}, {"label": "\u8f93\u5165", "value": "\u5143\u7ec4\u4f4d\u7f6e\u4f4d\u56fe\u53ca\u5173\u7cfb"}, {"label": "\u8f93\u51fa", "value": "\u6ee1\u8db3\u6761\u4ef6\u7684\u5806\u5143\u7ec4"}, {"label": "\u6267\u884c\u5668\u521d\u59cb\u5316\u51fd\u6570", "value": "ExecInitBitmapHeapScan"}, {"label": "\u5185\u5b58\u673a\u5236", "value": "unclassified"}], "memory": {"evidence": [{"url": "https://ftp.postgresql.org/pub/source/v16.15/postgresql-16.15.tar.bz2", "path": "src/backend/executor/nodeBitmapHeapscan.c", "label": "src/backend/executor/nodeBitmapHeapscan.c", "sha256": "044d491db89426b16e2d35d28220a730c451590f16ca5fb68b3e38f5ada55eaa", "archive_sha256": "c1575341fa7bd40f5274ea465b34390f4dc64cdd0770af327005caaeb9f6b7ed"}], "mechanism": "unclassified", "description": "\u672c\u6b21\u62bd\u53d6\u4e0d\u4e3a\u6b64\u8282\u70b9\u8bbe\u5b9a\u7edf\u4e00\u7684\u5185\u5b58\u4e0a\u9650\u6216\u843d\u76d8\u7b56\u7565\u3002\u8bf7\u67e5\u770b\u540c\u4e00\u6784\u5efa\u7684\u5b9e\u73b0\u3001\u76f8\u5173\u8868\u8fbe\u5f0f\u6216\u63d0\u4f9b\u65b9\u3002", "source_notes": ["If we are using lossy info, we have to recheck the qual conditions at every tuple."]}, "tables": [{"key": "explain-labels", "rows": [{"label": "Bitmap Heap Scan", "identity": "Bitmap Heap Scan"}], "title": "\u672c\u6784\u5efa\u4e2d\u7684 EXPLAIN \u6807\u7b7e", "columns": [{"key": "label", "label": "\u6587\u672c\u683c\u5f0f\u6807\u7b7e"}, {"key": "identity", "label": "\u7ed3\u6784\u5316\u8282\u70b9\u6807\u8bc6"}]}], "related": [{"url": "/wiki/sql/explain/?v=16", "label": "EXPLAIN"}, {"url": "/docs/16/using-explain.html", "label": "\u4f7f\u7528 EXPLAIN"}, {"url": "/docs/16/parallel-plans.html", "label": "\u5e76\u884c\u8ba1\u5212"}, {"url": "/wiki/guc/enable_bitmapscan/?v=16", "label": "enable_bitmapscan"}], "release": {"ref": "PostgreSQL 16.15 source archive", "label": "16.15", "major": "16", "channel": "stable", "revision": "c1575341fa7bd40f5274ea465b34390f4dc64cdd0770af327005caaeb9f6b7ed", "source_url": "https://ftp.postgresql.org/pub/source/v16.15/postgresql-16.15.tar.bz2", "source_snapshot_utc": ""}, "sources": [{"url": "https://ftp.postgresql.org/pub/source/v16.15/postgresql-16.15.tar.bz2", "line": 1279, "path": "src/backend/commands/explain.c", "label": "src/backend/commands/explain.c:1279", "sha256": "8e017f0116dbea471339b40c37a667cc9f95039e7e0329c783e5e8ce194de7e1", "archive_sha256": "c1575341fa7bd40f5274ea465b34390f4dc64cdd0770af327005caaeb9f6b7ed"}, {"url": "https://ftp.postgresql.org/pub/source/v16.15/postgresql-16.15.tar.bz2", "line": 234, "path": "src/backend/executor/execProcnode.c", "label": "src/backend/executor/execProcnode.c:234", "sha256": "e48c08e555f8cb4e4bb43df516c4b8906ce9bc374b2a745d98a1fc8c22cc5099", "archive_sha256": "c1575341fa7bd40f5274ea465b34390f4dc64cdd0770af327005caaeb9f6b7ed"}, {"url": "https://ftp.postgresql.org/pub/source/v16.15/postgresql-16.15.tar.bz2", "path": "src/backend/executor/nodeBitmapHeapscan.c", "label": "src/backend/executor/nodeBitmapHeapscan.c", "sha256": "044d491db89426b16e2d35d28220a730c451590f16ca5fb68b3e38f5ada55eaa", "archive_sha256": "c1575341fa7bd40f5274ea465b34390f4dc64cdd0770af327005caaeb9f6b7ed"}, {"url": "https://ftp.postgresql.org/pub/source/v16.15/postgresql-16.15.tar.bz2", "path": "src/include/nodes/plannodes.h", "label": "src/include/nodes/plannodes.h", "sha256": "97db47353db76326b874589a5ad0a04501cc74cd72e237e7bd956e7472c41f1f", "archive_sha256": "c1575341fa7bd40f5274ea465b34390f4dc64cdd0770af327005caaeb9f6b7ed"}, {"url": "https://pg.center/docs/16/parallel-plans.html#PARALLEL-SCANS", "path": "parallel-plans.html", "label": "PostgreSQL 16.15 \u00b7 parallel-plans", "sha256": "53d83f63f97381fe1e4c0cfe5ceb81d30c1542b03e35a144684afd8fb3b9686c", "language": "en", "original_url": "/docs/16/parallel-plans.html#PARALLEL-SCANS"}, {"url": "https://pg.center/docs/16/using-explain.html#USING-EXPLAIN-BASICS", "path": "using-explain.html", "label": "PostgreSQL 16.15 \u00b7 using-explain", "sha256": "bd8b86e5281cf0e52ad6e0e4bb8b6ff6510dac61982b44f0c1dd07d54012db3c", "language": "en", "original_url": "/docs/16/using-explain.html#USING-EXPLAIN-BASICS"}], "node_tag": "T_BitmapHeapScan", "sections": [{"title": "EXPLAIN \u540d\u79f0\u4e0e\u5c5e\u6027", "paragraphs": ["\u7ed3\u6784\u5316\u683c\u5f0f\u4f7f\u7528\u4e0a\u8ff0 Node Type\u3002\u6587\u672c\u683c\u5f0f\u540d\u79f0\u8fd8\u53ef\u80fd\u5305\u542b\u64cd\u4f5c\u3001\u7b56\u7565\u3001\u8fde\u63a5\u7c7b\u578b\u3001\u626b\u63cf\u65b9\u5411\u6216\u805a\u5408\u9636\u6bb5\u5c5e\u6027\u3002", "\u6b64\u6e90\u7801\u8bb0\u5f55\u7684\u6587\u672c\u540d\u79f0\uff1aBitmap Heap Scan.", "\u5e76\u884c\u611f\u77e5\u4e0e\u5e76\u884c\u5b89\u5168\u662f\u4e0d\u540c\u7684\u8ba1\u5212\u5c5e\u6027\u3002\u5728\u5e76\u884c\u5de5\u4f5c\u8fdb\u7a0b\u5185\u8fd0\u884c\u7684\u8282\u70b9\u4e0d\u4e00\u5b9a\u662f\u5e76\u884c\u611f\u77e5\u8282\u70b9\u3002"]}, {"title": "\u5185\u5b58\u4e0e\u4e34\u65f6\u5b58\u50a8", "paragraphs": ["\u672c\u6b21\u62bd\u53d6\u4e0d\u4e3a\u6b64\u8282\u70b9\u8bbe\u5b9a\u7edf\u4e00\u7684\u5185\u5b58\u4e0a\u9650\u6216\u843d\u76d8\u7b56\u7565\u3002\u8bf7\u67e5\u770b\u540c\u4e00\u6784\u5efa\u7684\u5b9e\u73b0\u3001\u76f8\u5173\u8868\u8fbe\u5f0f\u6216\u63d0\u4f9b\u65b9\u3002", "\u4f7f\u7528\u6709\u635f\u4fe1\u606f\u65f6\uff0c\u5fc5\u987b\u5bf9\u6bcf\u4e2a\u5143\u7ec4\u91cd\u65b0\u68c0\u67e5\u6761\u4ef6\u3002"]}, {"title": "\u5e76\u884c\u6267\u884c\u4e0e\u8fd0\u884c\u4fe1\u606f\u91c7\u96c6", "paragraphs": ["\u4ee5\u4e0b\u6e90\u7801\u56de\u8c03\u53ef\u4ee5\u534f\u8c03\u6267\u884c\u6216\u6536\u96c6\u5de5\u4f5c\u8fdb\u7a0b\u7684\u6d4b\u91cf\u6570\u636e\u3002\u56de\u8c03\u5b58\u5728\u4e0d\u4ee3\u8868\u8be5\u8282\u70b9\u666e\u904d\u652f\u6301\u5171\u4eab\u5e76\u884c\u626b\u63cf\u6216\u5171\u4eab\u72b6\u6001\u3002", "\u6b64\u6784\u5efa\u7684\u56de\u8c03\uff1aExecBitmapHeapEstimate, ExecBitmapHeapInitializeDSM, ExecBitmapHeapInitializeWorker, ExecBitmapHeapReInitializeDSM."]}, {"title": "\u540c\u7248\u672c\u624b\u518c\u8bf4\u660e", "paragraphs": ["\u5728 \u5e76\u884c\u4f4d\u56fe\u5806\u626b\u63cf \u4e2d\uff0c\u4f1a\u9009\u62e9\u4e00\u4e2a\u8fdb\u7a0b\u4f5c\u4e3a\u9886\u5bfc\u8005\u3002\u8be5\u8fdb\u7a0b\u6267\u884c\u4e00\u4e2a\u6216\u591a\u4e2a\u7d22\u5f15\u626b\u63cf\uff0c\u5e76\u6784\u5efa\u4e00\u4e2a\u4f4d\u56fe\uff0c\u4ee5\u6307\u793a\u9700\u8981\u8bbf\u95ee\u54ea\u4e9b\u8868\u5757\u3002\u7136\u540e\u8fd9\u4e9b\u5757\u4f1a\u50cf\u5e76\u884c\u987a\u5e8f\u626b\u63cf\u90a3\u6837\u5206\u914d\u7ed9\u534f\u4f5c\u8fdb\u7a0b\u3002\u6362\u53e5\u8bdd\u8bf4\uff0c\u5806\u626b\u63cf\u662f\u5e76\u884c\u6267\u884c\u7684\uff0c\u4f46\u5e95\u5c42\u7d22\u5f15\u626b\u63cf\u4e0d\u662f\u3002"]}, {"title": "\u672c\u7248\u624b\u518c\u4e2d\u7684\u793a\u4f8b", "blocks": [{"code": "EXPLAIN SELECT * FROM tenk1 WHERE unique1 < 100;\n\n                                  QUERY PLAN\n------------------------------------------------------------------------------\n Bitmap Heap Scan on tenk1  (cost=5.07..229.20 rows=101 width=244)\n   Recheck Cond: (unique1 < 100)\n   ->  Bitmap Index Scan on tenk1_unique1  (cost=0.00..5.04 rows=101 width=0)\n         Index Cond: (unique1 < 100)", "source": {"url": "/docs/16/using-explain.html#USING-EXPLAIN-BASICS", "path": "using-explain.html", "label": "PostgreSQL 16.15 \u00b7 using-explain", "sha256": "bd8b86e5281cf0e52ad6e0e4bb8b6ff6510dac61982b44f0c1dd07d54012db3c"}, "paragraphs": ["\u793a\u4f8b\u6458\u81ea PostgreSQL 16.15 \u624b\u518c\uff1b\u672c\u767e\u79d1\u672a\u5b9e\u9645\u6267\u884c\u6b64\u793a\u4f8b\u3002", "\u73b0\u5728\u8fdb\u4e00\u6b65\u6536\u7d27\u6761\u4ef6\uff1a"]}, {"code": "EXPLAIN SELECT * FROM tenk1 WHERE unique1 < 100 AND stringu1 = 'xxx';\n\n                                  QUERY PLAN\n------------------------------------------------------------------------------\n Bitmap Heap Scan on tenk1  (cost=5.04..229.43 rows=1 width=244)\n   Recheck Cond: (unique1 < 100)\n   Filter: (stringu1 = 'xxx'::name)\n   ->  Bitmap Index Scan on tenk1_unique1  (cost=0.00..5.04 rows=101 width=0)\n         Index Cond: (unique1 < 100)", "source": {"url": "/docs/16/using-explain.html#USING-EXPLAIN-BASICS", "path": "using-explain.html", "label": "PostgreSQL 16.15 \u00b7 using-explain", "sha256": "bd8b86e5281cf0e52ad6e0e4bb8b6ff6510dac61982b44f0c1dd07d54012db3c"}, "paragraphs": ["\u793a\u4f8b\u6458\u81ea PostgreSQL 16.15 \u624b\u518c\uff1b\u672c\u767e\u79d1\u672a\u5b9e\u9645\u6267\u884c\u6b64\u793a\u4f8b\u3002", "\u73b0\u5728\u5411 WHERE \u5b50\u53e5\u518d\u6dfb\u52a0\u4e00\u4e2a\u6761\u4ef6\uff1a"]}]}, {"title": "\u6267\u884c\u5668\u5b9e\u73b0\u8bf4\u660e", "paragraphs": ["nodeBitmapHeapscan.c\uff1a\u652f\u6301\u5173\u7cfb\u4f4d\u56fe\u626b\u63cf\u7684\u4f8b\u7a0b\u3002", "\u6ce8\u610f\uff1a\u6b64\u8ba1\u5212\u7c7b\u578b\u5fc5\u987b\u4ec5\u4f7f\u7528\u7b26\u5408 MVCC \u7684\u5feb\u7167\uff0c\u5373\u666e\u901a\u5feb\u7167\uff0c\u800c\u975e SnapshotAny \u6216\u5176\u4ed6\u7279\u6b8a\u5feb\u7167\u3002\u7d22\u5f15\u626b\u63cf\u4e0e\u5806\u626b\u63cf\u76f8\u4e92\u5206\u79bb\uff0c\u8bbf\u95ee\u67d0\u4e2a\u5806 TID \u65f6\uff0c\u65e0\u6cd5\u4fdd\u8bc1\u4fc3\u6210\u8be5\u8bbf\u95ee\u7684\u7d22\u5f15\u5143\u7ec4\u4ecd\u7136\u5b58\u5728\u3002\u5806\u5143\u7ec4\u53ef\u80fd\u5df2\u7ecf\u6d88\u5931\uff08heap_fetch \u80fd\u5904\u7406\u8fd9\u79cd\u60c5\u51b5\uff09\uff0c\u66f4\u4e25\u91cd\u7684\u662f\uff0c\u5176\u4f4d\u7f6e\u53ef\u80fd\u5df2\u88ab\u66f4\u65b0\u7684\u5143\u7ec4\u590d\u7528\u3002\u4f7f\u7528 MVCC \u5feb\u7167\u65f6\uff0c\u65b0\u5143\u7ec4\u5fc5\u5b9a\u65e0\u6cd5\u901a\u8fc7\u65f6\u95f4\u53ef\u89c1\u6027\u68c0\u67e5\uff0c\u56e0\u6b64\u4e0d\u4f1a\u9519\u8bef\u8fd4\u56de\uff1b\u4f7f\u7528\u5176\u4ed6\u5feb\u7167\u5219\u53ef\u80fd\u8fd4\u56de\u4e0d\u7b26\u5408\u7d22\u5f15\u6761\u4ef6\u7684\u5143\u7ec4\u3002", "\u4ece BitmapHeapScan \u8282\u70b9\u7684 currentRelation \u4e2d\u8bfb\u53d6\u4e0b\u4e00\u4e2a\u5143\u7ec4\u3002", "\u5982\u679c\u5c1a\u672a\u6267\u884c\u5e95\u5c42\u7d22\u5f15\u626b\u63cf\uff0c\u5219\u5148\u6267\u884c\uff0c\u518d\u5f00\u59cb\u8fed\u4ee3\u4f4d\u56fe\u3002", "\u9884\u53d6\u4f7f\u7528\u4e24\u4e2a\u8fed\u4ee3\u5668\uff1a\u4e00\u4e2a\u7528\u4e8e\u5b9e\u9645\u626b\u63cf\u7684\u9875\u9762\uff0c\u53e6\u4e00\u4e2a\u9886\u5148\u4e8e\u524d\u8005\u6267\u884c\u9884\u53d6\u3002node->prefetch_pages \u7cbe\u786e\u8bb0\u5f55\u9884\u53d6\u8fed\u4ee3\u5668\u9886\u5148\u7684\u9875\u6570\u3002node->prefetch_target \u5219\u8bb0\u5f55\u671f\u671b\u7684\u9884\u53d6\u8ddd\u79bb\uff0c\u8be5\u503c\u4ece\u8f83\u5c0f\u503c\u5f00\u59cb\uff0c\u9010\u6e10\u589e\u5927\u5230 node->prefetch_maximum\u3002\u8fd9\u6837\u53ef\u4ee5\u907f\u514d\u56e0 LIMIT \u800c\u53ea\u8bfb\u53d6\u5c11\u91cf\u5143\u7ec4\u5c31\u505c\u6b62\u7684\u626b\u63cf\u6267\u884c\u5927\u91cf\u9884\u53d6\u3002"]}, {"code": "case T_BitmapHeapScan:\n\t\t\tpname = sname = \"Bitmap Heap Scan\";\n\t\t\tbreak;", "title": "\u6838\u5fc3\u6e90\u7801\u4e2d\u7684 EXPLAIN \u6807\u8bc6"}], "strategies": [], "description": ["\u8bbf\u95ee\u4f4d\u56fe\u9009\u4e2d\u7684\u5806\u9875\uff0c\u5e76\u6267\u884c\u5fc5\u8981\u7684\u91cd\u68c0\u3002"], "localization": {"status": "complete", "sources": [{"url": "/docs/16/parallel-plans.html", "method": "same-major semantic node", "sha256": "ebdab5889ade652e62c92fd2e4361d8aa32ae8132faccfdcafab869292fc4392", "language": "zh", "matched_nodes": ["#PARALLEL-PLANS/div[3]/div[2]/ul[0]/li[1]"]}], "language": "zh", "original_text": {"/versions/16/description/0": "Visits heap pages selected by a bitmap and performs required rechecks.", "/versions/16/facts/0/label": "Core node tag", "/versions/16/facts/1/label": "Structured EXPLAIN Node Type", "/versions/16/facts/2/label": "Inputs", "/versions/16/facts/2/value": "A tuple-location bitmap and relation", "/versions/16/facts/3/label": "Output", "/versions/16/facts/3/value": "Qualified heap tuples", "/versions/16/facts/4/label": "Executor initializer", "/versions/16/facts/5/label": "Memory mechanism", "/versions/16/tables/0/title": "EXPLAIN labels in this source build", "/versions/16/related/1/label": "Using EXPLAIN", "/versions/16/related/2/label": "Parallel plans", "/versions/16/sections/0/title": "EXPLAIN names and attributes", "/versions/16/sections/1/title": "Memory and temporary storage", "/versions/16/sections/2/title": "Parallel execution and instrumentation", "/versions/16/sections/3/title": "Same-version manual discussion", "/versions/16/sections/4/title": "Examples from this manual build", "/versions/16/sections/5/title": "Executor implementation notes", "/versions/16/sections/6/title": "EXPLAIN identity in core source", "/versions/16/memory/description": "This extraction does not assign a universal memory limit or spill policy to this node. Inspect the same-build implementation and its expressions or provider.", "/versions/16/sections/0/paragraphs/0": "Structured formats use the Node Type above. Text-format spellings can also include operation, strategy, join type, scan direction or aggregation-stage attributes.", "/versions/16/sections/0/paragraphs/1": "Text names recorded by this source: Bitmap Heap Scan.", "/versions/16/sections/0/paragraphs/2": "Parallel-aware and parallel-safe are different plan properties. A node running inside a parallel worker is not necessarily a parallel-aware node.", "/versions/16/sections/1/paragraphs/0": "This extraction does not assign a universal memory limit or spill policy to this node. Inspect the same-build implementation and its expressions or provider.", "/versions/16/sections/1/paragraphs/1": "If we are using lossy info, we have to recheck the qual conditions at every tuple.", "/versions/16/sections/2/paragraphs/0": "The source callbacks below can coordinate execution or collect worker instrumentation. Their presence is not a blanket claim that this node supports a shared parallel scan or shared state.", "/versions/16/sections/2/paragraphs/1": "Callbacks in this build: ExecBitmapHeapEstimate, ExecBitmapHeapInitializeDSM, ExecBitmapHeapInitializeWorker, ExecBitmapHeapReInitializeDSM.", "/versions/16/sections/3/paragraphs/0": "In a parallel bitmap heap scan , one process is chosen as the leader. That process performs a scan of one or more indexes and builds a bitmap indicating which table blocks need to be visited. These blocks are then divided among the cooperating processes as in a parallel sequential scan. In other words, the heap scan is performed in parallel, but the underlying index scan is not.", "/versions/16/sections/5/paragraphs/0": "nodeBitmapHeapscan.c Routines to support bitmapped scans of relations", "/versions/16/sections/5/paragraphs/1": "NOTE: it is critical that this plan type only be used with MVCC-compliant snapshots (ie, regular snapshots, not SnapshotAny or one of the other special snapshots). The reason is that since index and heap scans are decoupled, there can be no assurance that the index tuple prompting a visit to a particular heap TID still exists when the visit is made. Therefore the tuple might not exist anymore either (which is OK because heap_fetch will cope) --- but worse, the tuple slot could have been re-used for a newer tuple. With an MVCC snapshot the newer tuple is certain to fail the time qual and so it will not be mistakenly returned, but with anything else we might return a tuple that doesn't meet the required index qual conditions.", "/versions/16/sections/5/paragraphs/2": "Retrieve next tuple from the BitmapHeapScan node's currentRelation", "/versions/16/sections/5/paragraphs/3": "If we haven't yet performed the underlying index scan, do it, and begin the iteration over the bitmap.", "/versions/16/sections/5/paragraphs/4": "For prefetching, we use *two* iterators, one for the pages we are actually scanning and another that runs ahead of the first for prefetching. node->prefetch_pages tracks exactly how many pages ahead the prefetch iterator is. Also, node->prefetch_target tracks the desired prefetch distance, which starts small and increases up to the node->prefetch_maximum. This is to avoid doing a lot of prefetching in a scan that stops after a few tuples because of a LIMIT.", "/versions/16/tables/0/columns/0/label": "Text-format label", "/versions/16/tables/0/columns/1/label": "Structured node identity", "/versions/16/sections/4/blocks/0/paragraphs/0": "Example copied from the PostgreSQL 16.15 manual; it was not executed for this collection.", "/versions/16/sections/4/blocks/0/paragraphs/1": "Now, let's make the condition more restrictive:", "/versions/16/sections/4/blocks/1/paragraphs/0": "Example copied from the PostgreSQL 16.15 manual; it was not executed for this collection.", "/versions/16/sections/4/blocks/1/paragraphs/1": "Now let's add another condition to the WHERE clause:"}, "fallback_fields": [], "source_language": "en", "original_snapshot_sha256": "c179b53ec1f5ac4ec476424ecc199f7fdc3d80efe6981764ec6fc456c9ab53a7"}, "evidence_kind": "source and documentation", "explain_names": ["Bitmap Heap Scan"], "partial_modes": [], "comparison_data": {"node_tag": "T_BitmapHeapScan", "strategies": [], "text_names": ["Bitmap Heap Scan"], "initializer": "ExecInitBitmapHeapScan", "partial_modes": [], "memory_mechanism": "unclassified", "parallel_callbacks": ["ExecBitmapHeapEstimate", "ExecBitmapHeapInitializeDSM", "ExecBitmapHeapInitializeWorker", "ExecBitmapHeapReInitializeDSM"]}, "comparison_hash": "bd05a85a745255a1c9cb85ef7f1d7684cac042aad27b3d05ee77a5ce928a6d0b", "explain_prefixes": ["Parallel", "Async"], "runtime_verified": false, "source_inventory": {"explain": "src/backend/commands/explain.c", "executor": "src/backend/executor/execProcnode.c", "implementation": "src/backend/executor/nodeBitmapHeapscan.c"}, "parallel_callbacks": ["ExecBitmapHeapEstimate", "ExecBitmapHeapInitializeDSM", "ExecBitmapHeapInitializeWorker", "ExecBitmapHeapReInitializeDSM"]}, "17": {"facts": [{"label": "\u6838\u5fc3\u8282\u70b9\u6807\u7b7e", "value": "T_BitmapHeapScan"}, {"label": "\u7ed3\u6784\u5316 EXPLAIN \u8282\u70b9\u7c7b\u578b", "value": "Bitmap Heap Scan"}, {"label": "\u8f93\u5165", "value": "\u5143\u7ec4\u4f4d\u7f6e\u4f4d\u56fe\u53ca\u5173\u7cfb"}, {"label": "\u8f93\u51fa", "value": "\u6ee1\u8db3\u6761\u4ef6\u7684\u5806\u5143\u7ec4"}, {"label": "\u6267\u884c\u5668\u521d\u59cb\u5316\u51fd\u6570", "value": "ExecInitBitmapHeapScan"}, {"label": "\u5185\u5b58\u673a\u5236", "value": "unclassified"}], "memory": {"evidence": [{"url": "https://ftp.postgresql.org/pub/source/v17.11/postgresql-17.11.tar.bz2", "path": "src/backend/executor/nodeBitmapHeapscan.c", "label": "src/backend/executor/nodeBitmapHeapscan.c", "sha256": "03e98097ab09a746f223674e3892db03830235a9474d8bc82e4a46afdd05a5a4", "archive_sha256": "dd27f2b3c59e73ed14aa3324901242bf69a032a6347805f274e6260322d42979"}], "mechanism": "unclassified", "description": "\u672c\u6b21\u62bd\u53d6\u4e0d\u4e3a\u6b64\u8282\u70b9\u8bbe\u5b9a\u7edf\u4e00\u7684\u5185\u5b58\u4e0a\u9650\u6216\u843d\u76d8\u7b56\u7565\u3002\u8bf7\u67e5\u770b\u540c\u4e00\u6784\u5efa\u7684\u5b9e\u73b0\u3001\u76f8\u5173\u8868\u8fbe\u5f0f\u6216\u63d0\u4f9b\u65b9\u3002", "source_notes": ["If we are using lossy info, we have to recheck the qual conditions at every tuple."]}, "tables": [{"key": "explain-labels", "rows": [{"label": "Bitmap Heap Scan", "identity": "Bitmap Heap Scan"}], "title": "\u672c\u6784\u5efa\u4e2d\u7684 EXPLAIN \u6807\u7b7e", "columns": [{"key": "label", "label": "\u6587\u672c\u683c\u5f0f\u6807\u7b7e"}, {"key": "identity", "label": "\u7ed3\u6784\u5316\u8282\u70b9\u6807\u8bc6"}]}], "related": [{"url": "/wiki/sql/explain/?v=17", "label": "EXPLAIN"}, {"url": "/docs/17/using-explain.html", "label": "\u4f7f\u7528 EXPLAIN"}, {"url": "/docs/17/parallel-plans.html", "label": "\u5e76\u884c\u8ba1\u5212"}, {"url": "/wiki/guc/enable_bitmapscan/?v=17", "label": "enable_bitmapscan"}], "release": {"ref": "PostgreSQL 17.11 source archive", "label": "17.11", "major": "17", "channel": "stable", "revision": "dd27f2b3c59e73ed14aa3324901242bf69a032a6347805f274e6260322d42979", "source_url": "https://ftp.postgresql.org/pub/source/v17.11/postgresql-17.11.tar.bz2", "source_snapshot_utc": ""}, "sources": [{"url": "https://ftp.postgresql.org/pub/source/v17.11/postgresql-17.11.tar.bz2", "line": 1468, "path": "src/backend/commands/explain.c", "label": "src/backend/commands/explain.c:1468", "sha256": "741251b1a3b6d269a52a673d42eb63b02e13a5872db7b359b137086ab21b63c8", "archive_sha256": "dd27f2b3c59e73ed14aa3324901242bf69a032a6347805f274e6260322d42979"}, {"url": "https://ftp.postgresql.org/pub/source/v17.11/postgresql-17.11.tar.bz2", "line": 234, "path": "src/backend/executor/execProcnode.c", "label": "src/backend/executor/execProcnode.c:234", "sha256": "a77576e158b94cb01fa8c5174ba133004eabdd727660323f8afc66c8d2e757b8", "archive_sha256": "dd27f2b3c59e73ed14aa3324901242bf69a032a6347805f274e6260322d42979"}, {"url": "https://ftp.postgresql.org/pub/source/v17.11/postgresql-17.11.tar.bz2", "path": "src/backend/executor/nodeBitmapHeapscan.c", "label": "src/backend/executor/nodeBitmapHeapscan.c", "sha256": "03e98097ab09a746f223674e3892db03830235a9474d8bc82e4a46afdd05a5a4", "archive_sha256": "dd27f2b3c59e73ed14aa3324901242bf69a032a6347805f274e6260322d42979"}, {"url": "https://ftp.postgresql.org/pub/source/v17.11/postgresql-17.11.tar.bz2", "path": "src/include/nodes/plannodes.h", "label": "src/include/nodes/plannodes.h", "sha256": "d390dd69e2d3f5085beb42b33e46ff0676a2959b916a12b82118a7e545f8e562", "archive_sha256": "dd27f2b3c59e73ed14aa3324901242bf69a032a6347805f274e6260322d42979"}, {"url": "https://pg.center/docs/17/parallel-plans.html#PARALLEL-SCANS", "path": "parallel-plans.html", "label": "PostgreSQL 17.11 \u00b7 parallel-plans", "sha256": "784fe3d3b7ae7d1a34e466aa551bde484a40a3b60dc5d2ada6e1675f40713bbc", "language": "en", "original_url": "/docs/17/parallel-plans.html#PARALLEL-SCANS"}, {"url": "https://pg.center/docs/17/using-explain.html#USING-EXPLAIN-BASICS", "path": "using-explain.html", "label": "PostgreSQL 17.11 \u00b7 using-explain", "sha256": "8e3422c77496cc53bfc225ccadda3e82eb23c8c362b8eb95e7fb02cdb315ea78", "language": "en", "original_url": "/docs/17/using-explain.html#USING-EXPLAIN-BASICS"}], "node_tag": "T_BitmapHeapScan", "sections": [{"title": "EXPLAIN \u540d\u79f0\u4e0e\u5c5e\u6027", "paragraphs": ["\u7ed3\u6784\u5316\u683c\u5f0f\u4f7f\u7528\u4e0a\u8ff0 Node Type\u3002\u6587\u672c\u683c\u5f0f\u540d\u79f0\u8fd8\u53ef\u80fd\u5305\u542b\u64cd\u4f5c\u3001\u7b56\u7565\u3001\u8fde\u63a5\u7c7b\u578b\u3001\u626b\u63cf\u65b9\u5411\u6216\u805a\u5408\u9636\u6bb5\u5c5e\u6027\u3002", "\u6b64\u6e90\u7801\u8bb0\u5f55\u7684\u6587\u672c\u540d\u79f0\uff1aBitmap Heap Scan.", "\u5e76\u884c\u611f\u77e5\u4e0e\u5e76\u884c\u5b89\u5168\u662f\u4e0d\u540c\u7684\u8ba1\u5212\u5c5e\u6027\u3002\u5728\u5e76\u884c\u5de5\u4f5c\u8fdb\u7a0b\u5185\u8fd0\u884c\u7684\u8282\u70b9\u4e0d\u4e00\u5b9a\u662f\u5e76\u884c\u611f\u77e5\u8282\u70b9\u3002"]}, {"title": "\u5185\u5b58\u4e0e\u4e34\u65f6\u5b58\u50a8", "paragraphs": ["\u672c\u6b21\u62bd\u53d6\u4e0d\u4e3a\u6b64\u8282\u70b9\u8bbe\u5b9a\u7edf\u4e00\u7684\u5185\u5b58\u4e0a\u9650\u6216\u843d\u76d8\u7b56\u7565\u3002\u8bf7\u67e5\u770b\u540c\u4e00\u6784\u5efa\u7684\u5b9e\u73b0\u3001\u76f8\u5173\u8868\u8fbe\u5f0f\u6216\u63d0\u4f9b\u65b9\u3002", "\u4f7f\u7528\u6709\u635f\u4fe1\u606f\u65f6\uff0c\u5fc5\u987b\u5bf9\u6bcf\u4e2a\u5143\u7ec4\u91cd\u65b0\u68c0\u67e5\u6761\u4ef6\u3002"]}, {"title": "\u5e76\u884c\u6267\u884c\u4e0e\u8fd0\u884c\u4fe1\u606f\u91c7\u96c6", "paragraphs": ["\u4ee5\u4e0b\u6e90\u7801\u56de\u8c03\u53ef\u4ee5\u534f\u8c03\u6267\u884c\u6216\u6536\u96c6\u5de5\u4f5c\u8fdb\u7a0b\u7684\u6d4b\u91cf\u6570\u636e\u3002\u56de\u8c03\u5b58\u5728\u4e0d\u4ee3\u8868\u8be5\u8282\u70b9\u666e\u904d\u652f\u6301\u5171\u4eab\u5e76\u884c\u626b\u63cf\u6216\u5171\u4eab\u72b6\u6001\u3002", "\u6b64\u6784\u5efa\u7684\u56de\u8c03\uff1aExecBitmapHeapEstimate, ExecBitmapHeapInitializeDSM, ExecBitmapHeapInitializeWorker, ExecBitmapHeapReInitializeDSM."]}, {"title": "\u540c\u7248\u672c\u624b\u518c\u8bf4\u660e", "paragraphs": ["\u5728 \u5e76\u884c\u4f4d\u56fe\u5806\u626b\u63cf \u4e2d\uff0c\u4f1a\u9009\u62e9\u4e00\u4e2a\u8fdb\u7a0b\u4f5c\u4e3a\u9886\u5bfc\u8005\u3002\u8be5\u8fdb\u7a0b\u6267\u884c\u4e00\u4e2a\u6216\u591a\u4e2a\u7d22\u5f15\u626b\u63cf\uff0c\u5e76\u6784\u5efa\u4e00\u4e2a\u4f4d\u56fe\uff0c\u4ee5\u6307\u793a\u9700\u8981\u8bbf\u95ee\u54ea\u4e9b\u8868\u5757\u3002\u7136\u540e\u8fd9\u4e9b\u5757\u4f1a\u50cf\u5e76\u884c\u987a\u5e8f\u626b\u63cf\u90a3\u6837\u5206\u914d\u7ed9\u534f\u4f5c\u8fdb\u7a0b\u3002\u6362\u53e5\u8bdd\u8bf4\uff0c\u5806\u626b\u63cf\u662f\u5e76\u884c\u6267\u884c\u7684\uff0c\u4f46\u5e95\u5c42\u7d22\u5f15\u626b\u63cf\u4e0d\u662f\u3002"]}, {"title": "\u672c\u7248\u624b\u518c\u4e2d\u7684\u793a\u4f8b", "blocks": [{"code": "EXPLAIN SELECT * FROM tenk1 WHERE unique1 < 100;\n\n                                  QUERY PLAN\n------------------------------------------------------------------------------\n Bitmap Heap Scan on tenk1  (cost=5.06..224.98 rows=100 width=244)\n   Recheck Cond: (unique1 < 100)\n   ->  Bitmap Index Scan on tenk1_unique1  (cost=0.00..5.04 rows=100 width=0)\n         Index Cond: (unique1 < 100)", "source": {"url": "/docs/17/using-explain.html#USING-EXPLAIN-BASICS", "path": "using-explain.html", "label": "PostgreSQL 17.11 \u00b7 using-explain", "sha256": "8e3422c77496cc53bfc225ccadda3e82eb23c8c362b8eb95e7fb02cdb315ea78"}, "paragraphs": ["\u793a\u4f8b\u6458\u81ea PostgreSQL 17.11 \u624b\u518c\uff1b\u672c\u767e\u79d1\u672a\u5b9e\u9645\u6267\u884c\u6b64\u793a\u4f8b\u3002", "\u73b0\u5728\u8fdb\u4e00\u6b65\u6536\u7d27\u6761\u4ef6\uff1a"]}, {"code": "EXPLAIN SELECT * FROM tenk1 WHERE unique1 < 100 AND stringu1 = 'xxx';\n\n                                  QUERY PLAN\n------------------------------------------------------------------------------\n Bitmap Heap Scan on tenk1  (cost=5.04..225.20 rows=1 width=244)\n   Recheck Cond: (unique1 < 100)\n   Filter: (stringu1 = 'xxx'::name)\n   ->  Bitmap Index Scan on tenk1_unique1  (cost=0.00..5.04 rows=100 width=0)\n         Index Cond: (unique1 < 100)", "source": {"url": "/docs/17/using-explain.html#USING-EXPLAIN-BASICS", "path": "using-explain.html", "label": "PostgreSQL 17.11 \u00b7 using-explain", "sha256": "8e3422c77496cc53bfc225ccadda3e82eb23c8c362b8eb95e7fb02cdb315ea78"}, "paragraphs": ["\u793a\u4f8b\u6458\u81ea PostgreSQL 17.11 \u624b\u518c\uff1b\u672c\u767e\u79d1\u672a\u5b9e\u9645\u6267\u884c\u6b64\u793a\u4f8b\u3002", "\u73b0\u5728\u5411 WHERE \u5b50\u53e5\u518d\u6dfb\u52a0\u4e00\u4e2a\u6761\u4ef6\uff1a"]}]}, {"title": "\u6267\u884c\u5668\u5b9e\u73b0\u8bf4\u660e", "paragraphs": ["nodeBitmapHeapscan.c\uff1a\u652f\u6301\u5173\u7cfb\u4f4d\u56fe\u626b\u63cf\u7684\u4f8b\u7a0b\u3002", "\u6ce8\u610f\uff1a\u6b64\u8ba1\u5212\u7c7b\u578b\u5fc5\u987b\u4ec5\u4f7f\u7528\u7b26\u5408 MVCC \u7684\u5feb\u7167\uff0c\u5373\u666e\u901a\u5feb\u7167\uff0c\u800c\u975e SnapshotAny \u6216\u5176\u4ed6\u7279\u6b8a\u5feb\u7167\u3002\u7d22\u5f15\u626b\u63cf\u4e0e\u5806\u626b\u63cf\u76f8\u4e92\u5206\u79bb\uff0c\u8bbf\u95ee\u67d0\u4e2a\u5806 TID \u65f6\uff0c\u65e0\u6cd5\u4fdd\u8bc1\u4fc3\u6210\u8be5\u8bbf\u95ee\u7684\u7d22\u5f15\u5143\u7ec4\u4ecd\u7136\u5b58\u5728\u3002\u5806\u5143\u7ec4\u53ef\u80fd\u5df2\u7ecf\u6d88\u5931\uff08heap_fetch \u80fd\u5904\u7406\u8fd9\u79cd\u60c5\u51b5\uff09\uff0c\u66f4\u4e25\u91cd\u7684\u662f\uff0c\u5176\u4f4d\u7f6e\u53ef\u80fd\u5df2\u88ab\u66f4\u65b0\u7684\u5143\u7ec4\u590d\u7528\u3002\u4f7f\u7528 MVCC \u5feb\u7167\u65f6\uff0c\u65b0\u5143\u7ec4\u5fc5\u5b9a\u65e0\u6cd5\u901a\u8fc7\u65f6\u95f4\u53ef\u89c1\u6027\u68c0\u67e5\uff0c\u56e0\u6b64\u4e0d\u4f1a\u9519\u8bef\u8fd4\u56de\uff1b\u4f7f\u7528\u5176\u4ed6\u5feb\u7167\u5219\u53ef\u80fd\u8fd4\u56de\u4e0d\u7b26\u5408\u7d22\u5f15\u6761\u4ef6\u7684\u5143\u7ec4\u3002", "\u4ece BitmapHeapScan \u8282\u70b9\u7684 currentRelation \u4e2d\u8bfb\u53d6\u4e0b\u4e00\u4e2a\u5143\u7ec4\u3002", "\u5982\u679c\u5c1a\u672a\u6267\u884c\u5e95\u5c42\u7d22\u5f15\u626b\u63cf\uff0c\u5219\u5148\u6267\u884c\uff0c\u518d\u5f00\u59cb\u8fed\u4ee3\u4f4d\u56fe\u3002", "\u9884\u53d6\u4f7f\u7528\u4e24\u4e2a\u8fed\u4ee3\u5668\uff1a\u4e00\u4e2a\u7528\u4e8e\u5b9e\u9645\u626b\u63cf\u7684\u9875\u9762\uff0c\u53e6\u4e00\u4e2a\u9886\u5148\u4e8e\u524d\u8005\u6267\u884c\u9884\u53d6\u3002node->prefetch_pages \u7cbe\u786e\u8bb0\u5f55\u9884\u53d6\u8fed\u4ee3\u5668\u9886\u5148\u7684\u9875\u6570\u3002node->prefetch_target \u5219\u8bb0\u5f55\u671f\u671b\u7684\u9884\u53d6\u8ddd\u79bb\uff0c\u8be5\u503c\u4ece\u8f83\u5c0f\u503c\u5f00\u59cb\uff0c\u9010\u6e10\u589e\u5927\u5230 node->prefetch_maximum\u3002\u8fd9\u6837\u53ef\u4ee5\u907f\u514d\u56e0 LIMIT \u800c\u53ea\u8bfb\u53d6\u5c11\u91cf\u5143\u7ec4\u5c31\u505c\u6b62\u7684\u626b\u63cf\u6267\u884c\u5927\u91cf\u9884\u53d6\u3002"]}, {"code": "case T_BitmapHeapScan:\n\t\t\tpname = sname = \"Bitmap Heap Scan\";\n\t\t\tbreak;", "title": "\u6838\u5fc3\u6e90\u7801\u4e2d\u7684 EXPLAIN \u6807\u8bc6"}], "strategies": [], "description": ["\u8bbf\u95ee\u4f4d\u56fe\u9009\u4e2d\u7684\u5806\u9875\uff0c\u5e76\u6267\u884c\u5fc5\u8981\u7684\u91cd\u68c0\u3002"], "localization": {"status": "complete", "sources": [{"url": "/docs/17/parallel-plans.html", "method": "same-major semantic node", "sha256": "bc44e48acadcea02ac72779d59456e07d8600160357ceacdc258da2cbc891e23", "language": "zh", "matched_nodes": ["#PARALLEL-PLANS/div[3]/div[2]/ul[0]/li[1]"]}], "language": "zh", "original_text": {"/versions/17/description/0": "Visits heap pages selected by a bitmap and performs required rechecks.", "/versions/17/facts/0/label": "Core node tag", "/versions/17/facts/1/label": "Structured EXPLAIN Node Type", "/versions/17/facts/2/label": "Inputs", "/versions/17/facts/2/value": "A tuple-location bitmap and relation", "/versions/17/facts/3/label": "Output", "/versions/17/facts/3/value": "Qualified heap tuples", "/versions/17/facts/4/label": "Executor initializer", "/versions/17/facts/5/label": "Memory mechanism", "/versions/17/tables/0/title": "EXPLAIN labels in this source build", "/versions/17/related/1/label": "Using EXPLAIN", "/versions/17/related/2/label": "Parallel plans", "/versions/17/sections/0/title": "EXPLAIN names and attributes", "/versions/17/sections/1/title": "Memory and temporary storage", "/versions/17/sections/2/title": "Parallel execution and instrumentation", "/versions/17/sections/3/title": "Same-version manual discussion", "/versions/17/sections/4/title": "Examples from this manual build", "/versions/17/sections/5/title": "Executor implementation notes", "/versions/17/sections/6/title": "EXPLAIN identity in core source", "/versions/17/memory/description": "This extraction does not assign a universal memory limit or spill policy to this node. Inspect the same-build implementation and its expressions or provider.", "/versions/17/sections/0/paragraphs/0": "Structured formats use the Node Type above. Text-format spellings can also include operation, strategy, join type, scan direction or aggregation-stage attributes.", "/versions/17/sections/0/paragraphs/1": "Text names recorded by this source: Bitmap Heap Scan.", "/versions/17/sections/0/paragraphs/2": "Parallel-aware and parallel-safe are different plan properties. A node running inside a parallel worker is not necessarily a parallel-aware node.", "/versions/17/sections/1/paragraphs/0": "This extraction does not assign a universal memory limit or spill policy to this node. Inspect the same-build implementation and its expressions or provider.", "/versions/17/sections/1/paragraphs/1": "If we are using lossy info, we have to recheck the qual conditions at every tuple.", "/versions/17/sections/2/paragraphs/0": "The source callbacks below can coordinate execution or collect worker instrumentation. Their presence is not a blanket claim that this node supports a shared parallel scan or shared state.", "/versions/17/sections/2/paragraphs/1": "Callbacks in this build: ExecBitmapHeapEstimate, ExecBitmapHeapInitializeDSM, ExecBitmapHeapInitializeWorker, ExecBitmapHeapReInitializeDSM.", "/versions/17/sections/3/paragraphs/0": "In a parallel bitmap heap scan , one process is chosen as the leader. That process performs a scan of one or more indexes and builds a bitmap indicating which table blocks need to be visited. These blocks are then divided among the cooperating processes as in a parallel sequential scan. In other words, the heap scan is performed in parallel, but the underlying index scan is not.", "/versions/17/sections/5/paragraphs/0": "nodeBitmapHeapscan.c Routines to support bitmapped scans of relations", "/versions/17/sections/5/paragraphs/1": "NOTE: it is critical that this plan type only be used with MVCC-compliant snapshots (ie, regular snapshots, not SnapshotAny or one of the other special snapshots). The reason is that since index and heap scans are decoupled, there can be no assurance that the index tuple prompting a visit to a particular heap TID still exists when the visit is made. Therefore the tuple might not exist anymore either (which is OK because heap_fetch will cope) --- but worse, the tuple slot could have been re-used for a newer tuple. With an MVCC snapshot the newer tuple is certain to fail the time qual and so it will not be mistakenly returned, but with anything else we might return a tuple that doesn't meet the required index qual conditions.", "/versions/17/sections/5/paragraphs/2": "Retrieve next tuple from the BitmapHeapScan node's currentRelation", "/versions/17/sections/5/paragraphs/3": "If we haven't yet performed the underlying index scan, do it, and begin the iteration over the bitmap.", "/versions/17/sections/5/paragraphs/4": "For prefetching, we use *two* iterators, one for the pages we are actually scanning and another that runs ahead of the first for prefetching. node->prefetch_pages tracks exactly how many pages ahead the prefetch iterator is. Also, node->prefetch_target tracks the desired prefetch distance, which starts small and increases up to the node->prefetch_maximum. This is to avoid doing a lot of prefetching in a scan that stops after a few tuples because of a LIMIT.", "/versions/17/tables/0/columns/0/label": "Text-format label", "/versions/17/tables/0/columns/1/label": "Structured node identity", "/versions/17/sections/4/blocks/0/paragraphs/0": "Example copied from the PostgreSQL 17.11 manual; it was not executed for this collection.", "/versions/17/sections/4/blocks/0/paragraphs/1": "Now, let's make the condition more restrictive:", "/versions/17/sections/4/blocks/1/paragraphs/0": "Example copied from the PostgreSQL 17.11 manual; it was not executed for this collection.", "/versions/17/sections/4/blocks/1/paragraphs/1": "Now let's add another condition to the WHERE clause:"}, "fallback_fields": [], "source_language": "en", "original_snapshot_sha256": "e3b13878b5456858c9c19009b2f5b82e96491a55e44e612aeff6b7b1cd482c72"}, "evidence_kind": "source and documentation", "explain_names": ["Bitmap Heap Scan"], "partial_modes": [], "comparison_data": {"node_tag": "T_BitmapHeapScan", "strategies": [], "text_names": ["Bitmap Heap Scan"], "initializer": "ExecInitBitmapHeapScan", "partial_modes": [], "memory_mechanism": "unclassified", "parallel_callbacks": ["ExecBitmapHeapEstimate", "ExecBitmapHeapInitializeDSM", "ExecBitmapHeapInitializeWorker", "ExecBitmapHeapReInitializeDSM"]}, "comparison_hash": "bd05a85a745255a1c9cb85ef7f1d7684cac042aad27b3d05ee77a5ce928a6d0b", "explain_prefixes": ["Parallel", "Async"], "runtime_verified": false, "source_inventory": {"explain": "src/backend/commands/explain.c", "executor": "src/backend/executor/execProcnode.c", "implementation": "src/backend/executor/nodeBitmapHeapscan.c"}, "parallel_callbacks": ["ExecBitmapHeapEstimate", "ExecBitmapHeapInitializeDSM", "ExecBitmapHeapInitializeWorker", "ExecBitmapHeapReInitializeDSM"]}, "18": {"facts": [{"label": "\u6838\u5fc3\u8282\u70b9\u6807\u7b7e", "value": "T_BitmapHeapScan"}, {"label": "\u7ed3\u6784\u5316 EXPLAIN \u8282\u70b9\u7c7b\u578b", "value": "Bitmap Heap Scan"}, {"label": "\u8f93\u5165", "value": "\u5143\u7ec4\u4f4d\u7f6e\u4f4d\u56fe\u53ca\u5173\u7cfb"}, {"label": "\u8f93\u51fa", "value": "\u6ee1\u8db3\u6761\u4ef6\u7684\u5806\u5143\u7ec4"}, {"label": "\u6267\u884c\u5668\u521d\u59cb\u5316\u51fd\u6570", "value": "ExecInitBitmapHeapScan"}, {"label": "\u5185\u5b58\u673a\u5236", "value": "unclassified"}], "memory": {"evidence": [{"url": "https://ftp.postgresql.org/pub/source/v18.6/postgresql-18.6.tar.bz2", "path": "src/backend/executor/nodeBitmapHeapscan.c", "label": "src/backend/executor/nodeBitmapHeapscan.c", "sha256": "0c49bbf89f6614af08dbcea2a1776abc79db23e523e8c1fc852a42215f202206", "archive_sha256": "555610c24d53e4316da5b7d3fc25c279d96856d5e0e23ee308c328c5fa881d9f"}], "mechanism": "unclassified", "description": "\u672c\u6b21\u62bd\u53d6\u4e0d\u4e3a\u6b64\u8282\u70b9\u8bbe\u5b9a\u7edf\u4e00\u7684\u5185\u5b58\u4e0a\u9650\u6216\u843d\u76d8\u7b56\u7565\u3002\u8bf7\u67e5\u770b\u540c\u4e00\u6784\u5efa\u7684\u5b9e\u73b0\u3001\u76f8\u5173\u8868\u8fbe\u5f0f\u6216\u63d0\u4f9b\u65b9\u3002", "source_notes": ["If we are using lossy info, we have to recheck the qual conditions at every tuple."]}, "tables": [{"key": "explain-labels", "rows": [{"label": "Bitmap Heap Scan", "identity": "Bitmap Heap Scan"}], "title": "\u672c\u6784\u5efa\u4e2d\u7684 EXPLAIN \u6807\u7b7e", "columns": [{"key": "label", "label": "\u6587\u672c\u683c\u5f0f\u6807\u7b7e"}, {"key": "identity", "label": "\u7ed3\u6784\u5316\u8282\u70b9\u6807\u8bc6"}]}], "related": [{"url": "/wiki/sql/explain/?v=18", "label": "EXPLAIN"}, {"url": "/docs/18/using-explain.html", "label": "\u4f7f\u7528 EXPLAIN"}, {"url": "/docs/18/parallel-plans.html", "label": "\u5e76\u884c\u8ba1\u5212"}, {"url": "/wiki/guc/enable_bitmapscan/?v=18", "label": "enable_bitmapscan"}], "release": {"ref": "PostgreSQL 18.6 source archive", "label": "18.6", "major": "18", "channel": "stable", "revision": "555610c24d53e4316da5b7d3fc25c279d96856d5e0e23ee308c328c5fa881d9f", "source_url": "https://ftp.postgresql.org/pub/source/v18.6/postgresql-18.6.tar.bz2", "source_snapshot_utc": ""}, "sources": [{"url": "https://ftp.postgresql.org/pub/source/v18.6/postgresql-18.6.tar.bz2", "line": 1453, "path": "src/backend/commands/explain.c", "label": "src/backend/commands/explain.c:1453", "sha256": "34c86d6070224a0e981efef51f79101d6d505e5874f1684ace183034bab14bb4", "archive_sha256": "555610c24d53e4316da5b7d3fc25c279d96856d5e0e23ee308c328c5fa881d9f"}, {"url": "https://ftp.postgresql.org/pub/source/v18.6/postgresql-18.6.tar.bz2", "line": 234, "path": "src/backend/executor/execProcnode.c", "label": "src/backend/executor/execProcnode.c:234", "sha256": "f8a06a3f539077249b20664b2812433db6d7bd12b2c0ca633525db43d06f112a", "archive_sha256": "555610c24d53e4316da5b7d3fc25c279d96856d5e0e23ee308c328c5fa881d9f"}, {"url": "https://ftp.postgresql.org/pub/source/v18.6/postgresql-18.6.tar.bz2", "path": "src/backend/executor/nodeBitmapHeapscan.c", "label": "src/backend/executor/nodeBitmapHeapscan.c", "sha256": "0c49bbf89f6614af08dbcea2a1776abc79db23e523e8c1fc852a42215f202206", "archive_sha256": "555610c24d53e4316da5b7d3fc25c279d96856d5e0e23ee308c328c5fa881d9f"}, {"url": "https://ftp.postgresql.org/pub/source/v18.6/postgresql-18.6.tar.bz2", "path": "src/include/nodes/plannodes.h", "label": "src/include/nodes/plannodes.h", "sha256": "52422b327a8049fbbb20d8b96008a0fc0a6fafa60f7eff3c695d5b2e83830120", "archive_sha256": "555610c24d53e4316da5b7d3fc25c279d96856d5e0e23ee308c328c5fa881d9f"}, {"url": "https://pg.center/docs/18/parallel-plans.html#PARALLEL-SCANS", "path": "parallel-plans.html", "label": "PostgreSQL 18.6 \u00b7 parallel-plans", "sha256": "62207d207bead82b01b59dc119c4f95856f08655cc11d4699a05a40867ed2070", "language": "en", "original_url": "/docs/18/parallel-plans.html#PARALLEL-SCANS"}, {"url": "https://pg.center/docs/18/using-explain.html#USING-EXPLAIN-BASICS", "path": "using-explain.html", "label": "PostgreSQL 18.6 \u00b7 using-explain", "sha256": "60040c30180093418a0affe56dd27dff9df2504b705b38039589e458bf5c31ed", "language": "en", "original_url": "/docs/18/using-explain.html#USING-EXPLAIN-BASICS"}], "node_tag": "T_BitmapHeapScan", "sections": [{"title": "EXPLAIN \u540d\u79f0\u4e0e\u5c5e\u6027", "paragraphs": ["\u7ed3\u6784\u5316\u683c\u5f0f\u4f7f\u7528\u4e0a\u8ff0 Node Type\u3002\u6587\u672c\u683c\u5f0f\u540d\u79f0\u8fd8\u53ef\u80fd\u5305\u542b\u64cd\u4f5c\u3001\u7b56\u7565\u3001\u8fde\u63a5\u7c7b\u578b\u3001\u626b\u63cf\u65b9\u5411\u6216\u805a\u5408\u9636\u6bb5\u5c5e\u6027\u3002", "\u6b64\u6e90\u7801\u8bb0\u5f55\u7684\u6587\u672c\u540d\u79f0\uff1aBitmap Heap Scan.", "\u5e76\u884c\u611f\u77e5\u4e0e\u5e76\u884c\u5b89\u5168\u662f\u4e0d\u540c\u7684\u8ba1\u5212\u5c5e\u6027\u3002\u5728\u5e76\u884c\u5de5\u4f5c\u8fdb\u7a0b\u5185\u8fd0\u884c\u7684\u8282\u70b9\u4e0d\u4e00\u5b9a\u662f\u5e76\u884c\u611f\u77e5\u8282\u70b9\u3002"]}, {"title": "\u5185\u5b58\u4e0e\u4e34\u65f6\u5b58\u50a8", "paragraphs": ["\u672c\u6b21\u62bd\u53d6\u4e0d\u4e3a\u6b64\u8282\u70b9\u8bbe\u5b9a\u7edf\u4e00\u7684\u5185\u5b58\u4e0a\u9650\u6216\u843d\u76d8\u7b56\u7565\u3002\u8bf7\u67e5\u770b\u540c\u4e00\u6784\u5efa\u7684\u5b9e\u73b0\u3001\u76f8\u5173\u8868\u8fbe\u5f0f\u6216\u63d0\u4f9b\u65b9\u3002", "\u4f7f\u7528\u6709\u635f\u4fe1\u606f\u65f6\uff0c\u5fc5\u987b\u5bf9\u6bcf\u4e2a\u5143\u7ec4\u91cd\u65b0\u68c0\u67e5\u6761\u4ef6\u3002"]}, {"title": "\u5e76\u884c\u6267\u884c\u4e0e\u8fd0\u884c\u4fe1\u606f\u91c7\u96c6", "paragraphs": ["\u4ee5\u4e0b\u6e90\u7801\u56de\u8c03\u53ef\u4ee5\u534f\u8c03\u6267\u884c\u6216\u6536\u96c6\u5de5\u4f5c\u8fdb\u7a0b\u7684\u6d4b\u91cf\u6570\u636e\u3002\u56de\u8c03\u5b58\u5728\u4e0d\u4ee3\u8868\u8be5\u8282\u70b9\u666e\u904d\u652f\u6301\u5171\u4eab\u5e76\u884c\u626b\u63cf\u6216\u5171\u4eab\u72b6\u6001\u3002", "\u6b64\u6784\u5efa\u7684\u56de\u8c03\uff1aExecBitmapHeapEstimate, ExecBitmapHeapInitializeDSM, ExecBitmapHeapInitializeWorker, ExecBitmapHeapReInitializeDSM, ExecBitmapHeapRetrieveInstrumentation."]}, {"title": "\u540c\u7248\u672c\u624b\u518c\u8bf4\u660e", "paragraphs": ["\u5728 \u5e76\u884c\u4f4d\u56fe\u5806\u626b\u63cf \u4e2d\uff0c\u4f1a\u9009\u62e9\u4e00\u4e2a\u8fdb\u7a0b\u4f5c\u4e3a\u9886\u5bfc\u8005\u3002\u8be5\u8fdb\u7a0b\u6267\u884c\u4e00\u4e2a\u6216\u591a\u4e2a\u7d22\u5f15\u626b\u63cf\uff0c\u5e76\u6784\u5efa\u4e00\u4e2a\u4f4d\u56fe\uff0c\u4ee5\u6307\u793a\u9700\u8981\u8bbf\u95ee\u54ea\u4e9b\u8868\u5757\u3002\u7136\u540e\u8fd9\u4e9b\u5757\u4f1a\u50cf\u5e76\u884c\u987a\u5e8f\u626b\u63cf\u90a3\u6837\u5206\u914d\u7ed9\u534f\u4f5c\u8fdb\u7a0b\u3002\u6362\u53e5\u8bdd\u8bf4\uff0c\u5806\u626b\u63cf\u662f\u5e76\u884c\u6267\u884c\u7684\uff0c\u4f46\u5e95\u5c42\u7d22\u5f15\u626b\u63cf\u4e0d\u662f\u3002"]}, {"title": "\u672c\u7248\u624b\u518c\u4e2d\u7684\u793a\u4f8b", "blocks": [{"code": "EXPLAIN SELECT * FROM tenk1 WHERE unique1 < 100;\n\n                                  QUERY PLAN\n------------------------------------------------------------------------------\n Bitmap Heap Scan on tenk1  (cost=5.06..224.98 rows=100 width=244)\n   Recheck Cond: (unique1 < 100)\n   ->  Bitmap Index Scan on tenk1_unique1  (cost=0.00..5.04 rows=100 width=0)\n         Index Cond: (unique1 < 100)", "source": {"url": "/docs/18/using-explain.html#USING-EXPLAIN-BASICS", "path": "using-explain.html", "label": "PostgreSQL 18.6 \u00b7 using-explain", "sha256": "60040c30180093418a0affe56dd27dff9df2504b705b38039589e458bf5c31ed"}, "paragraphs": ["\u793a\u4f8b\u6458\u81ea PostgreSQL 18.6 \u624b\u518c\uff1b\u672c\u767e\u79d1\u672a\u5b9e\u9645\u6267\u884c\u6b64\u793a\u4f8b\u3002", "\u73b0\u5728\u8fdb\u4e00\u6b65\u6536\u7d27\u6761\u4ef6\uff1a"]}, {"code": "EXPLAIN SELECT * FROM tenk1 WHERE unique1 < 100 AND stringu1 = 'xxx';\n\n                                  QUERY PLAN\n------------------------------------------------------------------------------\n Bitmap Heap Scan on tenk1  (cost=5.04..225.20 rows=1 width=244)\n   Recheck Cond: (unique1 < 100)\n   Filter: (stringu1 = 'xxx'::name)\n   ->  Bitmap Index Scan on tenk1_unique1  (cost=0.00..5.04 rows=100 width=0)\n         Index Cond: (unique1 < 100)", "source": {"url": "/docs/18/using-explain.html#USING-EXPLAIN-BASICS", "path": "using-explain.html", "label": "PostgreSQL 18.6 \u00b7 using-explain", "sha256": "60040c30180093418a0affe56dd27dff9df2504b705b38039589e458bf5c31ed"}, "paragraphs": ["\u793a\u4f8b\u6458\u81ea PostgreSQL 18.6 \u624b\u518c\uff1b\u672c\u767e\u79d1\u672a\u5b9e\u9645\u6267\u884c\u6b64\u793a\u4f8b\u3002", "\u73b0\u5728\u5411 WHERE \u5b50\u53e5\u518d\u6dfb\u52a0\u4e00\u4e2a\u6761\u4ef6\uff1a"]}]}, {"title": "\u6267\u884c\u5668\u5b9e\u73b0\u8bf4\u660e", "paragraphs": ["nodeBitmapHeapscan.c\uff1a\u652f\u6301\u5173\u7cfb\u4f4d\u56fe\u626b\u63cf\u7684\u4f8b\u7a0b\u3002", "\u6ce8\u610f\uff1a\u6b64\u8ba1\u5212\u7c7b\u578b\u5fc5\u987b\u4ec5\u4f7f\u7528\u7b26\u5408 MVCC \u7684\u5feb\u7167\uff0c\u5373\u666e\u901a\u5feb\u7167\uff0c\u800c\u975e SnapshotAny \u6216\u5176\u4ed6\u7279\u6b8a\u5feb\u7167\u3002\u7d22\u5f15\u626b\u63cf\u4e0e\u5806\u626b\u63cf\u76f8\u4e92\u5206\u79bb\uff0c\u8bbf\u95ee\u67d0\u4e2a\u5806 TID \u65f6\uff0c\u65e0\u6cd5\u4fdd\u8bc1\u4fc3\u6210\u8be5\u8bbf\u95ee\u7684\u7d22\u5f15\u5143\u7ec4\u4ecd\u7136\u5b58\u5728\u3002\u5806\u5143\u7ec4\u53ef\u80fd\u5df2\u7ecf\u6d88\u5931\uff08heap_fetch \u80fd\u5904\u7406\u8fd9\u79cd\u60c5\u51b5\uff09\uff0c\u66f4\u4e25\u91cd\u7684\u662f\uff0c\u5176\u4f4d\u7f6e\u53ef\u80fd\u5df2\u88ab\u66f4\u65b0\u7684\u5143\u7ec4\u590d\u7528\u3002\u4f7f\u7528 MVCC \u5feb\u7167\u65f6\uff0c\u65b0\u5143\u7ec4\u5fc5\u5b9a\u65e0\u6cd5\u901a\u8fc7\u65f6\u95f4\u53ef\u89c1\u6027\u68c0\u67e5\uff0c\u56e0\u6b64\u4e0d\u4f1a\u9519\u8bef\u8fd4\u56de\uff1b\u4f7f\u7528\u5176\u4ed6\u5feb\u7167\u5219\u53ef\u80fd\u8fd4\u56de\u4e0d\u7b26\u5408\u7d22\u5f15\u6761\u4ef6\u7684\u5143\u7ec4\u3002", "\u6267\u884c\u5e95\u5c42\u7d22\u5f15\u626b\u63cf\u5e76\u6784\u5efa\u4f4d\u56fe\uff0c\u8bbe\u7f6e\u5e76\u884c\u5de5\u4f5c\u8fdb\u7a0b\u8fed\u4ee3\u4f4d\u56fe\u6240\u9700\u7684\u5e76\u884c\u72b6\u6001\uff0c\u4ee5\u53ca\u5e95\u5c42\u8868\u626b\u63cf\u63cf\u8ff0\u7b26\u3002", "\u9886\u5bfc\u8fdb\u7a0b\u4f1a\u7acb\u5373\u9000\u51fa\u8be5\u51fd\u6570\uff0c\u5176\u4ed6\u8fdb\u7a0b\u5219\u963b\u585e\uff0c\u76f4\u5230\u9886\u5bfc\u8fdb\u7a0b\u586b\u5145 TBM \u5e76\u5524\u9192\u5b83\u4eec\u3002", "\u51c6\u5907\u904d\u5386 TBM\uff0c\u8fd4\u56de\u8fed\u4ee3\u5668\u72b6\u6001\u7684 dsa_pointer\uff0c\u4f9b\u591a\u4e2a\u8fdb\u7a0b\u5171\u540c\u904d\u5386\u3002"]}, {"code": "case T_BitmapHeapScan:\n\t\t\tpname = sname = \"Bitmap Heap Scan\";\n\t\t\tbreak;", "title": "\u6838\u5fc3\u6e90\u7801\u4e2d\u7684 EXPLAIN \u6807\u8bc6"}], "strategies": [], "description": ["\u8bbf\u95ee\u4f4d\u56fe\u9009\u4e2d\u7684\u5806\u9875\uff0c\u5e76\u6267\u884c\u5fc5\u8981\u7684\u91cd\u68c0\u3002"], "localization": {"status": "complete", "sources": [{"url": "/docs/18/parallel-plans.html", "method": "same-major semantic node", "sha256": "7fa104623c0b4cd22acf0929e40518fbed8fe368af3e3b124cf693bd7ab69f0c", "language": "zh", "matched_nodes": ["#PARALLEL-PLANS/div[3]/div[2]/ul[0]/li[1]"]}], "language": "zh", "original_text": {"/versions/18/description/0": "Visits heap pages selected by a bitmap and performs required rechecks.", "/versions/18/facts/0/label": "Core node tag", "/versions/18/facts/1/label": "Structured EXPLAIN Node Type", "/versions/18/facts/2/label": "Inputs", "/versions/18/facts/2/value": "A tuple-location bitmap and relation", "/versions/18/facts/3/label": "Output", "/versions/18/facts/3/value": "Qualified heap tuples", "/versions/18/facts/4/label": "Executor initializer", "/versions/18/facts/5/label": "Memory mechanism", "/versions/18/tables/0/title": "EXPLAIN labels in this source build", "/versions/18/related/1/label": "Using EXPLAIN", "/versions/18/related/2/label": "Parallel plans", "/versions/18/sections/0/title": "EXPLAIN names and attributes", "/versions/18/sections/1/title": "Memory and temporary storage", "/versions/18/sections/2/title": "Parallel execution and instrumentation", "/versions/18/sections/3/title": "Same-version manual discussion", "/versions/18/sections/4/title": "Examples from this manual build", "/versions/18/sections/5/title": "Executor implementation notes", "/versions/18/sections/6/title": "EXPLAIN identity in core source", "/versions/18/memory/description": "This extraction does not assign a universal memory limit or spill policy to this node. Inspect the same-build implementation and its expressions or provider.", "/versions/18/sections/0/paragraphs/0": "Structured formats use the Node Type above. Text-format spellings can also include operation, strategy, join type, scan direction or aggregation-stage attributes.", "/versions/18/sections/0/paragraphs/1": "Text names recorded by this source: Bitmap Heap Scan.", "/versions/18/sections/0/paragraphs/2": "Parallel-aware and parallel-safe are different plan properties. A node running inside a parallel worker is not necessarily a parallel-aware node.", "/versions/18/sections/1/paragraphs/0": "This extraction does not assign a universal memory limit or spill policy to this node. Inspect the same-build implementation and its expressions or provider.", "/versions/18/sections/1/paragraphs/1": "If we are using lossy info, we have to recheck the qual conditions at every tuple.", "/versions/18/sections/2/paragraphs/0": "The source callbacks below can coordinate execution or collect worker instrumentation. Their presence is not a blanket claim that this node supports a shared parallel scan or shared state.", "/versions/18/sections/2/paragraphs/1": "Callbacks in this build: ExecBitmapHeapEstimate, ExecBitmapHeapInitializeDSM, ExecBitmapHeapInitializeWorker, ExecBitmapHeapReInitializeDSM, ExecBitmapHeapRetrieveInstrumentation.", "/versions/18/sections/3/paragraphs/0": "In a parallel bitmap heap scan , one process is chosen as the leader. That process performs a scan of one or more indexes and builds a bitmap indicating which table blocks need to be visited. These blocks are then divided among the cooperating processes as in a parallel sequential scan. In other words, the heap scan is performed in parallel, but the underlying index scan is not.", "/versions/18/sections/5/paragraphs/0": "nodeBitmapHeapscan.c Routines to support bitmapped scans of relations", "/versions/18/sections/5/paragraphs/1": "NOTE: it is critical that this plan type only be used with MVCC-compliant snapshots (ie, regular snapshots, not SnapshotAny or one of the other special snapshots). The reason is that since index and heap scans are decoupled, there can be no assurance that the index tuple prompting a visit to a particular heap TID still exists when the visit is made. Therefore the tuple might not exist anymore either (which is OK because heap_fetch will cope) --- but worse, the tuple slot could have been re-used for a newer tuple. With an MVCC snapshot the newer tuple is certain to fail the time qual and so it will not be mistakenly returned, but with anything else we might return a tuple that doesn't meet the required index qual conditions.", "/versions/18/sections/5/paragraphs/2": "Do the underlying index scan, build the bitmap, set up the parallel state needed for parallel workers to iterate through the bitmap, and set up the underlying table scan descriptor.", "/versions/18/sections/5/paragraphs/3": "The leader will immediately come out of the function, but others will be blocked until leader populates the TBM and wakes them up.", "/versions/18/sections/5/paragraphs/4": "Prepare to iterate over the TBM. This will return the dsa_pointer of the iterator state which will be used by multiple processes to iterate jointly.", "/versions/18/tables/0/columns/0/label": "Text-format label", "/versions/18/tables/0/columns/1/label": "Structured node identity", "/versions/18/sections/4/blocks/0/paragraphs/0": "Example copied from the PostgreSQL 18.6 manual; it was not executed for this collection.", "/versions/18/sections/4/blocks/0/paragraphs/1": "Now, let's make the condition more restrictive:", "/versions/18/sections/4/blocks/1/paragraphs/0": "Example copied from the PostgreSQL 18.6 manual; it was not executed for this collection.", "/versions/18/sections/4/blocks/1/paragraphs/1": "Now let's add another condition to the WHERE clause:"}, "fallback_fields": [], "source_language": "en", "original_snapshot_sha256": "768eb79c3d56e6e5a02fce88382526787e04bb9ad1c109126bdaa96bcb59983c"}, "evidence_kind": "source and documentation", "explain_names": ["Bitmap Heap Scan"], "partial_modes": [], "comparison_data": {"node_tag": "T_BitmapHeapScan", "strategies": [], "text_names": ["Bitmap Heap Scan"], "initializer": "ExecInitBitmapHeapScan", "partial_modes": [], "memory_mechanism": "unclassified", "parallel_callbacks": ["ExecBitmapHeapEstimate", "ExecBitmapHeapInitializeDSM", "ExecBitmapHeapInitializeWorker", "ExecBitmapHeapReInitializeDSM", "ExecBitmapHeapRetrieveInstrumentation"]}, "comparison_hash": "f7ee070f7f36c2ed7f3e237eb0933d70972eaf9860d38070438efebcf8ec6e71", "explain_prefixes": ["Parallel", "Async"], "runtime_verified": false, "source_inventory": {"explain": "src/backend/commands/explain.c", "executor": "src/backend/executor/execProcnode.c", "implementation": "src/backend/executor/nodeBitmapHeapscan.c"}, "parallel_callbacks": ["ExecBitmapHeapEstimate", "ExecBitmapHeapInitializeDSM", "ExecBitmapHeapInitializeWorker", "ExecBitmapHeapReInitializeDSM", "ExecBitmapHeapRetrieveInstrumentation"]}, "19": {"facts": [{"label": "\u6838\u5fc3\u8282\u70b9\u6807\u7b7e", "value": "T_BitmapHeapScan"}, {"label": "\u7ed3\u6784\u5316 EXPLAIN \u8282\u70b9\u7c7b\u578b", "value": "Bitmap Heap Scan"}, {"label": "\u8f93\u5165", "value": "\u5143\u7ec4\u4f4d\u7f6e\u4f4d\u56fe\u53ca\u5173\u7cfb"}, {"label": "\u8f93\u51fa", "value": "\u6ee1\u8db3\u6761\u4ef6\u7684\u5806\u5143\u7ec4"}, {"label": "\u6267\u884c\u5668\u521d\u59cb\u5316\u51fd\u6570", "value": "ExecInitBitmapHeapScan"}, {"label": "\u5185\u5b58\u673a\u5236", "value": "unclassified"}], "memory": {"evidence": [{"url": "https://ftp.postgresql.org/pub/source/v19beta4/postgresql-19beta4.tar.bz2", "path": "src/backend/executor/nodeBitmapHeapscan.c", "label": "src/backend/executor/nodeBitmapHeapscan.c", "sha256": "3d1ab5a915b5b4a5bea97a80713ee753e3223511da2f2c724c408e9d2b474df6", "archive_sha256": "83157ee9c599d03b2f7a3d73ef3a56ec24e0e79cc2b3501a64d1364f56398c86"}], "mechanism": "unclassified", "description": "\u672c\u6b21\u62bd\u53d6\u4e0d\u4e3a\u6b64\u8282\u70b9\u8bbe\u5b9a\u7edf\u4e00\u7684\u5185\u5b58\u4e0a\u9650\u6216\u843d\u76d8\u7b56\u7565\u3002\u8bf7\u67e5\u770b\u540c\u4e00\u6784\u5efa\u7684\u5b9e\u73b0\u3001\u76f8\u5173\u8868\u8fbe\u5f0f\u6216\u63d0\u4f9b\u65b9\u3002", "source_notes": ["If we are using lossy info, we have to recheck the qual conditions at every tuple."]}, "tables": [{"key": "explain-labels", "rows": [{"label": "Bitmap Heap Scan", "identity": "Bitmap Heap Scan"}], "title": "\u672c\u6784\u5efa\u4e2d\u7684 EXPLAIN \u6807\u7b7e", "columns": [{"key": "label", "label": "\u6587\u672c\u683c\u5f0f\u6807\u7b7e"}, {"key": "identity", "label": "\u7ed3\u6784\u5316\u8282\u70b9\u6807\u8bc6"}]}], "related": [{"url": "/wiki/sql/explain/?v=19", "label": "EXPLAIN"}, {"url": "/docs/19/using-explain.html", "label": "\u4f7f\u7528 EXPLAIN"}, {"url": "/docs/19/parallel-plans.html", "label": "\u5e76\u884c\u8ba1\u5212"}, {"url": "/wiki/guc/enable_bitmapscan/?v=19", "label": "enable_bitmapscan"}], "release": {"ref": "PostgreSQL 19beta4 source archive", "label": "19beta4", "major": "19", "channel": "preview", "revision": "83157ee9c599d03b2f7a3d73ef3a56ec24e0e79cc2b3501a64d1364f56398c86", "source_url": "https://ftp.postgresql.org/pub/source/v19beta4/postgresql-19beta4.tar.bz2", "source_snapshot_utc": ""}, "sources": [{"url": "https://ftp.postgresql.org/pub/source/v19beta4/postgresql-19beta4.tar.bz2", "line": 1465, "path": "src/backend/commands/explain.c", "label": "src/backend/commands/explain.c:1465", "sha256": "8b115b1c194a4b54ae630209a741e293b1df49a9052f10b2de9ca092a48998e3", "archive_sha256": "83157ee9c599d03b2f7a3d73ef3a56ec24e0e79cc2b3501a64d1364f56398c86"}, {"url": "https://ftp.postgresql.org/pub/source/v19beta4/postgresql-19beta4.tar.bz2", "line": 234, "path": "src/backend/executor/execProcnode.c", "label": "src/backend/executor/execProcnode.c:234", "sha256": "5e39b2037bed672da55104229ecc32da5abde44c26bcad01479edcfa044d09ed", "archive_sha256": "83157ee9c599d03b2f7a3d73ef3a56ec24e0e79cc2b3501a64d1364f56398c86"}, {"url": "https://ftp.postgresql.org/pub/source/v19beta4/postgresql-19beta4.tar.bz2", "path": "src/backend/executor/nodeBitmapHeapscan.c", "label": "src/backend/executor/nodeBitmapHeapscan.c", "sha256": "3d1ab5a915b5b4a5bea97a80713ee753e3223511da2f2c724c408e9d2b474df6", "archive_sha256": "83157ee9c599d03b2f7a3d73ef3a56ec24e0e79cc2b3501a64d1364f56398c86"}, {"url": "https://ftp.postgresql.org/pub/source/v19beta4/postgresql-19beta4.tar.bz2", "path": "src/include/nodes/plannodes.h", "label": "src/include/nodes/plannodes.h", "sha256": "1c65d5d6b6c81c71531685843647869bcae630779d815a5036b06e070c6c06c7", "archive_sha256": "83157ee9c599d03b2f7a3d73ef3a56ec24e0e79cc2b3501a64d1364f56398c86"}, {"url": "https://pg.center/docs/19/using-explain.html#USING-EXPLAIN-ANALYZE", "path": "using-explain.html", "label": "PostgreSQL 19beta4 \u00b7 using-explain", "sha256": "52f111fbd213e2200146319d01a9dcc2ea90001617d2a28edc52f7954c2dd70b", "language": "en", "original_url": "/docs/19/using-explain.html#USING-EXPLAIN-ANALYZE"}, {"url": "https://pg.center/docs/19/parallel-plans.html#PARALLEL-SCANS", "path": "parallel-plans.html", "label": "PostgreSQL 19beta4 \u00b7 parallel-plans", "sha256": "f99fee3456a48a5ce2c399d6b35ab93183c2c9012e8ed60c53c0c253f79c3756", "language": "en", "original_url": "/docs/19/parallel-plans.html#PARALLEL-SCANS"}, {"url": "https://pg.center/docs/19/using-explain.html#USING-EXPLAIN-BASICS", "path": "using-explain.html", "label": "PostgreSQL 19beta4 \u00b7 using-explain", "sha256": "52f111fbd213e2200146319d01a9dcc2ea90001617d2a28edc52f7954c2dd70b", "language": "en", "original_url": "/docs/19/using-explain.html#USING-EXPLAIN-BASICS"}], "node_tag": "T_BitmapHeapScan", "sections": [{"title": "EXPLAIN \u540d\u79f0\u4e0e\u5c5e\u6027", "paragraphs": ["\u7ed3\u6784\u5316\u683c\u5f0f\u4f7f\u7528\u4e0a\u8ff0 Node Type\u3002\u6587\u672c\u683c\u5f0f\u540d\u79f0\u8fd8\u53ef\u80fd\u5305\u542b\u64cd\u4f5c\u3001\u7b56\u7565\u3001\u8fde\u63a5\u7c7b\u578b\u3001\u626b\u63cf\u65b9\u5411\u6216\u805a\u5408\u9636\u6bb5\u5c5e\u6027\u3002", "\u6b64\u6e90\u7801\u8bb0\u5f55\u7684\u6587\u672c\u540d\u79f0\uff1aBitmap Heap Scan.", "\u5e76\u884c\u611f\u77e5\u4e0e\u5e76\u884c\u5b89\u5168\u662f\u4e0d\u540c\u7684\u8ba1\u5212\u5c5e\u6027\u3002\u5728\u5e76\u884c\u5de5\u4f5c\u8fdb\u7a0b\u5185\u8fd0\u884c\u7684\u8282\u70b9\u4e0d\u4e00\u5b9a\u662f\u5e76\u884c\u611f\u77e5\u8282\u70b9\u3002"]}, {"title": "\u5185\u5b58\u4e0e\u4e34\u65f6\u5b58\u50a8", "paragraphs": ["\u672c\u6b21\u62bd\u53d6\u4e0d\u4e3a\u6b64\u8282\u70b9\u8bbe\u5b9a\u7edf\u4e00\u7684\u5185\u5b58\u4e0a\u9650\u6216\u843d\u76d8\u7b56\u7565\u3002\u8bf7\u67e5\u770b\u540c\u4e00\u6784\u5efa\u7684\u5b9e\u73b0\u3001\u76f8\u5173\u8868\u8fbe\u5f0f\u6216\u63d0\u4f9b\u65b9\u3002", "\u4f7f\u7528\u6709\u635f\u4fe1\u606f\u65f6\uff0c\u5fc5\u987b\u5bf9\u6bcf\u4e2a\u5143\u7ec4\u91cd\u65b0\u68c0\u67e5\u6761\u4ef6\u3002"]}, {"title": "\u5e76\u884c\u6267\u884c\u4e0e\u8fd0\u884c\u4fe1\u606f\u91c7\u96c6", "paragraphs": ["\u4ee5\u4e0b\u6e90\u7801\u56de\u8c03\u53ef\u4ee5\u534f\u8c03\u6267\u884c\u6216\u6536\u96c6\u5de5\u4f5c\u8fdb\u7a0b\u7684\u6d4b\u91cf\u6570\u636e\u3002\u56de\u8c03\u5b58\u5728\u4e0d\u4ee3\u8868\u8be5\u8282\u70b9\u666e\u904d\u652f\u6301\u5171\u4eab\u5e76\u884c\u626b\u63cf\u6216\u5171\u4eab\u72b6\u6001\u3002", "\u6b64\u6784\u5efa\u7684\u56de\u8c03\uff1aExecBitmapHeapEstimate, ExecBitmapHeapInitializeDSM, ExecBitmapHeapInitializeWorker, ExecBitmapHeapInstrumentEstimate, ExecBitmapHeapReInitializeDSM, ExecBitmapHeapRetrieveInstrumentation."]}, {"title": "\u540c\u7248\u672c\u624b\u518c\u8bf4\u660e", "paragraphs": ["\u5e76\u884c\u4f4d\u56fe\u5806\u626b\u63cf\u88ab\u62c6\u5206\u4e3a\u4e09\u6b21\u5355\u72ec\u6267\u884c\uff1a\u4e00\u6b21\u7531\u9886\u5bfc\u8fdb\u7a0b\u6267\u884c\uff08\u56e0\u4e3a parallel_leader_participation \u9ed8\u8ba4\u5f00\u542f\uff09\uff0c\u53e6\u5916\u4e24\u6b21\u5206\u522b\u7531\u542f\u52a8\u7684\u4e24\u4e2a\u5de5\u4f5c\u8fdb\u7a0b\u6267\u884c\u3002\u4e0e\u987a\u5e8f\u91cd\u590d\u6267\u884c\u7c7b\u4f3c\uff0crows \u548c actual time \u663e\u793a\u7684\u662f\u6bcf\u4e2a\u5de5\u4f5c\u8fdb\u7a0b\u7684\u5e73\u5747\u503c\u3002\u5c06\u5b83\u4eec\u4e58\u4ee5 loops \u503c\uff0c\u5c31\u80fd\u5f97\u5230\u8be5\u8282\u70b9\u5728\u6240\u6709\u5de5\u4f5c\u8fdb\u7a0b\u4e2d\u5904\u7406\u7684\u603b\u884c\u6570\u3002\u6240\u6709\u5de5\u4f5c\u8fdb\u7a0b\u82b1\u8d39\u7684\u603b\u65f6\u95f4\u4e5f\u53ef\u4ee5\u7c7b\u4f3c\u8ba1\u7b97\uff0c\u4f46\u7531\u4e8e\u8fd9\u4e9b\u65f6\u95f4\u662f\u5e76\u884c\u6d88\u8017\u7684\uff0c\u5b83\u5e76\u4e0d\u7b49\u540c\u4e8e\u603b\u7684\u7ecf\u8fc7\u65f6\u95f4\u3002", "\u5728 \u5e76\u884c\u4f4d\u56fe\u5806\u626b\u63cf \u4e2d\uff0c\u4f1a\u9009\u62e9\u4e00\u4e2a\u8fdb\u7a0b\u4f5c\u4e3a\u9886\u5bfc\u8005\u3002\u8be5\u8fdb\u7a0b\u6267\u884c\u4e00\u4e2a\u6216\u591a\u4e2a\u7d22\u5f15\u626b\u63cf\uff0c\u5e76\u6784\u5efa\u4e00\u4e2a\u4f4d\u56fe\uff0c\u4ee5\u6307\u793a\u9700\u8981\u8bbf\u95ee\u54ea\u4e9b\u8868\u5757\u3002\u7136\u540e\u8fd9\u4e9b\u5757\u4f1a\u50cf\u5e76\u884c\u987a\u5e8f\u626b\u63cf\u90a3\u6837\u5206\u914d\u7ed9\u534f\u4f5c\u8fdb\u7a0b\u3002\u6362\u53e5\u8bdd\u8bf4\uff0c\u5806\u626b\u63cf\u662f\u5e76\u884c\u6267\u884c\u7684\uff0c\u4f46\u5e95\u5c42\u7d22\u5f15\u626b\u63cf\u4e0d\u662f\u3002"]}, {"title": "\u672c\u7248\u624b\u518c\u4e2d\u7684\u793a\u4f8b", "blocks": [{"code": "EXPLAIN SELECT * FROM tenk1 WHERE unique1 < 100;\n\n                                  QUERY PLAN\n------------------------------------------------------------------------------\n Bitmap Heap Scan on tenk1  (cost=5.06..224.98 rows=100 width=244)\n   Recheck Cond: (unique1 < 100)\n   ->  Bitmap Index Scan on tenk1_unique1  (cost=0.00..5.04 rows=100 width=0)\n         Index Cond: (unique1 < 100)", "source": {"url": "/docs/19/using-explain.html#USING-EXPLAIN-BASICS", "path": "using-explain.html", "label": "PostgreSQL 19beta4 \u00b7 using-explain", "sha256": "52f111fbd213e2200146319d01a9dcc2ea90001617d2a28edc52f7954c2dd70b"}, "paragraphs": ["\u793a\u4f8b\u6458\u81ea PostgreSQL 19beta4 \u624b\u518c\uff1b\u672c\u767e\u79d1\u672a\u5b9e\u9645\u6267\u884c\u6b64\u793a\u4f8b\u3002", "\u73b0\u5728\u8fdb\u4e00\u6b65\u6536\u7d27\u6761\u4ef6\uff1a"]}, {"code": "EXPLAIN SELECT * FROM tenk1 WHERE unique1 < 100 AND stringu1 = 'xxx';\n\n                                  QUERY PLAN\n------------------------------------------------------------------------------\n Bitmap Heap Scan on tenk1  (cost=5.04..225.20 rows=1 width=244)\n   Recheck Cond: (unique1 < 100)\n   Filter: (stringu1 = 'xxx'::name)\n   ->  Bitmap Index Scan on tenk1_unique1  (cost=0.00..5.04 rows=100 width=0)\n         Index Cond: (unique1 < 100)", "source": {"url": "/docs/19/using-explain.html#USING-EXPLAIN-BASICS", "path": "using-explain.html", "label": "PostgreSQL 19beta4 \u00b7 using-explain", "sha256": "52f111fbd213e2200146319d01a9dcc2ea90001617d2a28edc52f7954c2dd70b"}, "paragraphs": ["\u793a\u4f8b\u6458\u81ea PostgreSQL 19beta4 \u624b\u518c\uff1b\u672c\u767e\u79d1\u672a\u5b9e\u9645\u6267\u884c\u6b64\u793a\u4f8b\u3002", "\u73b0\u5728\u5411 WHERE \u5b50\u53e5\u518d\u6dfb\u52a0\u4e00\u4e2a\u6761\u4ef6\uff1a"]}]}, {"title": "\u6267\u884c\u5668\u5b9e\u73b0\u8bf4\u660e", "paragraphs": ["nodeBitmapHeapscan.c\uff1a\u652f\u6301\u5173\u7cfb\u4f4d\u56fe\u626b\u63cf\u7684\u4f8b\u7a0b\u3002", "\u6ce8\u610f\uff1a\u6b64\u8ba1\u5212\u7c7b\u578b\u5fc5\u987b\u4ec5\u4f7f\u7528\u7b26\u5408 MVCC \u7684\u5feb\u7167\uff0c\u5373\u666e\u901a\u5feb\u7167\uff0c\u800c\u975e SnapshotAny \u6216\u5176\u4ed6\u7279\u6b8a\u5feb\u7167\u3002\u7d22\u5f15\u626b\u63cf\u4e0e\u5806\u626b\u63cf\u76f8\u4e92\u5206\u79bb\uff0c\u8bbf\u95ee\u67d0\u4e2a\u5806 TID \u65f6\uff0c\u65e0\u6cd5\u4fdd\u8bc1\u4fc3\u6210\u8be5\u8bbf\u95ee\u7684\u7d22\u5f15\u5143\u7ec4\u4ecd\u7136\u5b58\u5728\u3002\u5806\u5143\u7ec4\u53ef\u80fd\u5df2\u7ecf\u6d88\u5931\uff08heap_fetch \u80fd\u5904\u7406\u8fd9\u79cd\u60c5\u51b5\uff09\uff0c\u66f4\u4e25\u91cd\u7684\u662f\uff0c\u5176\u4f4d\u7f6e\u53ef\u80fd\u5df2\u88ab\u66f4\u65b0\u7684\u5143\u7ec4\u590d\u7528\u3002\u4f7f\u7528 MVCC \u5feb\u7167\u65f6\uff0c\u65b0\u5143\u7ec4\u5fc5\u5b9a\u65e0\u6cd5\u901a\u8fc7\u65f6\u95f4\u53ef\u89c1\u6027\u68c0\u67e5\uff0c\u56e0\u6b64\u4e0d\u4f1a\u9519\u8bef\u8fd4\u56de\uff1b\u4f7f\u7528\u5176\u4ed6\u5feb\u7167\u5219\u53ef\u80fd\u8fd4\u56de\u4e0d\u7b26\u5408\u7d22\u5f15\u6761\u4ef6\u7684\u5143\u7ec4\u3002", "BM_INITIAL\uff1a\u5c1a\u672a\u5f00\u59cb\u521b\u5efa TIDBitmap\uff1b\u9996\u4e2a\u770b\u5230\u6b64\u72b6\u6001\u7684\u5de5\u4f5c\u8fdb\u7a0b\u5c06\u72b6\u6001\u8bbe\u4e3a BM_INPROGRESS\uff0c\u5e76\u8d1f\u8d23\u521b\u5efa TIDBitmap\u3002BM_INPROGRESS\uff1a\u6b63\u5728\u521b\u5efa TIDBitmap\uff0c\u5de5\u4f5c\u8fdb\u7a0b\u9700\u8981\u4f11\u7720\u7b49\u5f85\u5b8c\u6210\u3002BM_FINISHED\uff1aTIDBitmap \u521b\u5efa\u5b8c\u6210\uff0c\u6240\u6709\u5de5\u4f5c\u8fdb\u7a0b\u5747\u53ef\u5f00\u59cb\u8fed\u4ee3 TIDBitmap\u3002", "ParallelBitmapHeapState \u4fe1\u606f\uff1atbmiterator \u662f\u626b\u63cf\u5f53\u524d\u9875\u9762\u7684\u8fed\u4ee3\u5668\uff1bmutex \u4fdd\u62a4\u72b6\u6001\u7684\u4e92\u65a5\u8bbf\u95ee\uff1bstate \u8868\u793a TIDBitmap \u5f53\u524d\u72b6\u6001\uff1bcv \u662f\u6761\u4ef6\u7b49\u5f85\u53d8\u91cf\u3002", "\u6267\u884c\u5e95\u5c42\u7d22\u5f15\u626b\u63cf\u5e76\u6784\u5efa\u4f4d\u56fe\uff0c\u8bbe\u7f6e\u5e76\u884c\u5de5\u4f5c\u8fdb\u7a0b\u8fed\u4ee3\u4f4d\u56fe\u6240\u9700\u7684\u5e76\u884c\u72b6\u6001\uff0c\u4ee5\u53ca\u5e95\u5c42\u8868\u626b\u63cf\u63cf\u8ff0\u7b26\u3002"]}, {"code": "case T_BitmapHeapScan:\n\t\t\tpname = sname = \"Bitmap Heap Scan\";\n\t\t\tbreak;", "title": "\u6838\u5fc3\u6e90\u7801\u4e2d\u7684 EXPLAIN \u6807\u8bc6"}], "strategies": [], "description": ["\u8bbf\u95ee\u4f4d\u56fe\u9009\u4e2d\u7684\u5806\u9875\uff0c\u5e76\u6267\u884c\u5fc5\u8981\u7684\u91cd\u68c0\u3002"], "localization": {"status": "complete", "sources": [{"url": "/docs/19/parallel-plans.html", "method": "same-major semantic node", "sha256": "c162417a8d7d4bf4b4b79ba445207cd01020c24ca11178e13a9fa3d7d8ca8e2e", "language": "zh", "matched_nodes": ["#PARALLEL-PLANS/div[3]/div[2]/ul[0]/li[1]"]}, {"url": "/docs/19/using-explain.html", "method": "same-major semantic node", "sha256": "7cc78f59bf29afb1811ece53e9d5c572a3f634d66d7422fb8761f19bc6811492", "language": "zh", "matched_nodes": ["#USING-EXPLAIN/div[8]/p[7]"]}], "language": "zh", "original_text": {"/versions/19/description/0": "Visits heap pages selected by a bitmap and performs required rechecks.", "/versions/19/facts/0/label": "Core node tag", "/versions/19/facts/1/label": "Structured EXPLAIN Node Type", "/versions/19/facts/2/label": "Inputs", "/versions/19/facts/2/value": "A tuple-location bitmap and relation", "/versions/19/facts/3/label": "Output", "/versions/19/facts/3/value": "Qualified heap tuples", "/versions/19/facts/4/label": "Executor initializer", "/versions/19/facts/5/label": "Memory mechanism", "/versions/19/tables/0/title": "EXPLAIN labels in this source build", "/versions/19/related/1/label": "Using EXPLAIN", "/versions/19/related/2/label": "Parallel plans", "/versions/19/sections/0/title": "EXPLAIN names and attributes", "/versions/19/sections/1/title": "Memory and temporary storage", "/versions/19/sections/2/title": "Parallel execution and instrumentation", "/versions/19/sections/3/title": "Same-version manual discussion", "/versions/19/sections/4/title": "Examples from this manual build", "/versions/19/sections/5/title": "Executor implementation notes", "/versions/19/sections/6/title": "EXPLAIN identity in core source", "/versions/19/memory/description": "This extraction does not assign a universal memory limit or spill policy to this node. Inspect the same-build implementation and its expressions or provider.", "/versions/19/sections/0/paragraphs/0": "Structured formats use the Node Type above. Text-format spellings can also include operation, strategy, join type, scan direction or aggregation-stage attributes.", "/versions/19/sections/0/paragraphs/1": "Text names recorded by this source: Bitmap Heap Scan.", "/versions/19/sections/0/paragraphs/2": "Parallel-aware and parallel-safe are different plan properties. A node running inside a parallel worker is not necessarily a parallel-aware node.", "/versions/19/sections/1/paragraphs/0": "This extraction does not assign a universal memory limit or spill policy to this node. Inspect the same-build implementation and its expressions or provider.", "/versions/19/sections/1/paragraphs/1": "If we are using lossy info, we have to recheck the qual conditions at every tuple.", "/versions/19/sections/2/paragraphs/0": "The source callbacks below can coordinate execution or collect worker instrumentation. Their presence is not a blanket claim that this node supports a shared parallel scan or shared state.", "/versions/19/sections/2/paragraphs/1": "Callbacks in this build: ExecBitmapHeapEstimate, ExecBitmapHeapInitializeDSM, ExecBitmapHeapInitializeWorker, ExecBitmapHeapInstrumentEstimate, ExecBitmapHeapReInitializeDSM, ExecBitmapHeapRetrieveInstrumentation.", "/versions/19/sections/3/paragraphs/0": "The parallel bitmap heap scan was split into three separate executions: one in the leader (since parallel_leader_participation is on by default), and one in each of the two launched workers. Similarly to sequential repeated executions, rows and actual time are averages per-worker. Multiply by the loops value to get the total number of rows processed by the node across all workers. The total time spent in all workers can be calculated similarly, but since this time is spent concurrently, it is not equivalent to total elapsed time.", "/versions/19/sections/3/paragraphs/1": "In a parallel bitmap heap scan , one process is chosen as the leader. That process performs a scan of one or more indexes and builds a bitmap indicating which table blocks need to be visited. These blocks are then divided among the cooperating processes as in a parallel sequential scan. In other words, the heap scan is performed in parallel, but the underlying index scan is not.", "/versions/19/sections/5/paragraphs/0": "nodeBitmapHeapscan.c Routines to support bitmapped scans of relations", "/versions/19/sections/5/paragraphs/1": "NOTE: it is critical that this plan type only be used with MVCC-compliant snapshots (ie, regular snapshots, not SnapshotAny or one of the other special snapshots). The reason is that since index and heap scans are decoupled, there can be no assurance that the index tuple prompting a visit to a particular heap TID still exists when the visit is made. Therefore the tuple might not exist anymore either (which is OK because heap_fetch will cope) --- but worse, the tuple slot could have been re-used for a newer tuple. With an MVCC snapshot the newer tuple is certain to fail the time qual and so it will not be mistakenly returned, but with anything else we might return a tuple that doesn't meet the required index qual conditions.", "/versions/19/sections/5/paragraphs/2": "BM_INITIAL TIDBitmap creation is not yet started, so first worker to see this state will set the state to BM_INPROGRESS and that process will be responsible for creating TIDBitmap. BM_INPROGRESS TIDBitmap creation is in progress; workers need to sleep until it's finished. BM_FINISHED TIDBitmap creation is done, so now all workers can proceed to iterate over TIDBitmap.", "/versions/19/sections/5/paragraphs/3": "ParallelBitmapHeapState information tbmiterator iterator for scanning current pages mutex mutual exclusion for state state current state of the TIDBitmap cv conditional wait variable", "/versions/19/sections/5/paragraphs/4": "Do the underlying index scan, build the bitmap, set up the parallel state needed for parallel workers to iterate through the bitmap, and set up the underlying table scan descriptor.", "/versions/19/tables/0/columns/0/label": "Text-format label", "/versions/19/tables/0/columns/1/label": "Structured node identity", "/versions/19/sections/4/blocks/0/paragraphs/0": "Example copied from the PostgreSQL 19beta4 manual; it was not executed for this collection.", "/versions/19/sections/4/blocks/0/paragraphs/1": "Now, let's make the condition more restrictive:", "/versions/19/sections/4/blocks/1/paragraphs/0": "Example copied from the PostgreSQL 19beta4 manual; it was not executed for this collection.", "/versions/19/sections/4/blocks/1/paragraphs/1": "Now let's add another condition to the WHERE clause:"}, "fallback_fields": [], "source_language": "en", "original_snapshot_sha256": "cab5420ccc60c94d7a4873c486e4a72021fe9c8380c5c6ad85d4f0b23c90a4bf"}, "evidence_kind": "source and documentation", "explain_names": ["Bitmap Heap Scan"], "partial_modes": [], "comparison_data": {"node_tag": "T_BitmapHeapScan", "strategies": [], "text_names": ["Bitmap Heap Scan"], "initializer": "ExecInitBitmapHeapScan", "partial_modes": [], "memory_mechanism": "unclassified", "parallel_callbacks": ["ExecBitmapHeapEstimate", "ExecBitmapHeapInitializeDSM", "ExecBitmapHeapInitializeWorker", "ExecBitmapHeapInstrumentEstimate", "ExecBitmapHeapReInitializeDSM", "ExecBitmapHeapRetrieveInstrumentation"]}, "comparison_hash": "fb953ace39dab4979a295ec6cf4aaf7c5d9906527002f98d1ce062efc03be83b", "explain_prefixes": ["Parallel", "Async"], "runtime_verified": false, "source_inventory": {"explain": "src/backend/commands/explain.c", "executor": "src/backend/executor/execProcnode.c", "implementation": "src/backend/executor/nodeBitmapHeapscan.c"}, "parallel_callbacks": ["ExecBitmapHeapEstimate", "ExecBitmapHeapInitializeDSM", "ExecBitmapHeapInitializeWorker", "ExecBitmapHeapInstrumentEstimate", "ExecBitmapHeapReInitializeDSM", "ExecBitmapHeapRetrieveInstrumentation"]}, "20": {"facts": [{"label": "\u6838\u5fc3\u8282\u70b9\u6807\u7b7e", "value": "T_BitmapHeapScan"}, {"label": "\u7ed3\u6784\u5316 EXPLAIN \u8282\u70b9\u7c7b\u578b", "value": "Bitmap Heap Scan"}, {"label": "\u8f93\u5165", "value": "\u5143\u7ec4\u4f4d\u7f6e\u4f4d\u56fe\u53ca\u5173\u7cfb"}, {"label": "\u8f93\u51fa", "value": "\u6ee1\u8db3\u6761\u4ef6\u7684\u5806\u5143\u7ec4"}, {"label": "\u6267\u884c\u5668\u521d\u59cb\u5316\u51fd\u6570", "value": "ExecInitBitmapHeapScan"}, {"label": "\u5185\u5b58\u673a\u5236", "value": "unclassified"}], "memory": {"evidence": [{"url": "https://ftp.postgresql.org/pub/snapshot/dev/postgresql-snapshot.tar.bz2", "path": "src/backend/executor/nodeBitmapHeapscan.c", "label": "src/backend/executor/nodeBitmapHeapscan.c", "sha256": "f4c00f9660e4b4633897ca9acf8e0ee14a0bf3bcb1fb4e245b399c0c59107ce6", "archive_sha256": "4d3346909b201ac1648232cf290462a7070c119326f56196f1f0253ed80fae41"}], "mechanism": "unclassified", "description": "\u672c\u6b21\u62bd\u53d6\u4e0d\u4e3a\u6b64\u8282\u70b9\u8bbe\u5b9a\u7edf\u4e00\u7684\u5185\u5b58\u4e0a\u9650\u6216\u843d\u76d8\u7b56\u7565\u3002\u8bf7\u67e5\u770b\u540c\u4e00\u6784\u5efa\u7684\u5b9e\u73b0\u3001\u76f8\u5173\u8868\u8fbe\u5f0f\u6216\u63d0\u4f9b\u65b9\u3002", "source_notes": ["If we are using lossy info, we have to recheck the qual conditions at every tuple."]}, "tables": [{"key": "explain-labels", "rows": [{"label": "Bitmap Heap Scan", "identity": "Bitmap Heap Scan"}], "title": "\u672c\u6784\u5efa\u4e2d\u7684 EXPLAIN \u6807\u7b7e", "columns": [{"key": "label", "label": "\u6587\u672c\u683c\u5f0f\u6807\u7b7e"}, {"key": "identity", "label": "\u7ed3\u6784\u5316\u8282\u70b9\u6807\u8bc6"}]}], "related": [{"url": "/wiki/sql/explain/?v=20", "label": "EXPLAIN"}, {"url": "/docs/devel/using-explain.html", "label": "\u4f7f\u7528 EXPLAIN"}, {"url": "/docs/devel/parallel-plans.html", "label": "\u5e76\u884c\u8ba1\u5212"}, {"url": "/wiki/guc/enable_bitmapscan/?v=20", "label": "enable_bitmapscan"}], "release": {"ref": "PostgreSQL 20devel source archive", "label": "20devel", "major": "20", "channel": "devel", "revision": "4d3346909b201ac1648232cf290462a7070c119326f56196f1f0253ed80fae41", "source_url": "https://ftp.postgresql.org/pub/snapshot/dev/postgresql-snapshot.tar.bz2", "source_snapshot_utc": "26-Sep-2026 20:22"}, "sources": [{"url": "https://ftp.postgresql.org/pub/snapshot/dev/postgresql-snapshot.tar.bz2", "line": 1465, "path": "src/backend/commands/explain.c", "label": "src/backend/commands/explain.c:1465", "sha256": "13402758013520451539427b5993db06d463ca11c4e2d4cc5444e82367688077", "archive_sha256": "4d3346909b201ac1648232cf290462a7070c119326f56196f1f0253ed80fae41"}, {"url": "https://ftp.postgresql.org/pub/snapshot/dev/postgresql-snapshot.tar.bz2", "line": 234, "path": "src/backend/executor/execProcnode.c", "label": "src/backend/executor/execProcnode.c:234", "sha256": "5e39b2037bed672da55104229ecc32da5abde44c26bcad01479edcfa044d09ed", "archive_sha256": "4d3346909b201ac1648232cf290462a7070c119326f56196f1f0253ed80fae41"}, {"url": "https://ftp.postgresql.org/pub/snapshot/dev/postgresql-snapshot.tar.bz2", "path": "src/backend/executor/nodeBitmapHeapscan.c", "label": "src/backend/executor/nodeBitmapHeapscan.c", "sha256": "f4c00f9660e4b4633897ca9acf8e0ee14a0bf3bcb1fb4e245b399c0c59107ce6", "archive_sha256": "4d3346909b201ac1648232cf290462a7070c119326f56196f1f0253ed80fae41"}, {"url": "https://ftp.postgresql.org/pub/snapshot/dev/postgresql-snapshot.tar.bz2", "path": "src/include/nodes/plannodes.h", "label": "src/include/nodes/plannodes.h", "sha256": "7a94ed1652f0d74d50c39971d1cd3e8051dbc0d6058f31b6de71a433ca343521", "archive_sha256": "4d3346909b201ac1648232cf290462a7070c119326f56196f1f0253ed80fae41"}, {"url": "https://pg.center/docs/devel/using-explain.html#USING-EXPLAIN-ANALYZE", "path": "using-explain.html", "label": "PostgreSQL 20devel \u00b7 using-explain", "sha256": "99cfea3035876ea63f88b75ba8c964b51a32a70606544e09f769c0b60a234b31", "language": "en", "original_url": "/docs/devel/using-explain.html#USING-EXPLAIN-ANALYZE"}, {"url": "https://pg.center/docs/devel/parallel-plans.html#PARALLEL-SCANS", "path": "parallel-plans.html", "label": "PostgreSQL 20devel \u00b7 parallel-plans", "sha256": "6451d4254d26d789b8697ba7207288ac26e75e56f9711c8a5a3f5480171a4724", "language": "en", "original_url": "/docs/devel/parallel-plans.html#PARALLEL-SCANS"}, {"url": "https://pg.center/docs/devel/using-explain.html#USING-EXPLAIN-BASICS", "path": "using-explain.html", "label": "PostgreSQL 20devel \u00b7 using-explain", "sha256": "99cfea3035876ea63f88b75ba8c964b51a32a70606544e09f769c0b60a234b31", "language": "en", "original_url": "/docs/devel/using-explain.html#USING-EXPLAIN-BASICS"}], "node_tag": "T_BitmapHeapScan", "sections": [{"title": "EXPLAIN \u540d\u79f0\u4e0e\u5c5e\u6027", "paragraphs": ["\u7ed3\u6784\u5316\u683c\u5f0f\u4f7f\u7528\u4e0a\u8ff0 Node Type\u3002\u6587\u672c\u683c\u5f0f\u540d\u79f0\u8fd8\u53ef\u80fd\u5305\u542b\u64cd\u4f5c\u3001\u7b56\u7565\u3001\u8fde\u63a5\u7c7b\u578b\u3001\u626b\u63cf\u65b9\u5411\u6216\u805a\u5408\u9636\u6bb5\u5c5e\u6027\u3002", "\u6b64\u6e90\u7801\u8bb0\u5f55\u7684\u6587\u672c\u540d\u79f0\uff1aBitmap Heap Scan.", "\u5e76\u884c\u611f\u77e5\u4e0e\u5e76\u884c\u5b89\u5168\u662f\u4e0d\u540c\u7684\u8ba1\u5212\u5c5e\u6027\u3002\u5728\u5e76\u884c\u5de5\u4f5c\u8fdb\u7a0b\u5185\u8fd0\u884c\u7684\u8282\u70b9\u4e0d\u4e00\u5b9a\u662f\u5e76\u884c\u611f\u77e5\u8282\u70b9\u3002"]}, {"title": "\u5185\u5b58\u4e0e\u4e34\u65f6\u5b58\u50a8", "paragraphs": ["\u672c\u6b21\u62bd\u53d6\u4e0d\u4e3a\u6b64\u8282\u70b9\u8bbe\u5b9a\u7edf\u4e00\u7684\u5185\u5b58\u4e0a\u9650\u6216\u843d\u76d8\u7b56\u7565\u3002\u8bf7\u67e5\u770b\u540c\u4e00\u6784\u5efa\u7684\u5b9e\u73b0\u3001\u76f8\u5173\u8868\u8fbe\u5f0f\u6216\u63d0\u4f9b\u65b9\u3002", "\u4f7f\u7528\u6709\u635f\u4fe1\u606f\u65f6\uff0c\u5fc5\u987b\u5bf9\u6bcf\u4e2a\u5143\u7ec4\u91cd\u65b0\u68c0\u67e5\u6761\u4ef6\u3002"]}, {"title": "\u5e76\u884c\u6267\u884c\u4e0e\u8fd0\u884c\u4fe1\u606f\u91c7\u96c6", "paragraphs": ["\u4ee5\u4e0b\u6e90\u7801\u56de\u8c03\u53ef\u4ee5\u534f\u8c03\u6267\u884c\u6216\u6536\u96c6\u5de5\u4f5c\u8fdb\u7a0b\u7684\u6d4b\u91cf\u6570\u636e\u3002\u56de\u8c03\u5b58\u5728\u4e0d\u4ee3\u8868\u8be5\u8282\u70b9\u666e\u904d\u652f\u6301\u5171\u4eab\u5e76\u884c\u626b\u63cf\u6216\u5171\u4eab\u72b6\u6001\u3002", "\u6b64\u6784\u5efa\u7684\u56de\u8c03\uff1aExecBitmapHeapEstimate, ExecBitmapHeapInitializeDSM, ExecBitmapHeapInitializeWorker, ExecBitmapHeapInstrumentEstimate, ExecBitmapHeapReInitializeDSM, ExecBitmapHeapRetrieveInstrumentation."]}, {"title": "\u540c\u7248\u672c\u624b\u518c\u8bf4\u660e", "paragraphs": ["\u5e76\u884c\u4f4d\u56fe\u5806\u626b\u63cf\u88ab\u62c6\u5206\u4e3a\u4e09\u6b21\u5355\u72ec\u6267\u884c\uff1a\u4e00\u6b21\u7531\u9886\u5bfc\u8fdb\u7a0b\u6267\u884c\uff08\u56e0\u4e3a parallel_leader_participation \u9ed8\u8ba4\u5f00\u542f\uff09\uff0c\u53e6\u5916\u4e24\u6b21\u5206\u522b\u7531\u542f\u52a8\u7684\u4e24\u4e2a\u5de5\u4f5c\u8fdb\u7a0b\u6267\u884c\u3002\u4e0e\u987a\u5e8f\u91cd\u590d\u6267\u884c\u7c7b\u4f3c\uff0crows \u548c actual time \u663e\u793a\u7684\u662f\u6bcf\u4e2a\u5de5\u4f5c\u8fdb\u7a0b\u7684\u5e73\u5747\u503c\u3002\u5c06\u5b83\u4eec\u4e58\u4ee5 loops \u503c\uff0c\u5c31\u80fd\u5f97\u5230\u8be5\u8282\u70b9\u5728\u6240\u6709\u5de5\u4f5c\u8fdb\u7a0b\u4e2d\u5904\u7406\u7684\u603b\u884c\u6570\u3002\u6240\u6709\u5de5\u4f5c\u8fdb\u7a0b\u82b1\u8d39\u7684\u603b\u65f6\u95f4\u4e5f\u53ef\u4ee5\u7c7b\u4f3c\u8ba1\u7b97\uff0c\u4f46\u7531\u4e8e\u8fd9\u4e9b\u65f6\u95f4\u662f\u5e76\u884c\u6d88\u8017\u7684\uff0c\u5b83\u5e76\u4e0d\u7b49\u540c\u4e8e\u603b\u7684\u7ecf\u8fc7\u65f6\u95f4\u3002", "\u5728 \u5e76\u884c\u4f4d\u56fe\u5806\u626b\u63cf \u4e2d\uff0c\u4f1a\u9009\u62e9\u4e00\u4e2a\u8fdb\u7a0b\u4f5c\u4e3a\u9886\u5bfc\u8005\u3002\u8be5\u8fdb\u7a0b\u6267\u884c\u4e00\u4e2a\u6216\u591a\u4e2a\u7d22\u5f15\u626b\u63cf\uff0c\u5e76\u6784\u5efa\u4e00\u4e2a\u4f4d\u56fe\uff0c\u4ee5\u6307\u793a\u9700\u8981\u8bbf\u95ee\u54ea\u4e9b\u8868\u5757\u3002\u7136\u540e\u8fd9\u4e9b\u5757\u4f1a\u50cf\u5e76\u884c\u987a\u5e8f\u626b\u63cf\u90a3\u6837\u5206\u914d\u7ed9\u534f\u4f5c\u8fdb\u7a0b\u3002\u6362\u53e5\u8bdd\u8bf4\uff0c\u5806\u626b\u63cf\u662f\u5e76\u884c\u6267\u884c\u7684\uff0c\u4f46\u5e95\u5c42\u7d22\u5f15\u626b\u63cf\u4e0d\u662f\u3002"]}, {"title": "\u672c\u7248\u624b\u518c\u4e2d\u7684\u793a\u4f8b", "blocks": [{"code": "EXPLAIN SELECT * FROM tenk1 WHERE unique1 < 100;\n\n                                  QUERY PLAN\n------------------------------------------------------------------------------\n Bitmap Heap Scan on tenk1  (cost=5.06..224.98 rows=100 width=244)\n   Recheck Cond: (unique1 < 100)\n   ->  Bitmap Index Scan on tenk1_unique1  (cost=0.00..5.04 rows=100 width=0)\n         Index Cond: (unique1 < 100)", "source": {"url": "/docs/devel/using-explain.html#USING-EXPLAIN-BASICS", "path": "using-explain.html", "label": "PostgreSQL 20devel \u00b7 using-explain", "sha256": "99cfea3035876ea63f88b75ba8c964b51a32a70606544e09f769c0b60a234b31"}, "paragraphs": ["\u793a\u4f8b\u6458\u81ea PostgreSQL 20devel \u624b\u518c\uff1b\u672c\u767e\u79d1\u672a\u5b9e\u9645\u6267\u884c\u6b64\u793a\u4f8b\u3002", "\u73b0\u5728\u8fdb\u4e00\u6b65\u6536\u7d27\u6761\u4ef6\uff1a"]}, {"code": "EXPLAIN SELECT * FROM tenk1 WHERE unique1 < 100 AND stringu1 = 'xxx';\n\n                                  QUERY PLAN\n------------------------------------------------------------------------------\n Bitmap Heap Scan on tenk1  (cost=5.04..225.20 rows=1 width=244)\n   Recheck Cond: (unique1 < 100)\n   Filter: (stringu1 = 'xxx'::name)\n   ->  Bitmap Index Scan on tenk1_unique1  (cost=0.00..5.04 rows=100 width=0)\n         Index Cond: (unique1 < 100)", "source": {"url": "/docs/devel/using-explain.html#USING-EXPLAIN-BASICS", "path": "using-explain.html", "label": "PostgreSQL 20devel \u00b7 using-explain", "sha256": "99cfea3035876ea63f88b75ba8c964b51a32a70606544e09f769c0b60a234b31"}, "paragraphs": ["\u793a\u4f8b\u6458\u81ea PostgreSQL 20devel \u624b\u518c\uff1b\u672c\u767e\u79d1\u672a\u5b9e\u9645\u6267\u884c\u6b64\u793a\u4f8b\u3002", "\u73b0\u5728\u5411 WHERE \u5b50\u53e5\u518d\u6dfb\u52a0\u4e00\u4e2a\u6761\u4ef6\uff1a"]}]}, {"title": "\u6267\u884c\u5668\u5b9e\u73b0\u8bf4\u660e", "paragraphs": ["nodeBitmapHeapscan.c\uff1a\u652f\u6301\u5173\u7cfb\u4f4d\u56fe\u626b\u63cf\u7684\u4f8b\u7a0b\u3002", "\u6ce8\u610f\uff1a\u6b64\u8ba1\u5212\u7c7b\u578b\u5fc5\u987b\u4ec5\u4f7f\u7528\u7b26\u5408 MVCC \u7684\u5feb\u7167\uff0c\u5373\u666e\u901a\u5feb\u7167\uff0c\u800c\u975e SnapshotAny \u6216\u5176\u4ed6\u7279\u6b8a\u5feb\u7167\u3002\u7d22\u5f15\u626b\u63cf\u4e0e\u5806\u626b\u63cf\u76f8\u4e92\u5206\u79bb\uff0c\u8bbf\u95ee\u67d0\u4e2a\u5806 TID \u65f6\uff0c\u65e0\u6cd5\u4fdd\u8bc1\u4fc3\u6210\u8be5\u8bbf\u95ee\u7684\u7d22\u5f15\u5143\u7ec4\u4ecd\u7136\u5b58\u5728\u3002\u5806\u5143\u7ec4\u53ef\u80fd\u5df2\u7ecf\u6d88\u5931\uff08heap_fetch \u80fd\u5904\u7406\u8fd9\u79cd\u60c5\u51b5\uff09\uff0c\u66f4\u4e25\u91cd\u7684\u662f\uff0c\u5176\u4f4d\u7f6e\u53ef\u80fd\u5df2\u88ab\u66f4\u65b0\u7684\u5143\u7ec4\u590d\u7528\u3002\u4f7f\u7528 MVCC \u5feb\u7167\u65f6\uff0c\u65b0\u5143\u7ec4\u5fc5\u5b9a\u65e0\u6cd5\u901a\u8fc7\u65f6\u95f4\u53ef\u89c1\u6027\u68c0\u67e5\uff0c\u56e0\u6b64\u4e0d\u4f1a\u9519\u8bef\u8fd4\u56de\uff1b\u4f7f\u7528\u5176\u4ed6\u5feb\u7167\u5219\u53ef\u80fd\u8fd4\u56de\u4e0d\u7b26\u5408\u7d22\u5f15\u6761\u4ef6\u7684\u5143\u7ec4\u3002", "BM_INITIAL\uff1a\u5c1a\u672a\u5f00\u59cb\u521b\u5efa TIDBitmap\uff1b\u9996\u4e2a\u770b\u5230\u6b64\u72b6\u6001\u7684\u5de5\u4f5c\u8fdb\u7a0b\u5c06\u72b6\u6001\u8bbe\u4e3a BM_INPROGRESS\uff0c\u5e76\u8d1f\u8d23\u521b\u5efa TIDBitmap\u3002BM_INPROGRESS\uff1a\u6b63\u5728\u521b\u5efa TIDBitmap\uff0c\u5de5\u4f5c\u8fdb\u7a0b\u9700\u8981\u4f11\u7720\u7b49\u5f85\u5b8c\u6210\u3002BM_FINISHED\uff1aTIDBitmap \u521b\u5efa\u5b8c\u6210\uff0c\u6240\u6709\u5de5\u4f5c\u8fdb\u7a0b\u5747\u53ef\u5f00\u59cb\u8fed\u4ee3 TIDBitmap\u3002", "ParallelBitmapHeapState \u4fe1\u606f\uff1atbmiterator \u662f\u626b\u63cf\u5f53\u524d\u9875\u9762\u7684\u8fed\u4ee3\u5668\uff1bstate \u8868\u793a TIDBitmap \u5f53\u524d\u72b6\u6001\uff1bcv \u662f\u6761\u4ef6\u7b49\u5f85\u53d8\u91cf\u3002", "\u6267\u884c\u5e95\u5c42\u7d22\u5f15\u626b\u63cf\u5e76\u6784\u5efa\u4f4d\u56fe\uff0c\u8bbe\u7f6e\u5e76\u884c\u5de5\u4f5c\u8fdb\u7a0b\u8fed\u4ee3\u4f4d\u56fe\u6240\u9700\u7684\u5e76\u884c\u72b6\u6001\uff0c\u4ee5\u53ca\u5e95\u5c42\u8868\u626b\u63cf\u63cf\u8ff0\u7b26\u3002"]}, {"code": "case T_BitmapHeapScan:\n\t\t\tpname = sname = \"Bitmap Heap Scan\";\n\t\t\tbreak;", "title": "\u6838\u5fc3\u6e90\u7801\u4e2d\u7684 EXPLAIN \u6807\u8bc6"}], "strategies": [], "description": ["\u8bbf\u95ee\u4f4d\u56fe\u9009\u4e2d\u7684\u5806\u9875\uff0c\u5e76\u6267\u884c\u5fc5\u8981\u7684\u91cd\u68c0\u3002"], "localization": {"status": "complete", "sources": [{"url": "/docs/devel/parallel-plans.html", "method": "same-major semantic node", "sha256": "322333100879d0971d33685d4924d0c6b79bc429a74a35f9cca60c247e02b545", "language": "zh", "matched_nodes": ["#PARALLEL-PLANS/div[3]/div[2]/ul[0]/li[1]"]}, {"url": "/docs/devel/using-explain.html", "method": "same-major semantic node", "sha256": "2744ee0e88d132c504bf5e102765edaabd393eb12c59294093db6d90b26dd65c", "language": "zh", "matched_nodes": ["#USING-EXPLAIN/div[8]/p[7]"]}], "language": "zh", "original_text": {"/summary": "Visits heap pages selected by a bitmap and performs required rechecks.", "/category": "Scan", "/versions/20/description/0": "Visits heap pages selected by a bitmap and performs required rechecks.", "/versions/20/facts/0/label": "Core node tag", "/versions/20/facts/1/label": "Structured EXPLAIN Node Type", "/versions/20/facts/2/label": "Inputs", "/versions/20/facts/2/value": "A tuple-location bitmap and relation", "/versions/20/facts/3/label": "Output", "/versions/20/facts/3/value": "Qualified heap tuples", "/versions/20/facts/4/label": "Executor initializer", "/versions/20/facts/5/label": "Memory mechanism", "/versions/20/tables/0/title": "EXPLAIN labels in this source build", "/versions/20/related/1/label": "Using EXPLAIN", "/versions/20/related/2/label": "Parallel plans", "/versions/20/sections/0/title": "EXPLAIN names and attributes", "/versions/20/sections/1/title": "Memory and temporary storage", "/versions/20/sections/2/title": "Parallel execution and instrumentation", "/versions/20/sections/3/title": "Same-version manual discussion", "/versions/20/sections/4/title": "Examples from this manual build", "/versions/20/sections/5/title": "Executor implementation notes", "/versions/20/sections/6/title": "EXPLAIN identity in core source", "/versions/20/memory/description": "This extraction does not assign a universal memory limit or spill policy to this node. Inspect the same-build implementation and its expressions or provider.", "/versions/20/sections/0/paragraphs/0": "Structured formats use the Node Type above. Text-format spellings can also include operation, strategy, join type, scan direction or aggregation-stage attributes.", "/versions/20/sections/0/paragraphs/1": "Text names recorded by this source: Bitmap Heap Scan.", "/versions/20/sections/0/paragraphs/2": "Parallel-aware and parallel-safe are different plan properties. A node running inside a parallel worker is not necessarily a parallel-aware node.", "/versions/20/sections/1/paragraphs/0": "This extraction does not assign a universal memory limit or spill policy to this node. Inspect the same-build implementation and its expressions or provider.", "/versions/20/sections/1/paragraphs/1": "If we are using lossy info, we have to recheck the qual conditions at every tuple.", "/versions/20/sections/2/paragraphs/0": "The source callbacks below can coordinate execution or collect worker instrumentation. Their presence is not a blanket claim that this node supports a shared parallel scan or shared state.", "/versions/20/sections/2/paragraphs/1": "Callbacks in this build: ExecBitmapHeapEstimate, ExecBitmapHeapInitializeDSM, ExecBitmapHeapInitializeWorker, ExecBitmapHeapInstrumentEstimate, ExecBitmapHeapReInitializeDSM, ExecBitmapHeapRetrieveInstrumentation.", "/versions/20/sections/3/paragraphs/0": "The parallel bitmap heap scan was split into three separate executions: one in the leader (since parallel_leader_participation is on by default), and one in each of the two launched workers. Similarly to sequential repeated executions, rows and actual time are averages per-worker. Multiply by the loops value to get the total number of rows processed by the node across all workers. The total time spent in all workers can be calculated similarly, but since this time is spent concurrently, it is not equivalent to total elapsed time.", "/versions/20/sections/3/paragraphs/1": "In a parallel bitmap heap scan , one process is chosen as the leader. That process performs a scan of one or more indexes and builds a bitmap indicating which table blocks need to be visited. These blocks are then divided among the cooperating processes as in a parallel sequential scan. In other words, the heap scan is performed in parallel, but the underlying index scan is not.", "/versions/20/sections/5/paragraphs/0": "nodeBitmapHeapscan.c Routines to support bitmapped scans of relations", "/versions/20/sections/5/paragraphs/1": "NOTE: it is critical that this plan type only be used with MVCC-compliant snapshots (ie, regular snapshots, not SnapshotAny or one of the other special snapshots). The reason is that since index and heap scans are decoupled, there can be no assurance that the index tuple prompting a visit to a particular heap TID still exists when the visit is made. Therefore the tuple might not exist anymore either (which is OK because heap_fetch will cope) --- but worse, the tuple slot could have been re-used for a newer tuple. With an MVCC snapshot the newer tuple is certain to fail the time qual and so it will not be mistakenly returned, but with anything else we might return a tuple that doesn't meet the required index qual conditions.", "/versions/20/sections/5/paragraphs/2": "BM_INITIAL TIDBitmap creation is not yet started, so first worker to see this state will set the state to BM_INPROGRESS and that process will be responsible for creating TIDBitmap. BM_INPROGRESS TIDBitmap creation is in progress; workers need to sleep until it's finished. BM_FINISHED TIDBitmap creation is done, so now all workers can proceed to iterate over TIDBitmap.", "/versions/20/sections/5/paragraphs/3": "ParallelBitmapHeapState information tbmiterator iterator for scanning current pages state current state of the TIDBitmap cv conditional wait variable", "/versions/20/sections/5/paragraphs/4": "Do the underlying index scan, build the bitmap, set up the parallel state needed for parallel workers to iterate through the bitmap, and set up the underlying table scan descriptor.", "/versions/20/tables/0/columns/0/label": "Text-format label", "/versions/20/tables/0/columns/1/label": "Structured node identity", "/versions/20/sections/4/blocks/0/paragraphs/0": "Example copied from the PostgreSQL 20devel manual; it was not executed for this collection.", "/versions/20/sections/4/blocks/0/paragraphs/1": "Now, let's make the condition more restrictive:", "/versions/20/sections/4/blocks/1/paragraphs/0": "Example copied from the PostgreSQL 20devel manual; it was not executed for this collection.", "/versions/20/sections/4/blocks/1/paragraphs/1": "Now let's add another condition to the WHERE clause:"}, "fallback_fields": [], "source_language": "en", "original_snapshot_sha256": "b370d06a661d1d8aff654afd981f34e64f1bcba790881363a0e32eacfa59d215"}, "evidence_kind": "source and documentation", "explain_names": ["Bitmap Heap Scan"], "partial_modes": [], "comparison_data": {"node_tag": "T_BitmapHeapScan", "strategies": [], "text_names": ["Bitmap Heap Scan"], "initializer": "ExecInitBitmapHeapScan", "partial_modes": [], "memory_mechanism": "unclassified", "parallel_callbacks": ["ExecBitmapHeapEstimate", "ExecBitmapHeapInitializeDSM", "ExecBitmapHeapInitializeWorker", "ExecBitmapHeapInstrumentEstimate", "ExecBitmapHeapReInitializeDSM", "ExecBitmapHeapRetrieveInstrumentation"]}, "comparison_hash": "fb953ace39dab4979a295ec6cf4aaf7c5d9906527002f98d1ce062efc03be83b", "explain_prefixes": ["Parallel", "Async"], "runtime_verified": false, "source_inventory": {"explain": "src/backend/commands/explain.c", "executor": "src/backend/executor/execProcnode.c", "implementation": "src/backend/executor/nodeBitmapHeapscan.c"}, "parallel_callbacks": ["ExecBitmapHeapEstimate", "ExecBitmapHeapInitializeDSM", "ExecBitmapHeapInitializeWorker", "ExecBitmapHeapInstrumentEstimate", "ExecBitmapHeapReInitializeDSM", "ExecBitmapHeapRetrieveInstrumentation"]}}}, "snapshot": {"facts": [{"label": "\u6838\u5fc3\u8282\u70b9\u6807\u7b7e", "value": "T_BitmapHeapScan"}, {"label": "\u7ed3\u6784\u5316 EXPLAIN \u8282\u70b9\u7c7b\u578b", "value": "Bitmap Heap Scan"}, {"label": "\u8f93\u5165", "value": "\u5143\u7ec4\u4f4d\u7f6e\u4f4d\u56fe\u53ca\u5173\u7cfb"}, {"label": "\u8f93\u51fa", "value": "\u6ee1\u8db3\u6761\u4ef6\u7684\u5806\u5143\u7ec4"}, {"label": "\u6267\u884c\u5668\u521d\u59cb\u5316\u51fd\u6570", "value": "ExecInitBitmapHeapScan"}, {"label": "\u5185\u5b58\u673a\u5236", "value": "unclassified"}], "memory": {"evidence": [{"url": "https://ftp.postgresql.org/pub/source/v18.6/postgresql-18.6.tar.bz2", "path": "src/backend/executor/nodeBitmapHeapscan.c", "label": "src/backend/executor/nodeBitmapHeapscan.c", "sha256": "0c49bbf89f6614af08dbcea2a1776abc79db23e523e8c1fc852a42215f202206", "archive_sha256": "555610c24d53e4316da5b7d3fc25c279d96856d5e0e23ee308c328c5fa881d9f"}], "mechanism": "unclassified", "description": "\u672c\u6b21\u62bd\u53d6\u4e0d\u4e3a\u6b64\u8282\u70b9\u8bbe\u5b9a\u7edf\u4e00\u7684\u5185\u5b58\u4e0a\u9650\u6216\u843d\u76d8\u7b56\u7565\u3002\u8bf7\u67e5\u770b\u540c\u4e00\u6784\u5efa\u7684\u5b9e\u73b0\u3001\u76f8\u5173\u8868\u8fbe\u5f0f\u6216\u63d0\u4f9b\u65b9\u3002", "source_notes": ["If we are using lossy info, we have to recheck the qual conditions at every tuple."]}, "tables": [{"key": "explain-labels", "rows": [{"label": "Bitmap Heap Scan", "identity": "Bitmap Heap Scan"}], "title": "\u672c\u6784\u5efa\u4e2d\u7684 EXPLAIN \u6807\u7b7e", "columns": [{"key": "label", "label": "\u6587\u672c\u683c\u5f0f\u6807\u7b7e"}, {"key": "identity", "label": "\u7ed3\u6784\u5316\u8282\u70b9\u6807\u8bc6"}]}], "related": [{"url": "/wiki/sql/explain/?v=18", "label": "EXPLAIN"}, {"url": "/docs/18/using-explain.html", "label": "\u4f7f\u7528 EXPLAIN"}, {"url": "/docs/18/parallel-plans.html", "label": "\u5e76\u884c\u8ba1\u5212"}, {"url": "/wiki/guc/enable_bitmapscan/?v=18", "label": "enable_bitmapscan"}], "release": {"ref": "PostgreSQL 18.6 source archive", "label": "18.6", "major": "18", "channel": "stable", "revision": "555610c24d53e4316da5b7d3fc25c279d96856d5e0e23ee308c328c5fa881d9f", "source_url": "https://ftp.postgresql.org/pub/source/v18.6/postgresql-18.6.tar.bz2", "source_snapshot_utc": ""}, "sources": [{"url": "https://ftp.postgresql.org/pub/source/v18.6/postgresql-18.6.tar.bz2", "line": 1453, "path": "src/backend/commands/explain.c", "label": "src/backend/commands/explain.c:1453", "sha256": "34c86d6070224a0e981efef51f79101d6d505e5874f1684ace183034bab14bb4", "archive_sha256": "555610c24d53e4316da5b7d3fc25c279d96856d5e0e23ee308c328c5fa881d9f"}, {"url": "https://ftp.postgresql.org/pub/source/v18.6/postgresql-18.6.tar.bz2", "line": 234, "path": "src/backend/executor/execProcnode.c", "label": "src/backend/executor/execProcnode.c:234", "sha256": "f8a06a3f539077249b20664b2812433db6d7bd12b2c0ca633525db43d06f112a", "archive_sha256": "555610c24d53e4316da5b7d3fc25c279d96856d5e0e23ee308c328c5fa881d9f"}, {"url": "https://ftp.postgresql.org/pub/source/v18.6/postgresql-18.6.tar.bz2", "path": "src/backend/executor/nodeBitmapHeapscan.c", "label": "src/backend/executor/nodeBitmapHeapscan.c", "sha256": "0c49bbf89f6614af08dbcea2a1776abc79db23e523e8c1fc852a42215f202206", "archive_sha256": "555610c24d53e4316da5b7d3fc25c279d96856d5e0e23ee308c328c5fa881d9f"}, {"url": "https://ftp.postgresql.org/pub/source/v18.6/postgresql-18.6.tar.bz2", "path": "src/include/nodes/plannodes.h", "label": "src/include/nodes/plannodes.h", "sha256": "52422b327a8049fbbb20d8b96008a0fc0a6fafa60f7eff3c695d5b2e83830120", "archive_sha256": "555610c24d53e4316da5b7d3fc25c279d96856d5e0e23ee308c328c5fa881d9f"}, {"url": "https://pg.center/docs/18/parallel-plans.html#PARALLEL-SCANS", "path": "parallel-plans.html", "label": "PostgreSQL 18.6 \u00b7 parallel-plans", "sha256": "62207d207bead82b01b59dc119c4f95856f08655cc11d4699a05a40867ed2070", "language": "en", "original_url": "/docs/18/parallel-plans.html#PARALLEL-SCANS"}, {"url": "https://pg.center/docs/18/using-explain.html#USING-EXPLAIN-BASICS", "path": "using-explain.html", "label": "PostgreSQL 18.6 \u00b7 using-explain", "sha256": "60040c30180093418a0affe56dd27dff9df2504b705b38039589e458bf5c31ed", "language": "en", "original_url": "/docs/18/using-explain.html#USING-EXPLAIN-BASICS"}], "node_tag": "T_BitmapHeapScan", "sections": [{"title": "EXPLAIN \u540d\u79f0\u4e0e\u5c5e\u6027", "paragraphs": ["\u7ed3\u6784\u5316\u683c\u5f0f\u4f7f\u7528\u4e0a\u8ff0 Node Type\u3002\u6587\u672c\u683c\u5f0f\u540d\u79f0\u8fd8\u53ef\u80fd\u5305\u542b\u64cd\u4f5c\u3001\u7b56\u7565\u3001\u8fde\u63a5\u7c7b\u578b\u3001\u626b\u63cf\u65b9\u5411\u6216\u805a\u5408\u9636\u6bb5\u5c5e\u6027\u3002", "\u6b64\u6e90\u7801\u8bb0\u5f55\u7684\u6587\u672c\u540d\u79f0\uff1aBitmap Heap Scan.", "\u5e76\u884c\u611f\u77e5\u4e0e\u5e76\u884c\u5b89\u5168\u662f\u4e0d\u540c\u7684\u8ba1\u5212\u5c5e\u6027\u3002\u5728\u5e76\u884c\u5de5\u4f5c\u8fdb\u7a0b\u5185\u8fd0\u884c\u7684\u8282\u70b9\u4e0d\u4e00\u5b9a\u662f\u5e76\u884c\u611f\u77e5\u8282\u70b9\u3002"]}, {"title": "\u5185\u5b58\u4e0e\u4e34\u65f6\u5b58\u50a8", "paragraphs": ["\u672c\u6b21\u62bd\u53d6\u4e0d\u4e3a\u6b64\u8282\u70b9\u8bbe\u5b9a\u7edf\u4e00\u7684\u5185\u5b58\u4e0a\u9650\u6216\u843d\u76d8\u7b56\u7565\u3002\u8bf7\u67e5\u770b\u540c\u4e00\u6784\u5efa\u7684\u5b9e\u73b0\u3001\u76f8\u5173\u8868\u8fbe\u5f0f\u6216\u63d0\u4f9b\u65b9\u3002", "\u4f7f\u7528\u6709\u635f\u4fe1\u606f\u65f6\uff0c\u5fc5\u987b\u5bf9\u6bcf\u4e2a\u5143\u7ec4\u91cd\u65b0\u68c0\u67e5\u6761\u4ef6\u3002"]}, {"title": "\u5e76\u884c\u6267\u884c\u4e0e\u8fd0\u884c\u4fe1\u606f\u91c7\u96c6", "paragraphs": ["\u4ee5\u4e0b\u6e90\u7801\u56de\u8c03\u53ef\u4ee5\u534f\u8c03\u6267\u884c\u6216\u6536\u96c6\u5de5\u4f5c\u8fdb\u7a0b\u7684\u6d4b\u91cf\u6570\u636e\u3002\u56de\u8c03\u5b58\u5728\u4e0d\u4ee3\u8868\u8be5\u8282\u70b9\u666e\u904d\u652f\u6301\u5171\u4eab\u5e76\u884c\u626b\u63cf\u6216\u5171\u4eab\u72b6\u6001\u3002", "\u6b64\u6784\u5efa\u7684\u56de\u8c03\uff1aExecBitmapHeapEstimate, ExecBitmapHeapInitializeDSM, ExecBitmapHeapInitializeWorker, ExecBitmapHeapReInitializeDSM, ExecBitmapHeapRetrieveInstrumentation."]}, {"title": "\u540c\u7248\u672c\u624b\u518c\u8bf4\u660e", "paragraphs": ["\u5728 \u5e76\u884c\u4f4d\u56fe\u5806\u626b\u63cf \u4e2d\uff0c\u4f1a\u9009\u62e9\u4e00\u4e2a\u8fdb\u7a0b\u4f5c\u4e3a\u9886\u5bfc\u8005\u3002\u8be5\u8fdb\u7a0b\u6267\u884c\u4e00\u4e2a\u6216\u591a\u4e2a\u7d22\u5f15\u626b\u63cf\uff0c\u5e76\u6784\u5efa\u4e00\u4e2a\u4f4d\u56fe\uff0c\u4ee5\u6307\u793a\u9700\u8981\u8bbf\u95ee\u54ea\u4e9b\u8868\u5757\u3002\u7136\u540e\u8fd9\u4e9b\u5757\u4f1a\u50cf\u5e76\u884c\u987a\u5e8f\u626b\u63cf\u90a3\u6837\u5206\u914d\u7ed9\u534f\u4f5c\u8fdb\u7a0b\u3002\u6362\u53e5\u8bdd\u8bf4\uff0c\u5806\u626b\u63cf\u662f\u5e76\u884c\u6267\u884c\u7684\uff0c\u4f46\u5e95\u5c42\u7d22\u5f15\u626b\u63cf\u4e0d\u662f\u3002"]}, {"title": "\u672c\u7248\u624b\u518c\u4e2d\u7684\u793a\u4f8b", "blocks": [{"code": "EXPLAIN SELECT * FROM tenk1 WHERE unique1 < 100;\n\n                                  QUERY PLAN\n------------------------------------------------------------------------------\n Bitmap Heap Scan on tenk1  (cost=5.06..224.98 rows=100 width=244)\n   Recheck Cond: (unique1 < 100)\n   ->  Bitmap Index Scan on tenk1_unique1  (cost=0.00..5.04 rows=100 width=0)\n         Index Cond: (unique1 < 100)", "source": {"url": "/docs/18/using-explain.html#USING-EXPLAIN-BASICS", "path": "using-explain.html", "label": "PostgreSQL 18.6 \u00b7 using-explain", "sha256": "60040c30180093418a0affe56dd27dff9df2504b705b38039589e458bf5c31ed"}, "paragraphs": ["\u793a\u4f8b\u6458\u81ea PostgreSQL 18.6 \u624b\u518c\uff1b\u672c\u767e\u79d1\u672a\u5b9e\u9645\u6267\u884c\u6b64\u793a\u4f8b\u3002", "\u73b0\u5728\u8fdb\u4e00\u6b65\u6536\u7d27\u6761\u4ef6\uff1a"]}, {"code": "EXPLAIN SELECT * FROM tenk1 WHERE unique1 < 100 AND stringu1 = 'xxx';\n\n                                  QUERY PLAN\n------------------------------------------------------------------------------\n Bitmap Heap Scan on tenk1  (cost=5.04..225.20 rows=1 width=244)\n   Recheck Cond: (unique1 < 100)\n   Filter: (stringu1 = 'xxx'::name)\n   ->  Bitmap Index Scan on tenk1_unique1  (cost=0.00..5.04 rows=100 width=0)\n         Index Cond: (unique1 < 100)", "source": {"url": "/docs/18/using-explain.html#USING-EXPLAIN-BASICS", "path": "using-explain.html", "label": "PostgreSQL 18.6 \u00b7 using-explain", "sha256": "60040c30180093418a0affe56dd27dff9df2504b705b38039589e458bf5c31ed"}, "paragraphs": ["\u793a\u4f8b\u6458\u81ea PostgreSQL 18.6 \u624b\u518c\uff1b\u672c\u767e\u79d1\u672a\u5b9e\u9645\u6267\u884c\u6b64\u793a\u4f8b\u3002", "\u73b0\u5728\u5411 WHERE \u5b50\u53e5\u518d\u6dfb\u52a0\u4e00\u4e2a\u6761\u4ef6\uff1a"]}]}, {"title": "\u6267\u884c\u5668\u5b9e\u73b0\u8bf4\u660e", "paragraphs": ["nodeBitmapHeapscan.c\uff1a\u652f\u6301\u5173\u7cfb\u4f4d\u56fe\u626b\u63cf\u7684\u4f8b\u7a0b\u3002", "\u6ce8\u610f\uff1a\u6b64\u8ba1\u5212\u7c7b\u578b\u5fc5\u987b\u4ec5\u4f7f\u7528\u7b26\u5408 MVCC \u7684\u5feb\u7167\uff0c\u5373\u666e\u901a\u5feb\u7167\uff0c\u800c\u975e SnapshotAny \u6216\u5176\u4ed6\u7279\u6b8a\u5feb\u7167\u3002\u7d22\u5f15\u626b\u63cf\u4e0e\u5806\u626b\u63cf\u76f8\u4e92\u5206\u79bb\uff0c\u8bbf\u95ee\u67d0\u4e2a\u5806 TID \u65f6\uff0c\u65e0\u6cd5\u4fdd\u8bc1\u4fc3\u6210\u8be5\u8bbf\u95ee\u7684\u7d22\u5f15\u5143\u7ec4\u4ecd\u7136\u5b58\u5728\u3002\u5806\u5143\u7ec4\u53ef\u80fd\u5df2\u7ecf\u6d88\u5931\uff08heap_fetch \u80fd\u5904\u7406\u8fd9\u79cd\u60c5\u51b5\uff09\uff0c\u66f4\u4e25\u91cd\u7684\u662f\uff0c\u5176\u4f4d\u7f6e\u53ef\u80fd\u5df2\u88ab\u66f4\u65b0\u7684\u5143\u7ec4\u590d\u7528\u3002\u4f7f\u7528 MVCC \u5feb\u7167\u65f6\uff0c\u65b0\u5143\u7ec4\u5fc5\u5b9a\u65e0\u6cd5\u901a\u8fc7\u65f6\u95f4\u53ef\u89c1\u6027\u68c0\u67e5\uff0c\u56e0\u6b64\u4e0d\u4f1a\u9519\u8bef\u8fd4\u56de\uff1b\u4f7f\u7528\u5176\u4ed6\u5feb\u7167\u5219\u53ef\u80fd\u8fd4\u56de\u4e0d\u7b26\u5408\u7d22\u5f15\u6761\u4ef6\u7684\u5143\u7ec4\u3002", "\u6267\u884c\u5e95\u5c42\u7d22\u5f15\u626b\u63cf\u5e76\u6784\u5efa\u4f4d\u56fe\uff0c\u8bbe\u7f6e\u5e76\u884c\u5de5\u4f5c\u8fdb\u7a0b\u8fed\u4ee3\u4f4d\u56fe\u6240\u9700\u7684\u5e76\u884c\u72b6\u6001\uff0c\u4ee5\u53ca\u5e95\u5c42\u8868\u626b\u63cf\u63cf\u8ff0\u7b26\u3002", "\u9886\u5bfc\u8fdb\u7a0b\u4f1a\u7acb\u5373\u9000\u51fa\u8be5\u51fd\u6570\uff0c\u5176\u4ed6\u8fdb\u7a0b\u5219\u963b\u585e\uff0c\u76f4\u5230\u9886\u5bfc\u8fdb\u7a0b\u586b\u5145 TBM \u5e76\u5524\u9192\u5b83\u4eec\u3002", "\u51c6\u5907\u904d\u5386 TBM\uff0c\u8fd4\u56de\u8fed\u4ee3\u5668\u72b6\u6001\u7684 dsa_pointer\uff0c\u4f9b\u591a\u4e2a\u8fdb\u7a0b\u5171\u540c\u904d\u5386\u3002"]}, {"code": "case T_BitmapHeapScan:\n\t\t\tpname = sname = \"Bitmap Heap Scan\";\n\t\t\tbreak;", "title": "\u6838\u5fc3\u6e90\u7801\u4e2d\u7684 EXPLAIN \u6807\u8bc6"}], "strategies": [], "description": ["\u8bbf\u95ee\u4f4d\u56fe\u9009\u4e2d\u7684\u5806\u9875\uff0c\u5e76\u6267\u884c\u5fc5\u8981\u7684\u91cd\u68c0\u3002"], "localization": {"status": "complete", "sources": [{"url": "/docs/18/parallel-plans.html", "method": "same-major semantic node", "sha256": "7fa104623c0b4cd22acf0929e40518fbed8fe368af3e3b124cf693bd7ab69f0c", "language": "zh", "matched_nodes": ["#PARALLEL-PLANS/div[3]/div[2]/ul[0]/li[1]"]}], "language": "zh", "original_text": {"/versions/18/description/0": "Visits heap pages selected by a bitmap and performs required rechecks.", "/versions/18/facts/0/label": "Core node tag", "/versions/18/facts/1/label": "Structured EXPLAIN Node Type", "/versions/18/facts/2/label": "Inputs", "/versions/18/facts/2/value": "A tuple-location bitmap and relation", "/versions/18/facts/3/label": "Output", "/versions/18/facts/3/value": "Qualified heap tuples", "/versions/18/facts/4/label": "Executor initializer", "/versions/18/facts/5/label": "Memory mechanism", "/versions/18/tables/0/title": "EXPLAIN labels in this source build", "/versions/18/related/1/label": "Using EXPLAIN", "/versions/18/related/2/label": "Parallel plans", "/versions/18/sections/0/title": "EXPLAIN names and attributes", "/versions/18/sections/1/title": "Memory and temporary storage", "/versions/18/sections/2/title": "Parallel execution and instrumentation", "/versions/18/sections/3/title": "Same-version manual discussion", "/versions/18/sections/4/title": "Examples from this manual build", "/versions/18/sections/5/title": "Executor implementation notes", "/versions/18/sections/6/title": "EXPLAIN identity in core source", "/versions/18/memory/description": "This extraction does not assign a universal memory limit or spill policy to this node. Inspect the same-build implementation and its expressions or provider.", "/versions/18/sections/0/paragraphs/0": "Structured formats use the Node Type above. Text-format spellings can also include operation, strategy, join type, scan direction or aggregation-stage attributes.", "/versions/18/sections/0/paragraphs/1": "Text names recorded by this source: Bitmap Heap Scan.", "/versions/18/sections/0/paragraphs/2": "Parallel-aware and parallel-safe are different plan properties. A node running inside a parallel worker is not necessarily a parallel-aware node.", "/versions/18/sections/1/paragraphs/0": "This extraction does not assign a universal memory limit or spill policy to this node. Inspect the same-build implementation and its expressions or provider.", "/versions/18/sections/1/paragraphs/1": "If we are using lossy info, we have to recheck the qual conditions at every tuple.", "/versions/18/sections/2/paragraphs/0": "The source callbacks below can coordinate execution or collect worker instrumentation. Their presence is not a blanket claim that this node supports a shared parallel scan or shared state.", "/versions/18/sections/2/paragraphs/1": "Callbacks in this build: ExecBitmapHeapEstimate, ExecBitmapHeapInitializeDSM, ExecBitmapHeapInitializeWorker, ExecBitmapHeapReInitializeDSM, ExecBitmapHeapRetrieveInstrumentation.", "/versions/18/sections/3/paragraphs/0": "In a parallel bitmap heap scan , one process is chosen as the leader. That process performs a scan of one or more indexes and builds a bitmap indicating which table blocks need to be visited. These blocks are then divided among the cooperating processes as in a parallel sequential scan. In other words, the heap scan is performed in parallel, but the underlying index scan is not.", "/versions/18/sections/5/paragraphs/0": "nodeBitmapHeapscan.c Routines to support bitmapped scans of relations", "/versions/18/sections/5/paragraphs/1": "NOTE: it is critical that this plan type only be used with MVCC-compliant snapshots (ie, regular snapshots, not SnapshotAny or one of the other special snapshots). The reason is that since index and heap scans are decoupled, there can be no assurance that the index tuple prompting a visit to a particular heap TID still exists when the visit is made. Therefore the tuple might not exist anymore either (which is OK because heap_fetch will cope) --- but worse, the tuple slot could have been re-used for a newer tuple. With an MVCC snapshot the newer tuple is certain to fail the time qual and so it will not be mistakenly returned, but with anything else we might return a tuple that doesn't meet the required index qual conditions.", "/versions/18/sections/5/paragraphs/2": "Do the underlying index scan, build the bitmap, set up the parallel state needed for parallel workers to iterate through the bitmap, and set up the underlying table scan descriptor.", "/versions/18/sections/5/paragraphs/3": "The leader will immediately come out of the function, but others will be blocked until leader populates the TBM and wakes them up.", "/versions/18/sections/5/paragraphs/4": "Prepare to iterate over the TBM. This will return the dsa_pointer of the iterator state which will be used by multiple processes to iterate jointly.", "/versions/18/tables/0/columns/0/label": "Text-format label", "/versions/18/tables/0/columns/1/label": "Structured node identity", "/versions/18/sections/4/blocks/0/paragraphs/0": "Example copied from the PostgreSQL 18.6 manual; it was not executed for this collection.", "/versions/18/sections/4/blocks/0/paragraphs/1": "Now, let's make the condition more restrictive:", "/versions/18/sections/4/blocks/1/paragraphs/0": "Example copied from the PostgreSQL 18.6 manual; it was not executed for this collection.", "/versions/18/sections/4/blocks/1/paragraphs/1": "Now let's add another condition to the WHERE clause:"}, "fallback_fields": [], "source_language": "en", "original_snapshot_sha256": "768eb79c3d56e6e5a02fce88382526787e04bb9ad1c109126bdaa96bcb59983c"}, "evidence_kind": "source and documentation", "explain_names": ["Bitmap Heap Scan"], "partial_modes": [], "comparison_data": {"node_tag": "T_BitmapHeapScan", "strategies": [], "text_names": ["Bitmap Heap Scan"], "initializer": "ExecInitBitmapHeapScan", "partial_modes": [], "memory_mechanism": "unclassified", "parallel_callbacks": ["ExecBitmapHeapEstimate", "ExecBitmapHeapInitializeDSM", "ExecBitmapHeapInitializeWorker", "ExecBitmapHeapReInitializeDSM", "ExecBitmapHeapRetrieveInstrumentation"]}, "comparison_hash": "f7ee070f7f36c2ed7f3e237eb0933d70972eaf9860d38070438efebcf8ec6e71", "explain_prefixes": ["Parallel", "Async"], "runtime_verified": false, "source_inventory": {"explain": "src/backend/commands/explain.c", "executor": "src/backend/executor/execProcnode.c", "implementation": "src/backend/executor/nodeBitmapHeapscan.c"}, "parallel_callbacks": ["ExecBitmapHeapEstimate", "ExecBitmapHeapInitializeDSM", "ExecBitmapHeapInitializeWorker", "ExecBitmapHeapReInitializeDSM", "ExecBitmapHeapRetrieveInstrumentation"]}, "comparison": {"left": "18", "right": "19", "status": "changed", "diff": "--- PostgreSQL 18\n+++ PostgreSQL 19\n@@ -6,6 +6,7 @@\n     \"ExecBitmapHeapEstimate\",\n     \"ExecBitmapHeapInitializeDSM\",\n     \"ExecBitmapHeapInitializeWorker\",\n+    \"ExecBitmapHeapInstrumentEstimate\",\n     \"ExecBitmapHeapReInitializeDSM\",\n     \"ExecBitmapHeapRetrieveInstrumentation\"\n   ],"}}