{"kind": "tableam", "major": "18", "item": {"slug": "heap", "name": "heap", "name_zh": "Core table AM", "category": "\u6838\u5fc3\u8868\u8bbf\u95ee\u65b9\u6cd5", "summary": "\u5185\u7f6e heap \u8868\u8bbf\u95ee\u65b9\u6cd5\u5c06\u5143\u7ec4\u5b58\u50a8\u3001\u53ef\u89c1\u6027\u3001\u626b\u63cf\u3001\u7d22\u5f15\u83b7\u53d6\u548c\u7ef4\u62a4\u64cd\u4f5c\u96c6\u6210\u5230 PostgreSQL \u4e2d\u3002", "aliases": [], "content_hash": "c6b369ff5323e7e5ba8bf59a7548f7671195b8adea250d3bf858246570d36805", "versions": {"12": {"facts": [{"label": "\u63a5\u53e3\u7c7b\u522b", "value": "\u8868\u8bbf\u95ee\u65b9\u6cd5"}, {"label": "\u5904\u7406\u51fd\u6570\u6216\u4f8b\u7a0b", "value": "heapam_methods"}, {"label": "\u8bb0\u5f55\u7684\u56de\u8c03", "value": "41"}], "tables": [{"key": "callbacks", "rows": [{"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u5143\u7ec4\u69fd", "callback": "slot_callbacks", "implementation": "heapam_slot_callbacks"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u5f00\u59cb\u626b\u63cf", "callback": "scan_begin", "implementation": "heap_beginscan"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u521d\u59cb\u5316\u5e76\u884c\u626b\u63cf", "callback": "parallelscan_initialize", "implementation": "table_block_parallelscan_initialize"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u5f00\u59cb\u7d22\u5f15\u67e5\u627e", "callback": "index_fetch_begin", "implementation": "heapam_index_fetch_begin"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u83b7\u53d6\u6307\u5b9a\u5143\u7ec4", "callback": "index_fetch_tuple", "implementation": "heapam_index_fetch_tuple"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u63d2\u5165\u5143\u7ec4", "callback": "tuple_insert", "implementation": "heapam_tuple_insert"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u66f4\u65b0\u5143\u7ec4", "callback": "tuple_update", "implementation": "heapam_tuple_update"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u5220\u9664\u5143\u7ec4", "callback": "tuple_delete", "implementation": "heapam_tuple_delete"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u5bf9\u5173\u7cfb\u6267\u884c VACUUM", "callback": "relation_vacuum", "implementation": "heap_vacuum_rel"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u5206\u6790\u6570\u636e\u5757", "callback": "scan_analyze_next_block", "implementation": "heapam_scan_analyze_next_block"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "TOAST \u5224\u5b9a", "callback": "relation_needs_toast_table", "implementation": "heapam_relation_needs_toast_table"}], "title": "\u6ce8\u518c\u7684\u63a5\u53e3\u5904\u7406\u51fd\u6570", "columns": [{"key": "feature", "label": "\u63a5\u53e3\u64cd\u4f5c"}, {"key": "state", "label": "\u6e90\u7801\u89c2\u5bdf"}, {"key": "callback", "label": "\u56de\u8c03"}, {"key": "implementation", "label": "\u5b9e\u73b0"}]}], "related": [{"url": "/wiki/catalog/pg_am/?v=12", "label": "\u7cfb\u7edf\u76ee\u5f55 pg_am"}, {"url": "/wiki/guc/default_table_access_method/?v=12", "label": "default_table_access_method"}, {"url": "/wiki/indexam/?v=12", "label": "\u7d22\u5f15\u8bbf\u95ee\u65b9\u6cd5"}], "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://pg.center/docs/12/tableam.html", "path": "tableam.html", "label": "PostgreSQL 12 English manual", "sha256": "4a2f5484c66207255d238dc6a312b1fecf991782c97cbe20e2522b8e33eaf341", "language": "en", "original_url": "/docs/12/tableam.html"}, {"url": "https://ftp.postgresql.org/pub/source/v12.22/postgresql-12.22.tar.bz2", "line": 2659, "path": "src/backend/access/heap/heapam_handler.c", "label": "src/backend/access/heap/heapam_handler.c:2659", "sha256": "30b90707d75ec73d6b8aa8d939d372120d59e4e2cb470e77e51164af45b41138", "archive_sha256": "8df3c0474782589d3c6f374b5133b1bd14d168086edbc13c6e72e67dd4527a3b"}, {"url": "https://pg.center/docs/12/mvcc-intro.html", "path": "mvcc-intro.html", "label": "PostgreSQL 12 English manual", "sha256": "519cbfd791ca57455e33efd709a1fc8ae8164a3fc3efef28613a95aeed398d8e", "language": "en", "original_url": "/docs/12/mvcc-intro.html"}, {"url": "https://pg.center/docs/12/sql-createtable.html", "path": "sql-createtable.html", "label": "PostgreSQL 12 English manual", "sha256": "7210cf3ff82ffa37ef81ebbbc252e4807649dcb86050eaa3ea5fcba40a768656", "language": "en", "original_url": "/docs/12/sql-createtable.html"}, {"url": "https://pg.center/docs/12/routine-vacuuming.html", "path": "routine-vacuuming.html", "label": "PostgreSQL 12 English manual", "sha256": "86a0c5de06e0271f0c1cc357c7060578b66260bf785fb78d02abd36afb5ea1f3", "language": "en", "original_url": "/docs/12/routine-vacuuming.html"}, {"url": "https://pg.center/docs/12/catalog-pg-am.html", "path": "catalog-pg-am.html", "label": "PostgreSQL 12 English manual", "sha256": "93b1cac9d6535f34e389d3ba8488f21d9c5a7812ffba495b3d838b58548b547a", "language": "en", "original_url": "/docs/12/catalog-pg-am.html"}], "sections": [{"title": "\u63a5\u53e3\u4e0e\u80fd\u529b\u8fb9\u754c", "paragraphs": ["\u77e9\u9635\u8bb0\u5f55\u6b64\u6e90\u7801\u6784\u5efa\u5b9e\u9645\u6ce8\u518c\u7684\u56de\u8c03\u3002\u6ce8\u518c\u8868\u660e\u5b9e\u73b0\u4e86\u76f8\u5e94\u63a5\u53e3\u94a9\u5b50\uff1b\u64cd\u4f5c\u662f\u5426\u5141\u8bb8\u8fd8\u53d6\u51b3\u4e8e\u9009\u9879\u3001\u67e5\u8be2\u5f62\u5f0f\u3001\u6743\u9650\u548c\u63d0\u4f9b\u65b9\u89c4\u5219\u3002", "\u4e0b\u65b9\u4fdd\u7559\u540c\u7248\u672c\u5b8c\u6574\u624b\u518c\uff0c\u5305\u62ec\u914d\u7f6e\u3001\u7ea6\u675f\u548c\u793a\u4f8b\u3002\u4e0d\u58f0\u79f0\u5df2\u8fdb\u884c\u8fd0\u884c\u65f6\u80fd\u529b\u6d4b\u8bd5\u3002"]}, {"title": "\u5806\u5b58\u50a8\u3001\u53ef\u89c1\u6027\u4e0e WAL", "paragraphs": ["\u6b64\u6e05\u5355\u4ece PostgreSQL 12 \u5f15\u5165\u7684 Table AM \u63a5\u53e3\u5f00\u59cb\u3002\u4e0d\u4f1a\u5c06\u66f4\u65e9\u7248\u672c\u7684 PostgreSQL \u5806\u5b58\u50a8\u91cd\u65b0\u6807\u4e3a Table AM \u5b9e\u73b0\u3002", "\u5806\u53ef\u89c1\u6027\u9075\u5faa PostgreSQL \u5feb\u7167\u3002WAL \u548c\u5d29\u6e83\u6062\u590d\u884c\u4e3a\u53d6\u51b3\u4e8e\u5173\u7cfb\u7684\u6301\u4e45\u6027\uff1b\u4e34\u65f6\u8868\u3001\u65e0\u65e5\u5fd7\u8868\u4e0e\u6c38\u4e45\u8868\u4e0d\u540c\u3002\u7d22\u5f15\u8bbf\u95ee\u65b9\u6cd5\u4e0e\u8868\u5b58\u50a8\u63a5\u53e3\u5206\u5f00\u3002"]}, {"code": "{\n\t.type = T_TableAmRoutine,\n\n\t.slot_callbacks = heapam_slot_callbacks,\n\n\t.scan_begin = heap_beginscan,\n\t.scan_end = heap_endscan,\n\t.scan_rescan = heap_rescan,\n\t.scan_getnextslot = heap_getnextslot,\n\n\t.parallelscan_estimate = table_block_parallelscan_estimate,\n\t.parallelscan_initialize = table_block_parallelscan_initialize,\n\t.parallelscan_reinitialize = table_block_parallelscan_reinitialize,\n\n\t.index_fetch_begin = heapam_index_fetch_begin,\n\t.index_fetch_reset = heapam_index_fetch_reset,\n\t.index_fetch_end = heapam_index_fetch_end,\n\t.index_fetch_tuple = heapam_index_fetch_tuple,\n\n\t.tuple_insert = heapam_tuple_insert,\n\t.tuple_insert_speculative = heapam_tuple_insert_speculative,\n\t.tuple_complete_speculative = heapam_tuple_complete_speculative,\n\t.multi_insert = heap_multi_insert,\n\t.tuple_delete = heapam_tuple_delete,\n\t.tuple_update = heapam_tuple_update,\n\t.tuple_lock = heapam_tuple_lock,\n\t.finish_bulk_insert = heapam_finish_bulk_insert,\n\n\t.tuple_fetch_row_version = heapam_fetch_row_version,\n\t.tuple_get_latest_tid = heap_get_latest_tid,\n\t.tuple_tid_valid = heapam_tuple_tid_valid,\n\t.tuple_satisfies_snapshot = heapam_tuple_satisfies_snapshot,\n\t.compute_xid_horizon_for_tuples = heap_compute_xid_horizon_for_tuples,\n\n\t.relation_set_new_filenode = heapam_relation_set_new_filenode,\n\t.relation_nontransactional_truncate = heapam_relation_nontransactional_truncate,\n\t.relation_copy_data = heapam_relation_copy_data,\n\t.relation_copy_for_cluster = heapam_relation_copy_for_cluster,\n\t.relation_vacuum = heap_vacuum_rel,\n\t.scan_analyze_next_block = heapam_scan_analyze_next_block,\n\t.scan_analyze_next_tuple = heapam_scan_analyze_next_tuple,\n\t.index_build_range_scan = heapam_index_build_range_scan,\n\t.index_validate_scan = heapam_index_validate_scan,\n\n\t.relation_size = heapam_relation_size,\n\t.relation_needs_toast_table = heapam_relation_needs_toast_table,\n\n\t.relation_estimate_size = heapam_estimate_rel_size,\n\n\t.scan_bitmap_next_block = heapam_scan_bitmap_next_block,\n\t.scan_bitmap_next_tuple = heapam_scan_bitmap_next_tuple,\n\t.scan_sample_next_block = heapam_scan_sample_next_block,\n\t.scan_sample_next_tuple = heapam_scan_sample_next_tuple\n}", "title": "\u6838\u5fc3\u6e90\u7801\u4e2d\u6ce8\u518c\u7684\u5b9e\u73b0"}], "callbacks": {"scan_end": "heap_endscan", "scan_begin": "heap_beginscan", "tuple_lock": "heapam_tuple_lock", "scan_rescan": "heap_rescan", "multi_insert": "heap_multi_insert", "tuple_delete": "heapam_tuple_delete", "tuple_insert": "heapam_tuple_insert", "tuple_update": "heapam_tuple_update", "relation_size": "heapam_relation_size", "slot_callbacks": "heapam_slot_callbacks", "index_fetch_end": "heapam_index_fetch_end", "relation_vacuum": "heap_vacuum_rel", "tuple_tid_valid": "heapam_tuple_tid_valid", "scan_getnextslot": "heap_getnextslot", "index_fetch_begin": "heapam_index_fetch_begin", "index_fetch_reset": "heapam_index_fetch_reset", "index_fetch_tuple": "heapam_index_fetch_tuple", "finish_bulk_insert": "heapam_finish_bulk_insert", "relation_copy_data": "heapam_relation_copy_data", "index_validate_scan": "heapam_index_validate_scan", "tuple_get_latest_tid": "heap_get_latest_tid", "parallelscan_estimate": "table_block_parallelscan_estimate", "index_build_range_scan": "heapam_index_build_range_scan", "relation_estimate_size": "heapam_estimate_rel_size", "scan_bitmap_next_block": "heapam_scan_bitmap_next_block", "scan_bitmap_next_tuple": "heapam_scan_bitmap_next_tuple", "scan_sample_next_block": "heapam_scan_sample_next_block", "scan_sample_next_tuple": "heapam_scan_sample_next_tuple", "parallelscan_initialize": "table_block_parallelscan_initialize", "scan_analyze_next_block": "heapam_scan_analyze_next_block", "scan_analyze_next_tuple": "heapam_scan_analyze_next_tuple", "tuple_fetch_row_version": "heapam_fetch_row_version", "tuple_insert_speculative": "heapam_tuple_insert_speculative", "tuple_satisfies_snapshot": "heapam_tuple_satisfies_snapshot", "parallelscan_reinitialize": "table_block_parallelscan_reinitialize", "relation_copy_for_cluster": "heapam_relation_copy_for_cluster", "relation_set_new_filenode": "heapam_relation_set_new_filenode", "relation_needs_toast_table": "heapam_relation_needs_toast_table", "tuple_complete_speculative": "heapam_tuple_complete_speculative", "compute_xid_horizon_for_tuples": "heap_compute_xid_horizon_for_tuples", "relation_nontransactional_truncate": "heapam_relation_nontransactional_truncate"}, "description": ["\u5185\u7f6e heap \u8868\u8bbf\u95ee\u65b9\u6cd5\u5c06\u5143\u7ec4\u5b58\u50a8\u3001\u53ef\u89c1\u6027\u3001\u626b\u63cf\u3001\u7d22\u5f15\u83b7\u53d6\u548c\u7ef4\u62a4\u64cd\u4f5c\u96c6\u6210\u5230 PostgreSQL \u4e2d\u3002"], "manual_html": "<div class=\"chapter\" id=\"TABLEAM\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h2 class=\"title\" lang=\"zh\">\u7b2c 60 \u7ae0. Table Access Method Interface Definition</h2>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u672c\u7ae0\u8bf4\u660e <span class=\"productname\">PostgreSQL</span> \u6838\u5fc3\u7cfb\u7edf\u4e0e\u7ba1\u7406\u8868\u5b58\u50a8\u7684<em class=\"firstterm\">\u8868\u8bbf\u95ee\u65b9\u6cd5</em>\u4e4b\u95f4\u7684\u63a5\u53e3\u3002\u9664\u8fd9\u91cc\u89c4\u5b9a\u7684\u5185\u5bb9\u4e4b\u5916\uff0c\u6838\u5fc3\u7cfb\u7edf\u5bf9\u8fd9\u4e9b\u8bbf\u95ee\u65b9\u6cd5\u77e5\u4e4b\u751a\u5c11\uff0c\u56e0\u6b64\u53ef\u4ee5\u901a\u8fc7\u7f16\u5199\u9644\u52a0\u4ee3\u7801\u6765\u5f00\u53d1\u5168\u65b0\u7684\u8bbf\u95ee\u65b9\u6cd5\u7c7b\u578b\u3002</p>\n<p lang=\"zh\">\u6bcf\u4e2a\u8868\u8bbf\u95ee\u65b9\u6cd5\u90fd\u7531\u7cfb\u7edf\u76ee\u5f55 <a class=\"link\" href=\"/docs/12/catalog-pg-am.html\" title=\"51.3.\u00a0pg_am\"><code class=\"structname\">pg_am</code></a> \u4e2d\u7684\u4e00\u884c\u63cf\u8ff0\u3002<code class=\"structname\">pg_am</code> \u6761\u76ee\u6307\u5b9a\u4e86\u8be5\u8868\u8bbf\u95ee\u65b9\u6cd5\u7684\u540d\u79f0\u4ee5\u53ca\u4e00\u4e2a<em class=\"firstterm\">\u5904\u7406\u5668\u51fd\u6570</em>\u3002\u8fd9\u4e9b\u6761\u76ee\u53ef\u4ee5\u901a\u8fc7<a class=\"xref\" href=\"/docs/12/sql-create-access-method.html\" title=\"CREATE ACCESS METHOD\"><span class=\"refentrytitle\">CREATE ACCESS METHOD</span></a>\u548c<a class=\"xref\" href=\"/docs/12/sql-drop-access-method.html\" title=\"DROP ACCESS METHOD\"><span class=\"refentrytitle\">DROP ACCESS METHOD</span></a> SQL \u547d\u4ee4\u521b\u5efa\u548c\u5220\u9664\u3002</p>\n<p lang=\"zh\">\u8868\u8bbf\u95ee\u65b9\u6cd5\u7684\u5904\u7406\u5668\u51fd\u6570\u5fc5\u987b\u58f0\u660e\u4e3a\u63a5\u53d7\u4e00\u4e2a <code class=\"type\">internal</code> \u7c7b\u578b\u7684\u53c2\u6570\uff0c\u5e76\u8fd4\u56de\u4f2a\u7c7b\u578b <code class=\"type\">table_am_handler</code>\u3002\u8fd9\u4e2a\u53c2\u6570\u53ea\u662f\u4e00\u4e2a\u5360\u4f4d\u503c\uff0c\u7528\u6765\u9632\u6b62\u5904\u7406\u5668\u51fd\u6570\u88ab SQL \u547d\u4ee4\u76f4\u63a5\u8c03\u7528\u3002\u8be5\u51fd\u6570\u7684\u7ed3\u679c\u5fc5\u987b\u662f\u4e00\u4e2a\u6307\u5411 <code class=\"structname\">TableAmRoutine</code> \u7ed3\u6784\u4f53\u7684\u6307\u9488\uff0c\u5176\u4e2d\u5305\u542b\u6838\u5fc3\u4ee3\u7801\u4f7f\u7528\u8be5\u8868\u8bbf\u95ee\u65b9\u6cd5\u6240\u9700\u7684\u5168\u90e8\u4fe1\u606f\u3002\u8fd4\u56de\u503c\u9700\u8981\u5177\u6709\u670d\u52a1\u5668\u751f\u547d\u5468\u671f\uff0c\u8fd9\u901a\u5e38\u901a\u8fc7\u5c06\u5176\u5b9a\u4e49\u4e3a\u5168\u5c40\u4f5c\u7528\u57df\u4e2d\u7684 <code class=\"literal\">static const</code> \u53d8\u91cf\u6765\u5b9e\u73b0\u3002<code class=\"structname\">TableAmRoutine</code> \u7ed3\u6784\u4f53\u4e5f\u79f0\u4e3a\u8be5\u8bbf\u95ee\u65b9\u6cd5\u7684<em class=\"firstterm\">API \u7ed3\u6784\u4f53</em>\uff0c\u5b83\u901a\u8fc7\u56de\u8c03\u6765\u5b9a\u4e49\u8bbf\u95ee\u65b9\u6cd5\u7684\u884c\u4e3a\u3002\u8fd9\u4e9b\u56de\u8c03\u662f\u666e\u901a C \u51fd\u6570\u7684\u6307\u9488\uff0c\u5728 SQL \u5c42\u65e2\u4e0d\u53ef\u89c1\u4e5f\u4e0d\u53ef\u8c03\u7528\u3002\u6240\u6709\u56de\u8c03\u53ca\u5176\u884c\u4e3a\u90fd\u5b9a\u4e49\u5728 <code class=\"structname\">TableAmRoutine</code> \u7ed3\u6784\u4f53\u4e2d\uff08\u7ed3\u6784\u4f53\u5185\u7684\u6ce8\u91ca\u8bf4\u660e\u4e86\u5bf9\u56de\u8c03\u7684\u8981\u6c42\uff09\u3002\u5927\u591a\u6570\u56de\u8c03\u90fd\u6709\u5305\u88c5\u51fd\u6570\uff0c\u5176\u6587\u6863\u662f\u4ece\u8868\u8bbf\u95ee\u65b9\u6cd5\u4f7f\u7528\u8005\u800c\u975e\u5b9e\u73b0\u8005\u7684\u89d2\u5ea6\u7f16\u5199\u7684\u3002\u8be6\u60c5\u8bf7\u53c2\u9605 <a class=\"ulink\" href=\"https://git.postgresql.org/gitweb/?p=postgresql.git;a=blob;f=src/include/access/tableam.h;hb=HEAD\" target=\"_top\"><code class=\"filename\">src/include/access/tableam.h</code></a> \u6587\u4ef6\u3002</p>\n<p lang=\"zh\">\u5b9e\u73b0\u8bbf\u95ee\u65b9\u6cd5\u65f6\uff0c\u901a\u5e38\u9700\u8981\u5b9e\u73b0\u4e13\u7528\u7684\u5143\u7ec4\u8868\u69fd\u4f4d\u7c7b\u578b\uff08\u53c2\u89c1 src/include/executor/tuptable.h\uff09\uff0c\u4f7f\u8bbf\u95ee\u65b9\u6cd5\u4e4b\u5916\u7684\u4ee3\u7801\u53ef\u4ee5\u6301\u6709\u8be5\u65b9\u6cd5\u7684\u5143\u7ec4\u5f15\u7528\uff0c\u5e76\u8bbf\u95ee\u5143\u7ec4\u5404\u5217\u3002</p>\n<p lang=\"zh\">\u76ee\u524d\uff0cAM \u5b9e\u9645\u5b58\u50a8\u6570\u636e\u7684\u65b9\u5f0f\u6240\u53d7\u9650\u5236\u76f8\u5f53\u5c11\u3002\u4f8b\u5982\uff0c\u53ef\u4ee5\u4f7f\u7528 postgres \u7684\u5171\u4eab\u7f13\u51b2\u533a\u7f13\u5b58\uff0c\u4f46\u8fd9\u5e76\u975e\u5fc5\u9700\u3002\u5982\u679c\u4f7f\u7528\u5b83\uff0c\u90a3\u4e48\u91c7\u7528 <span class=\"productname\">PostgreSQL</span> \u5728<a class=\"xref\" href=\"/docs/12/storage-page-layout.html\" title=\"69.6.\u00a0\u6570\u636e\u5e93\u9875\u9762\u5e03\u5c40\">\u7b2c\u00a069.6\u00a0\u8282</a>\u4e2d\u63cf\u8ff0\u7684\u6807\u51c6\u9875\u9762\u5e03\u5c40\u901a\u5e38\u662f\u6709\u610f\u4e49\u7684\u3002</p>\n<p lang=\"zh\">\u8868\u8bbf\u95ee\u65b9\u6cd5 API \u76ee\u524d\u7684\u4e00\u9879\u8f83\u5927\u9650\u5236\u662f\uff1a\u82e5\u8bbf\u95ee\u65b9\u6cd5\u5e0c\u671b\u652f\u6301\u4fee\u6539\u64cd\u4f5c\u548c/\u6216\u7d22\u5f15\uff0c\u6bcf\u4e2a\u5143\u7ec4\u5fc5\u987b\u6709\u4e00\u4e2a\u7531\u5757\u53f7\u548c\u9879\u53f7\u7ec4\u6210\u7684\u5143\u7ec4\u6807\u8bc6\u7b26 TID\uff08\u53e6\u89c1\u7b2c 69.6 \u8282\uff09\u3002TID \u5404\u90e8\u5206\u4e0d\u5fc5\u5177\u6709\u4e0e heap \u4e2d\u5b8c\u5168\u76f8\u540c\u7684\u542b\u4e49\uff1b\u4f46\u5982\u679c\u8981\u652f\u6301\u53ef\u9009\u7684\u4f4d\u56fe\u626b\u63cf\uff0c\u5757\u53f7\u5c31\u9700\u8981\u63d0\u4f9b\u5c40\u90e8\u6027\u3002</p>\n<p lang=\"zh\">\u4e3a\u4fdd\u8bc1\u5d29\u6e83\u5b89\u5168\uff0cAM \u53ef\u4ee5\u4f7f\u7528 postgres \u7684<a class=\"link\" href=\"/docs/12/wal.html\" title=\"\u7b2c\u00a029\u00a0\u7ae0\u00a0\u53ef\u9760\u6027\u4e0e\u9884\u5199\u5f0f\u65e5\u5fd7\"><acronym class=\"acronym\">WAL</acronym></a>\uff0c\u4e5f\u53ef\u4ee5\u4f7f\u7528\u81ea\u5b9a\u4e49\u5b9e\u73b0\u3002\u5982\u679c\u9009\u62e9\u4e86 <acronym class=\"acronym\">WAL</acronym>\uff0c\u53ef\u4ee5\u4f7f\u7528<a class=\"link\" href=\"/docs/12/generic-wal.html\" title=\"\u7b2c\u00a062\u00a0\u7ae0\u00a0\u901a\u7528 WAL \u8bb0\u5f55\">\u901a\u7528 WAL \u8bb0\u5f55</a>\uff0c\u4e5f\u53ef\u4ee5\u5b9e\u73b0\u4e00\u79cd\u65b0\u7684 <acronym class=\"acronym\">WAL</acronym> \u8bb0\u5f55\u7c7b\u578b\u3002\u901a\u7528 WAL \u8bb0\u5f55\u4f7f\u7528\u7b80\u5355\uff0c\u4f46\u610f\u5473\u7740\u66f4\u5927\u7684 WAL \u91cf\u3002\u76ee\u524d\u5b9e\u73b0\u65b0\u7684 WAL \u8bb0\u5f55\u7c7b\u578b\u9700\u8981\u4fee\u6539\u6838\u5fc3\u4ee3\u7801\uff08\u5177\u4f53\u6765\u8bf4\u662f <code class=\"filename\">src/include/access/rmgrlist.h</code>\uff09\u3002</p>\n<p lang=\"zh\">\u8981\u4ee5\u5141\u8bb8\u5728\u5355\u4e2a\u4e8b\u52a1\u4e2d\u8bbf\u95ee\u4e0d\u540c\u8868\u8bbf\u95ee\u65b9\u6cd5\u7684\u65b9\u5f0f\u5b9e\u73b0\u4e8b\u52a1\u652f\u6301\uff0c\u5f88\u53ef\u80fd\u9700\u8981\u4e0e <code class=\"filename\">src/backend/access/transam/xlog.c</code> \u4e2d\u7684\u673a\u5236\u7d27\u5bc6\u96c6\u6210\u3002</p>\n<p lang=\"zh\">\u5f00\u53d1\u65b0\u7684\u8868\u8bbf\u95ee\u65b9\u6cd5\u65f6\uff0c\u53ef\u4ee5\u53c2\u7167 src/backend/access/heap/heapam_handler.c \u4e2d\u73b0\u6709\u7684\u5806\u5b9e\u73b0\uff0c\u4e86\u89e3\u5b9e\u73b0\u7ec6\u8282\u3002</p>\n</div>", "manual_path": "/docs/12/tableam.html", "localization": {"status": "complete", "sources": [{"url": "/docs/12/tableam.html", "method": "same-major semantic node", "sha256": "865b74e7676363fb601317927582b4791e8ba4319b4da1be27fc9f63dc35bb0f", "language": "zh", "matched_nodes": ["#TABLEAM/p[10]", "#TABLEAM/p[3]", "#TABLEAM/p[4]", "#TABLEAM/p[5]", "#TABLEAM/p[7]", "#TABLEAM/p[9]"]}], "language": "zh", "original_text": {"/versions/12/description/0": "The built-in heap table access method integrates tuple storage, visibility, scans, index fetches and maintenance with PostgreSQL.", "/versions/12/facts/0/label": "Interface family", "/versions/12/facts/0/value": "Table access method", "/versions/12/facts/1/label": "Handler or routine", "/versions/12/facts/2/label": "Recorded callbacks", "/versions/12/tables/0/title": "Registered interface handlers", "/versions/12/related/0/label": "System catalog pg_am", "/versions/12/related/2/label": "Index AM", "/versions/12/sections/0/title": "Interface and capability boundaries", "/versions/12/sections/1/title": "Heap storage, visibility and WAL", "/versions/12/sections/2/title": "Registered implementation in core source", "/versions/12/tables/0/rows/0/state": "Handler registered; conditions apply", "/versions/12/tables/0/rows/1/state": "Handler registered; conditions apply", "/versions/12/tables/0/rows/2/state": "Handler registered; conditions apply", "/versions/12/tables/0/rows/3/state": "Handler registered; conditions apply", "/versions/12/tables/0/rows/4/state": "Handler registered; conditions apply", "/versions/12/tables/0/rows/5/state": "Handler registered; conditions apply", "/versions/12/tables/0/rows/6/state": "Handler registered; conditions apply", "/versions/12/tables/0/rows/7/state": "Handler registered; conditions apply", "/versions/12/tables/0/rows/8/state": "Handler registered; conditions apply", "/versions/12/tables/0/rows/9/state": "Handler registered; conditions apply", "/versions/12/tables/0/rows/10/state": "Handler registered; conditions apply", "/versions/12/sections/0/paragraphs/0": "The matrix records callbacks actually registered in this source build. Registration identifies an implemented interface hook; options, query shape, privileges and provider rules determine whether an operation is allowed.", "/versions/12/sections/0/paragraphs/1": "The complete same-version manual below retains configuration, constraints and examples. No runtime capability test is claimed.", "/versions/12/sections/1/paragraphs/0": "This inventory starts with the Table AM interface in PostgreSQL 12. Earlier PostgreSQL heap storage is not relabeled as a Table AM implementation.", "/versions/12/sections/1/paragraphs/1": "Heap visibility follows PostgreSQL snapshots. WAL and crash-recovery behavior depend on relation persistence; temporary and unlogged tables differ from permanent tables. Index access methods remain separate from the table storage interface.", "/versions/12/tables/0/rows/0/feature": "Tuple slot", "/versions/12/tables/0/rows/1/feature": "Begin scan", "/versions/12/tables/0/rows/2/feature": "Parallel scan initialization", "/versions/12/tables/0/rows/3/feature": "Begin index lookup", "/versions/12/tables/0/rows/4/feature": "Fetch identified tuple", "/versions/12/tables/0/rows/5/feature": "Insert tuple", "/versions/12/tables/0/rows/6/feature": "Update tuple", "/versions/12/tables/0/rows/7/feature": "Delete tuple", "/versions/12/tables/0/rows/8/feature": "Vacuum relation", "/versions/12/tables/0/rows/9/feature": "Analyze block", "/versions/12/tables/0/columns/0/label": "Interface operation", "/versions/12/tables/0/columns/1/label": "Source observation", "/versions/12/tables/0/columns/2/label": "Callback", "/versions/12/tables/0/columns/3/label": "Implementation", "/versions/12/tables/0/rows/10/feature": "TOAST decision"}, "fallback_fields": [], "source_language": "en", "original_snapshot_sha256": "bc98d33052e0429f513e08e48720a702fbe17b31fe9ee0c56bfc6acdbf3def5f"}, "evidence_kind": "source and documentation", "comparison_data": {"options": [], "callbacks": {"scan_end": "heap_endscan", "scan_begin": "heap_beginscan", "tuple_lock": "heapam_tuple_lock", "scan_rescan": "heap_rescan", "multi_insert": "heap_multi_insert", "tuple_delete": "heapam_tuple_delete", "tuple_insert": "heapam_tuple_insert", "tuple_update": "heapam_tuple_update", "relation_size": "heapam_relation_size", "slot_callbacks": "heapam_slot_callbacks", "index_fetch_end": "heapam_index_fetch_end", "relation_vacuum": "heap_vacuum_rel", "tuple_tid_valid": "heapam_tuple_tid_valid", "scan_getnextslot": "heap_getnextslot", "index_fetch_begin": "heapam_index_fetch_begin", "index_fetch_reset": "heapam_index_fetch_reset", "index_fetch_tuple": "heapam_index_fetch_tuple", "finish_bulk_insert": "heapam_finish_bulk_insert", "relation_copy_data": "heapam_relation_copy_data", "index_validate_scan": "heapam_index_validate_scan", "tuple_get_latest_tid": "heap_get_latest_tid", "parallelscan_estimate": "table_block_parallelscan_estimate", "index_build_range_scan": "heapam_index_build_range_scan", "relation_estimate_size": "heapam_estimate_rel_size", "scan_bitmap_next_block": "heapam_scan_bitmap_next_block", "scan_bitmap_next_tuple": "heapam_scan_bitmap_next_tuple", "scan_sample_next_block": "heapam_scan_sample_next_block", "scan_sample_next_tuple": "heapam_scan_sample_next_tuple", "parallelscan_initialize": "table_block_parallelscan_initialize", "scan_analyze_next_block": "heapam_scan_analyze_next_block", "scan_analyze_next_tuple": "heapam_scan_analyze_next_tuple", "tuple_fetch_row_version": "heapam_fetch_row_version", "tuple_insert_speculative": "heapam_tuple_insert_speculative", "tuple_satisfies_snapshot": "heapam_tuple_satisfies_snapshot", "parallelscan_reinitialize": "table_block_parallelscan_reinitialize", "relation_copy_for_cluster": "heapam_relation_copy_for_cluster", "relation_set_new_filenode": "heapam_relation_set_new_filenode", "relation_needs_toast_table": "heapam_relation_needs_toast_table", "tuple_complete_speculative": "heapam_tuple_complete_speculative", "compute_xid_horizon_for_tuples": "heap_compute_xid_horizon_for_tuples", "relation_nontransactional_truncate": "heapam_relation_nontransactional_truncate"}, "source_options": [], "protocol_versions": {}}, "comparison_hash": "cdc168038f8a0930454c83eead818d36c8fbfe842d4d6e716a39e36c6a09d9cc", "manual_language": "zh", "runtime_verified": false}, "13": {"facts": [{"label": "\u63a5\u53e3\u7c7b\u522b", "value": "\u8868\u8bbf\u95ee\u65b9\u6cd5"}, {"label": "\u5904\u7406\u51fd\u6570\u6216\u4f8b\u7a0b", "value": "heapam_methods"}, {"label": "\u8bb0\u5f55\u7684\u56de\u8c03", "value": "42"}], "tables": [{"key": "callbacks", "rows": [{"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u5143\u7ec4\u69fd", "callback": "slot_callbacks", "implementation": "heapam_slot_callbacks"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u5f00\u59cb\u626b\u63cf", "callback": "scan_begin", "implementation": "heap_beginscan"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u521d\u59cb\u5316\u5e76\u884c\u626b\u63cf", "callback": "parallelscan_initialize", "implementation": "table_block_parallelscan_initialize"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u5f00\u59cb\u7d22\u5f15\u67e5\u627e", "callback": "index_fetch_begin", "implementation": "heapam_index_fetch_begin"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u83b7\u53d6\u6307\u5b9a\u5143\u7ec4", "callback": "index_fetch_tuple", "implementation": "heapam_index_fetch_tuple"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u63d2\u5165\u5143\u7ec4", "callback": "tuple_insert", "implementation": "heapam_tuple_insert"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u66f4\u65b0\u5143\u7ec4", "callback": "tuple_update", "implementation": "heapam_tuple_update"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u5220\u9664\u5143\u7ec4", "callback": "tuple_delete", "implementation": "heapam_tuple_delete"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u5bf9\u5173\u7cfb\u6267\u884c VACUUM", "callback": "relation_vacuum", "implementation": "heap_vacuum_rel"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u5206\u6790\u6570\u636e\u5757", "callback": "scan_analyze_next_block", "implementation": "heapam_scan_analyze_next_block"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "TOAST \u5224\u5b9a", "callback": "relation_needs_toast_table", "implementation": "heapam_relation_needs_toast_table"}], "title": "\u6ce8\u518c\u7684\u63a5\u53e3\u5904\u7406\u51fd\u6570", "columns": [{"key": "feature", "label": "\u63a5\u53e3\u64cd\u4f5c"}, {"key": "state", "label": "\u6e90\u7801\u89c2\u5bdf"}, {"key": "callback", "label": "\u56de\u8c03"}, {"key": "implementation", "label": "\u5b9e\u73b0"}]}], "related": [{"url": "/wiki/catalog/pg_am/?v=13", "label": "\u7cfb\u7edf\u76ee\u5f55 pg_am"}, {"url": "/wiki/guc/default_table_access_method/?v=13", "label": "default_table_access_method"}, {"url": "/wiki/indexam/?v=13", "label": "\u7d22\u5f15\u8bbf\u95ee\u65b9\u6cd5"}], "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://pg.center/docs/13/tableam.html", "path": "tableam.html", "label": "PostgreSQL 13 English manual", "sha256": "7207b1654a8740007f663a820269f764f8b566f9f6bbbf739f768970658e4f52", "language": "en", "original_url": "/docs/13/tableam.html"}, {"url": "https://ftp.postgresql.org/pub/source/v13.23/postgresql-13.23.tar.bz2", "line": 2536, "path": "src/backend/access/heap/heapam_handler.c", "label": "src/backend/access/heap/heapam_handler.c:2536", "sha256": "7504b49b1b306583d631e5608e081b280b7e72362f280e8db5490871727e8660", "archive_sha256": "6ec3c82726af92b7dec873fa1cdf881eca92a4219787dfad05acb6b10e041fd6"}, {"url": "https://pg.center/docs/13/mvcc-intro.html", "path": "mvcc-intro.html", "label": "PostgreSQL 13 English manual", "sha256": "a970ff541c86fe8f48eabf49dcda92879e1db437223c629d6c83d38c0cd70180", "language": "en", "original_url": "/docs/13/mvcc-intro.html"}, {"url": "https://pg.center/docs/13/sql-createtable.html", "path": "sql-createtable.html", "label": "PostgreSQL 13 English manual", "sha256": "912dd15faaa243438f33082160f2848636d1940afea42c36cf6d21a2a46c8cb8", "language": "en", "original_url": "/docs/13/sql-createtable.html"}, {"url": "https://pg.center/docs/13/routine-vacuuming.html", "path": "routine-vacuuming.html", "label": "PostgreSQL 13 English manual", "sha256": "c8cdd4e67dcc28e8f62ed22b8a6c3e8e2762359267655bea2c9c5b3dcb3a9efe", "language": "en", "original_url": "/docs/13/routine-vacuuming.html"}, {"url": "https://pg.center/docs/13/catalog-pg-am.html", "path": "catalog-pg-am.html", "label": "PostgreSQL 13 English manual", "sha256": "a5a599fab10fbcdbd5dd963e70f41868984db33c061716372b9957b9c111ce7a", "language": "en", "original_url": "/docs/13/catalog-pg-am.html"}], "sections": [{"title": "\u63a5\u53e3\u4e0e\u80fd\u529b\u8fb9\u754c", "paragraphs": ["\u77e9\u9635\u8bb0\u5f55\u6b64\u6e90\u7801\u6784\u5efa\u5b9e\u9645\u6ce8\u518c\u7684\u56de\u8c03\u3002\u6ce8\u518c\u8868\u660e\u5b9e\u73b0\u4e86\u76f8\u5e94\u63a5\u53e3\u94a9\u5b50\uff1b\u64cd\u4f5c\u662f\u5426\u5141\u8bb8\u8fd8\u53d6\u51b3\u4e8e\u9009\u9879\u3001\u67e5\u8be2\u5f62\u5f0f\u3001\u6743\u9650\u548c\u63d0\u4f9b\u65b9\u89c4\u5219\u3002", "\u4e0b\u65b9\u4fdd\u7559\u540c\u7248\u672c\u5b8c\u6574\u624b\u518c\uff0c\u5305\u62ec\u914d\u7f6e\u3001\u7ea6\u675f\u548c\u793a\u4f8b\u3002\u4e0d\u58f0\u79f0\u5df2\u8fdb\u884c\u8fd0\u884c\u65f6\u80fd\u529b\u6d4b\u8bd5\u3002"]}, {"title": "\u5806\u5b58\u50a8\u3001\u53ef\u89c1\u6027\u4e0e WAL", "paragraphs": ["\u6b64\u6e05\u5355\u4ece PostgreSQL 12 \u5f15\u5165\u7684 Table AM \u63a5\u53e3\u5f00\u59cb\u3002\u4e0d\u4f1a\u5c06\u66f4\u65e9\u7248\u672c\u7684 PostgreSQL \u5806\u5b58\u50a8\u91cd\u65b0\u6807\u4e3a Table AM \u5b9e\u73b0\u3002", "\u5806\u53ef\u89c1\u6027\u9075\u5faa PostgreSQL \u5feb\u7167\u3002WAL \u548c\u5d29\u6e83\u6062\u590d\u884c\u4e3a\u53d6\u51b3\u4e8e\u5173\u7cfb\u7684\u6301\u4e45\u6027\uff1b\u4e34\u65f6\u8868\u3001\u65e0\u65e5\u5fd7\u8868\u4e0e\u6c38\u4e45\u8868\u4e0d\u540c\u3002\u7d22\u5f15\u8bbf\u95ee\u65b9\u6cd5\u4e0e\u8868\u5b58\u50a8\u63a5\u53e3\u5206\u5f00\u3002"]}, {"code": "{\n\t.type = T_TableAmRoutine,\n\n\t.slot_callbacks = heapam_slot_callbacks,\n\n\t.scan_begin = heap_beginscan,\n\t.scan_end = heap_endscan,\n\t.scan_rescan = heap_rescan,\n\t.scan_getnextslot = heap_getnextslot,\n\n\t.parallelscan_estimate = table_block_parallelscan_estimate,\n\t.parallelscan_initialize = table_block_parallelscan_initialize,\n\t.parallelscan_reinitialize = table_block_parallelscan_reinitialize,\n\n\t.index_fetch_begin = heapam_index_fetch_begin,\n\t.index_fetch_reset = heapam_index_fetch_reset,\n\t.index_fetch_end = heapam_index_fetch_end,\n\t.index_fetch_tuple = heapam_index_fetch_tuple,\n\n\t.tuple_insert = heapam_tuple_insert,\n\t.tuple_insert_speculative = heapam_tuple_insert_speculative,\n\t.tuple_complete_speculative = heapam_tuple_complete_speculative,\n\t.multi_insert = heap_multi_insert,\n\t.tuple_delete = heapam_tuple_delete,\n\t.tuple_update = heapam_tuple_update,\n\t.tuple_lock = heapam_tuple_lock,\n\n\t.tuple_fetch_row_version = heapam_fetch_row_version,\n\t.tuple_get_latest_tid = heap_get_latest_tid,\n\t.tuple_tid_valid = heapam_tuple_tid_valid,\n\t.tuple_satisfies_snapshot = heapam_tuple_satisfies_snapshot,\n\t.compute_xid_horizon_for_tuples = heap_compute_xid_horizon_for_tuples,\n\n\t.relation_set_new_filenode = heapam_relation_set_new_filenode,\n\t.relation_nontransactional_truncate = heapam_relation_nontransactional_truncate,\n\t.relation_copy_data = heapam_relation_copy_data,\n\t.relation_copy_for_cluster = heapam_relation_copy_for_cluster,\n\t.relation_vacuum = heap_vacuum_rel,\n\t.scan_analyze_next_block = heapam_scan_analyze_next_block,\n\t.scan_analyze_next_tuple = heapam_scan_analyze_next_tuple,\n\t.index_build_range_scan = heapam_index_build_range_scan,\n\t.index_validate_scan = heapam_index_validate_scan,\n\n\t.relation_size = table_block_relation_size,\n\t.relation_needs_toast_table = heapam_relation_needs_toast_table,\n\t.relation_toast_am = heapam_relation_toast_am,\n\t.relation_fetch_toast_slice = heap_fetch_toast_slice,\n\n\t.relation_estimate_size = heapam_estimate_rel_size,\n\n\t.scan_bitmap_next_block = heapam_scan_bitmap_next_block,\n\t.scan_bitmap_next_tuple = heapam_scan_bitmap_next_tuple,\n\t.scan_sample_next_block = heapam_scan_sample_next_block,\n\t.scan_sample_next_tuple = heapam_scan_sample_next_tuple\n}", "title": "\u6838\u5fc3\u6e90\u7801\u4e2d\u6ce8\u518c\u7684\u5b9e\u73b0"}], "callbacks": {"scan_end": "heap_endscan", "scan_begin": "heap_beginscan", "tuple_lock": "heapam_tuple_lock", "scan_rescan": "heap_rescan", "multi_insert": "heap_multi_insert", "tuple_delete": "heapam_tuple_delete", "tuple_insert": "heapam_tuple_insert", "tuple_update": "heapam_tuple_update", "relation_size": "table_block_relation_size", "slot_callbacks": "heapam_slot_callbacks", "index_fetch_end": "heapam_index_fetch_end", "relation_vacuum": "heap_vacuum_rel", "tuple_tid_valid": "heapam_tuple_tid_valid", "scan_getnextslot": "heap_getnextslot", "index_fetch_begin": "heapam_index_fetch_begin", "index_fetch_reset": "heapam_index_fetch_reset", "index_fetch_tuple": "heapam_index_fetch_tuple", "relation_toast_am": "heapam_relation_toast_am", "relation_copy_data": "heapam_relation_copy_data", "index_validate_scan": "heapam_index_validate_scan", "tuple_get_latest_tid": "heap_get_latest_tid", "parallelscan_estimate": "table_block_parallelscan_estimate", "index_build_range_scan": "heapam_index_build_range_scan", "relation_estimate_size": "heapam_estimate_rel_size", "scan_bitmap_next_block": "heapam_scan_bitmap_next_block", "scan_bitmap_next_tuple": "heapam_scan_bitmap_next_tuple", "scan_sample_next_block": "heapam_scan_sample_next_block", "scan_sample_next_tuple": "heapam_scan_sample_next_tuple", "parallelscan_initialize": "table_block_parallelscan_initialize", "scan_analyze_next_block": "heapam_scan_analyze_next_block", "scan_analyze_next_tuple": "heapam_scan_analyze_next_tuple", "tuple_fetch_row_version": "heapam_fetch_row_version", "tuple_insert_speculative": "heapam_tuple_insert_speculative", "tuple_satisfies_snapshot": "heapam_tuple_satisfies_snapshot", "parallelscan_reinitialize": "table_block_parallelscan_reinitialize", "relation_copy_for_cluster": "heapam_relation_copy_for_cluster", "relation_set_new_filenode": "heapam_relation_set_new_filenode", "relation_fetch_toast_slice": "heap_fetch_toast_slice", "relation_needs_toast_table": "heapam_relation_needs_toast_table", "tuple_complete_speculative": "heapam_tuple_complete_speculative", "compute_xid_horizon_for_tuples": "heap_compute_xid_horizon_for_tuples", "relation_nontransactional_truncate": "heapam_relation_nontransactional_truncate"}, "description": ["\u5185\u7f6e heap \u8868\u8bbf\u95ee\u65b9\u6cd5\u5c06\u5143\u7ec4\u5b58\u50a8\u3001\u53ef\u89c1\u6027\u3001\u626b\u63cf\u3001\u7d22\u5f15\u83b7\u53d6\u548c\u7ef4\u62a4\u64cd\u4f5c\u96c6\u6210\u5230 PostgreSQL \u4e2d\u3002"], "manual_html": "<div class=\"chapter\" id=\"TABLEAM\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h2 class=\"title\" lang=\"zh\">\u7b2c 60 \u7ae0. Table Access Method Interface Definition</h2>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u672c\u7ae0\u8bf4\u660e <span class=\"productname\">PostgreSQL</span> \u6838\u5fc3\u7cfb\u7edf\u4e0e\u7ba1\u7406\u8868\u5b58\u50a8\u7684<em class=\"firstterm\">\u8868\u8bbf\u95ee\u65b9\u6cd5</em>\u4e4b\u95f4\u7684\u63a5\u53e3\u3002\u9664\u8fd9\u91cc\u89c4\u5b9a\u7684\u5185\u5bb9\u4e4b\u5916\uff0c\u6838\u5fc3\u7cfb\u7edf\u5bf9\u8fd9\u4e9b\u8bbf\u95ee\u65b9\u6cd5\u77e5\u4e4b\u751a\u5c11\uff0c\u56e0\u6b64\u53ef\u4ee5\u901a\u8fc7\u7f16\u5199\u9644\u52a0\u4ee3\u7801\u6765\u5f00\u53d1\u5168\u65b0\u7684\u8bbf\u95ee\u65b9\u6cd5\u7c7b\u578b\u3002</p>\n<p lang=\"zh\">\u6bcf\u4e2a\u8868\u8bbf\u95ee\u65b9\u6cd5\u90fd\u7531\u7cfb\u7edf\u76ee\u5f55 <a class=\"link\" href=\"/docs/13/catalog-pg-am.html\" title=\"51.3.\u00a0pg_am\"><code class=\"structname\">pg_am</code></a> \u4e2d\u7684\u4e00\u884c\u63cf\u8ff0\u3002<code class=\"structname\">pg_am</code> \u6761\u76ee\u6307\u5b9a\u4e86\u8be5\u8868\u8bbf\u95ee\u65b9\u6cd5\u7684\u540d\u79f0\u4ee5\u53ca\u4e00\u4e2a<em class=\"firstterm\">\u5904\u7406\u5668\u51fd\u6570</em>\u3002\u8fd9\u4e9b\u6761\u76ee\u53ef\u4ee5\u901a\u8fc7<a class=\"xref\" href=\"/docs/13/sql-create-access-method.html\" title=\"CREATE ACCESS METHOD\"><span class=\"refentrytitle\">CREATE ACCESS METHOD</span></a>\u548c<a class=\"xref\" href=\"/docs/13/sql-drop-access-method.html\" title=\"DROP ACCESS METHOD\"><span class=\"refentrytitle\">DROP ACCESS METHOD</span></a> SQL \u547d\u4ee4\u521b\u5efa\u548c\u5220\u9664\u3002</p>\n<p lang=\"zh\">\u8868\u8bbf\u95ee\u65b9\u6cd5\u7684\u5904\u7406\u5668\u51fd\u6570\u5fc5\u987b\u58f0\u660e\u4e3a\u63a5\u53d7\u4e00\u4e2a <code class=\"type\">internal</code> \u7c7b\u578b\u7684\u53c2\u6570\uff0c\u5e76\u8fd4\u56de\u4f2a\u7c7b\u578b <code class=\"type\">table_am_handler</code>\u3002\u8fd9\u4e2a\u53c2\u6570\u53ea\u662f\u4e00\u4e2a\u5360\u4f4d\u503c\uff0c\u7528\u6765\u9632\u6b62\u5904\u7406\u5668\u51fd\u6570\u88ab SQL \u547d\u4ee4\u76f4\u63a5\u8c03\u7528\u3002\u8be5\u51fd\u6570\u7684\u7ed3\u679c\u5fc5\u987b\u662f\u4e00\u4e2a\u6307\u5411 <code class=\"structname\">TableAmRoutine</code> \u7ed3\u6784\u4f53\u7684\u6307\u9488\uff0c\u5176\u4e2d\u5305\u542b\u6838\u5fc3\u4ee3\u7801\u4f7f\u7528\u8be5\u8868\u8bbf\u95ee\u65b9\u6cd5\u6240\u9700\u7684\u5168\u90e8\u4fe1\u606f\u3002\u8fd4\u56de\u503c\u9700\u8981\u5177\u6709\u670d\u52a1\u5668\u751f\u547d\u5468\u671f\uff0c\u8fd9\u901a\u5e38\u901a\u8fc7\u5c06\u5176\u5b9a\u4e49\u4e3a\u5168\u5c40\u4f5c\u7528\u57df\u4e2d\u7684 <code class=\"literal\">static const</code> \u53d8\u91cf\u6765\u5b9e\u73b0\u3002<code class=\"structname\">TableAmRoutine</code> \u7ed3\u6784\u4f53\u4e5f\u79f0\u4e3a\u8be5\u8bbf\u95ee\u65b9\u6cd5\u7684<em class=\"firstterm\">API \u7ed3\u6784\u4f53</em>\uff0c\u5b83\u901a\u8fc7\u56de\u8c03\u6765\u5b9a\u4e49\u8bbf\u95ee\u65b9\u6cd5\u7684\u884c\u4e3a\u3002\u8fd9\u4e9b\u56de\u8c03\u662f\u666e\u901a C \u51fd\u6570\u7684\u6307\u9488\uff0c\u5728 SQL \u5c42\u65e2\u4e0d\u53ef\u89c1\u4e5f\u4e0d\u53ef\u8c03\u7528\u3002\u6240\u6709\u56de\u8c03\u53ca\u5176\u884c\u4e3a\u90fd\u5b9a\u4e49\u5728 <code class=\"structname\">TableAmRoutine</code> \u7ed3\u6784\u4f53\u4e2d\uff08\u7ed3\u6784\u4f53\u5185\u7684\u6ce8\u91ca\u8bf4\u660e\u4e86\u5bf9\u56de\u8c03\u7684\u8981\u6c42\uff09\u3002\u5927\u591a\u6570\u56de\u8c03\u90fd\u6709\u5305\u88c5\u51fd\u6570\uff0c\u5176\u6587\u6863\u662f\u4ece\u8868\u8bbf\u95ee\u65b9\u6cd5\u4f7f\u7528\u8005\u800c\u975e\u5b9e\u73b0\u8005\u7684\u89d2\u5ea6\u7f16\u5199\u7684\u3002\u8be6\u60c5\u8bf7\u53c2\u9605 <a class=\"ulink\" href=\"https://git.postgresql.org/gitweb/?p=postgresql.git;a=blob;f=src/include/access/tableam.h;hb=HEAD\" target=\"_top\"><code class=\"filename\">src/include/access/tableam.h</code></a> \u6587\u4ef6\u3002</p>\n<p lang=\"zh\">\u5b9e\u73b0\u8bbf\u95ee\u65b9\u6cd5\u65f6\uff0c\u901a\u5e38\u9700\u8981\u5b9e\u73b0\u4e13\u7528\u7684\u5143\u7ec4\u8868\u69fd\u4f4d\u7c7b\u578b\uff08\u53c2\u89c1 src/include/executor/tuptable.h\uff09\uff0c\u4f7f\u8bbf\u95ee\u65b9\u6cd5\u4e4b\u5916\u7684\u4ee3\u7801\u53ef\u4ee5\u6301\u6709\u8be5\u65b9\u6cd5\u7684\u5143\u7ec4\u5f15\u7528\uff0c\u5e76\u8bbf\u95ee\u5143\u7ec4\u5404\u5217\u3002</p>\n<p lang=\"zh\">\u76ee\u524d\uff0cAM \u5b9e\u9645\u5b58\u50a8\u6570\u636e\u7684\u65b9\u5f0f\u6240\u53d7\u9650\u5236\u76f8\u5f53\u5c11\u3002\u4f8b\u5982\uff0c\u53ef\u4ee5\u4f7f\u7528 postgres \u7684\u5171\u4eab\u7f13\u51b2\u533a\u7f13\u5b58\uff0c\u4f46\u8fd9\u5e76\u975e\u5fc5\u9700\u3002\u5982\u679c\u4f7f\u7528\u5b83\uff0c\u90a3\u4e48\u91c7\u7528 <span class=\"productname\">PostgreSQL</span> \u5728<a class=\"xref\" href=\"/docs/13/storage-page-layout.html\" title=\"69.6.\u00a0\u6570\u636e\u5e93\u9875\u9762\u5e03\u5c40\">\u7b2c\u00a069.6\u00a0\u8282</a>\u4e2d\u63cf\u8ff0\u7684\u6807\u51c6\u9875\u9762\u5e03\u5c40\u901a\u5e38\u662f\u6709\u610f\u4e49\u7684\u3002</p>\n<p lang=\"zh\">\u8868\u8bbf\u95ee\u65b9\u6cd5 API \u76ee\u524d\u7684\u4e00\u9879\u8f83\u5927\u9650\u5236\u662f\uff1a\u82e5\u8bbf\u95ee\u65b9\u6cd5\u5e0c\u671b\u652f\u6301\u4fee\u6539\u64cd\u4f5c\u548c/\u6216\u7d22\u5f15\uff0c\u6bcf\u4e2a\u5143\u7ec4\u5fc5\u987b\u6709\u4e00\u4e2a\u7531\u5757\u53f7\u548c\u9879\u53f7\u7ec4\u6210\u7684\u5143\u7ec4\u6807\u8bc6\u7b26 TID\uff08\u53e6\u89c1\u7b2c 69.6 \u8282\uff09\u3002TID \u5404\u90e8\u5206\u4e0d\u5fc5\u5177\u6709\u4e0e heap \u4e2d\u5b8c\u5168\u76f8\u540c\u7684\u542b\u4e49\uff1b\u4f46\u5982\u679c\u8981\u652f\u6301\u53ef\u9009\u7684\u4f4d\u56fe\u626b\u63cf\uff0c\u5757\u53f7\u5c31\u9700\u8981\u63d0\u4f9b\u5c40\u90e8\u6027\u3002</p>\n<p lang=\"zh\">\u4e3a\u4fdd\u8bc1\u5d29\u6e83\u5b89\u5168\uff0cAM \u53ef\u4ee5\u4f7f\u7528 postgres \u7684<a class=\"link\" href=\"/docs/13/wal.html\" title=\"\u7b2c\u00a029\u00a0\u7ae0\u00a0\u53ef\u9760\u6027\u4e0e\u9884\u5199\u5f0f\u65e5\u5fd7\"><acronym class=\"acronym\">WAL</acronym></a>\uff0c\u4e5f\u53ef\u4ee5\u4f7f\u7528\u81ea\u5b9a\u4e49\u5b9e\u73b0\u3002\u5982\u679c\u9009\u62e9\u4e86 <acronym class=\"acronym\">WAL</acronym>\uff0c\u53ef\u4ee5\u4f7f\u7528<a class=\"link\" href=\"/docs/13/generic-wal.html\" title=\"\u7b2c\u00a062\u00a0\u7ae0\u00a0\u901a\u7528 WAL \u8bb0\u5f55\">\u901a\u7528 WAL \u8bb0\u5f55</a>\uff0c\u4e5f\u53ef\u4ee5\u5b9e\u73b0\u4e00\u79cd\u65b0\u7684 <acronym class=\"acronym\">WAL</acronym> \u8bb0\u5f55\u7c7b\u578b\u3002\u901a\u7528 WAL \u8bb0\u5f55\u4f7f\u7528\u7b80\u5355\uff0c\u4f46\u610f\u5473\u7740\u66f4\u5927\u7684 WAL \u91cf\u3002\u76ee\u524d\u5b9e\u73b0\u65b0\u7684 WAL \u8bb0\u5f55\u7c7b\u578b\u9700\u8981\u4fee\u6539\u6838\u5fc3\u4ee3\u7801\uff08\u5177\u4f53\u6765\u8bf4\u662f <code class=\"filename\">src/include/access/rmgrlist.h</code>\uff09\u3002</p>\n<p lang=\"zh\">\u8981\u4ee5\u5141\u8bb8\u5728\u5355\u4e2a\u4e8b\u52a1\u4e2d\u8bbf\u95ee\u4e0d\u540c\u8868\u8bbf\u95ee\u65b9\u6cd5\u7684\u65b9\u5f0f\u5b9e\u73b0\u4e8b\u52a1\u652f\u6301\uff0c\u5f88\u53ef\u80fd\u9700\u8981\u4e0e <code class=\"filename\">src/backend/access/transam/xlog.c</code> \u4e2d\u7684\u673a\u5236\u7d27\u5bc6\u96c6\u6210\u3002</p>\n<p lang=\"zh\">\u5f00\u53d1\u65b0\u7684\u8868\u8bbf\u95ee\u65b9\u6cd5\u65f6\uff0c\u53ef\u4ee5\u53c2\u7167 src/backend/access/heap/heapam_handler.c \u4e2d\u73b0\u6709\u7684\u5806\u5b9e\u73b0\uff0c\u4e86\u89e3\u5b9e\u73b0\u7ec6\u8282\u3002</p>\n</div>", "manual_path": "/docs/13/tableam.html", "localization": {"status": "complete", "sources": [{"url": "/docs/13/tableam.html", "method": "same-major semantic node", "sha256": "203fa0468aabf50c378c2bf7d73ee58a72fd30323287bd864e40350f47267fb0", "language": "zh", "matched_nodes": ["#TABLEAM/p[10]", "#TABLEAM/p[3]", "#TABLEAM/p[4]", "#TABLEAM/p[5]", "#TABLEAM/p[7]", "#TABLEAM/p[9]"]}], "language": "zh", "original_text": {"/versions/13/description/0": "The built-in heap table access method integrates tuple storage, visibility, scans, index fetches and maintenance with PostgreSQL.", "/versions/13/facts/0/label": "Interface family", "/versions/13/facts/0/value": "Table access method", "/versions/13/facts/1/label": "Handler or routine", "/versions/13/facts/2/label": "Recorded callbacks", "/versions/13/tables/0/title": "Registered interface handlers", "/versions/13/related/0/label": "System catalog pg_am", "/versions/13/related/2/label": "Index AM", "/versions/13/sections/0/title": "Interface and capability boundaries", "/versions/13/sections/1/title": "Heap storage, visibility and WAL", "/versions/13/sections/2/title": "Registered implementation in core source", "/versions/13/tables/0/rows/0/state": "Handler registered; conditions apply", "/versions/13/tables/0/rows/1/state": "Handler registered; conditions apply", "/versions/13/tables/0/rows/2/state": "Handler registered; conditions apply", "/versions/13/tables/0/rows/3/state": "Handler registered; conditions apply", "/versions/13/tables/0/rows/4/state": "Handler registered; conditions apply", "/versions/13/tables/0/rows/5/state": "Handler registered; conditions apply", "/versions/13/tables/0/rows/6/state": "Handler registered; conditions apply", "/versions/13/tables/0/rows/7/state": "Handler registered; conditions apply", "/versions/13/tables/0/rows/8/state": "Handler registered; conditions apply", "/versions/13/tables/0/rows/9/state": "Handler registered; conditions apply", "/versions/13/tables/0/rows/10/state": "Handler registered; conditions apply", "/versions/13/sections/0/paragraphs/0": "The matrix records callbacks actually registered in this source build. Registration identifies an implemented interface hook; options, query shape, privileges and provider rules determine whether an operation is allowed.", "/versions/13/sections/0/paragraphs/1": "The complete same-version manual below retains configuration, constraints and examples. No runtime capability test is claimed.", "/versions/13/sections/1/paragraphs/0": "This inventory starts with the Table AM interface in PostgreSQL 12. Earlier PostgreSQL heap storage is not relabeled as a Table AM implementation.", "/versions/13/sections/1/paragraphs/1": "Heap visibility follows PostgreSQL snapshots. WAL and crash-recovery behavior depend on relation persistence; temporary and unlogged tables differ from permanent tables. Index access methods remain separate from the table storage interface.", "/versions/13/tables/0/rows/0/feature": "Tuple slot", "/versions/13/tables/0/rows/1/feature": "Begin scan", "/versions/13/tables/0/rows/2/feature": "Parallel scan initialization", "/versions/13/tables/0/rows/3/feature": "Begin index lookup", "/versions/13/tables/0/rows/4/feature": "Fetch identified tuple", "/versions/13/tables/0/rows/5/feature": "Insert tuple", "/versions/13/tables/0/rows/6/feature": "Update tuple", "/versions/13/tables/0/rows/7/feature": "Delete tuple", "/versions/13/tables/0/rows/8/feature": "Vacuum relation", "/versions/13/tables/0/rows/9/feature": "Analyze block", "/versions/13/tables/0/columns/0/label": "Interface operation", "/versions/13/tables/0/columns/1/label": "Source observation", "/versions/13/tables/0/columns/2/label": "Callback", "/versions/13/tables/0/columns/3/label": "Implementation", "/versions/13/tables/0/rows/10/feature": "TOAST decision"}, "fallback_fields": [], "source_language": "en", "original_snapshot_sha256": "10afa29e97b77fd0163581be8cf0d20d46eda9aee635a0b35bd8c02c89526fb4"}, "evidence_kind": "source and documentation", "comparison_data": {"options": [], "callbacks": {"scan_end": "heap_endscan", "scan_begin": "heap_beginscan", "tuple_lock": "heapam_tuple_lock", "scan_rescan": "heap_rescan", "multi_insert": "heap_multi_insert", "tuple_delete": "heapam_tuple_delete", "tuple_insert": "heapam_tuple_insert", "tuple_update": "heapam_tuple_update", "relation_size": "table_block_relation_size", "slot_callbacks": "heapam_slot_callbacks", "index_fetch_end": "heapam_index_fetch_end", "relation_vacuum": "heap_vacuum_rel", "tuple_tid_valid": "heapam_tuple_tid_valid", "scan_getnextslot": "heap_getnextslot", "index_fetch_begin": "heapam_index_fetch_begin", "index_fetch_reset": "heapam_index_fetch_reset", "index_fetch_tuple": "heapam_index_fetch_tuple", "relation_toast_am": "heapam_relation_toast_am", "relation_copy_data": "heapam_relation_copy_data", "index_validate_scan": "heapam_index_validate_scan", "tuple_get_latest_tid": "heap_get_latest_tid", "parallelscan_estimate": "table_block_parallelscan_estimate", "index_build_range_scan": "heapam_index_build_range_scan", "relation_estimate_size": "heapam_estimate_rel_size", "scan_bitmap_next_block": "heapam_scan_bitmap_next_block", "scan_bitmap_next_tuple": "heapam_scan_bitmap_next_tuple", "scan_sample_next_block": "heapam_scan_sample_next_block", "scan_sample_next_tuple": "heapam_scan_sample_next_tuple", "parallelscan_initialize": "table_block_parallelscan_initialize", "scan_analyze_next_block": "heapam_scan_analyze_next_block", "scan_analyze_next_tuple": "heapam_scan_analyze_next_tuple", "tuple_fetch_row_version": "heapam_fetch_row_version", "tuple_insert_speculative": "heapam_tuple_insert_speculative", "tuple_satisfies_snapshot": "heapam_tuple_satisfies_snapshot", "parallelscan_reinitialize": "table_block_parallelscan_reinitialize", "relation_copy_for_cluster": "heapam_relation_copy_for_cluster", "relation_set_new_filenode": "heapam_relation_set_new_filenode", "relation_fetch_toast_slice": "heap_fetch_toast_slice", "relation_needs_toast_table": "heapam_relation_needs_toast_table", "tuple_complete_speculative": "heapam_tuple_complete_speculative", "compute_xid_horizon_for_tuples": "heap_compute_xid_horizon_for_tuples", "relation_nontransactional_truncate": "heapam_relation_nontransactional_truncate"}, "source_options": [], "protocol_versions": {}}, "comparison_hash": "850336e9baa50632ce39bf1c3673c2fdc1c6f0c399d99c8ead229845b7a7c8d4", "manual_language": "zh", "runtime_verified": false}, "14": {"facts": [{"label": "\u63a5\u53e3\u7c7b\u522b", "value": "\u8868\u8bbf\u95ee\u65b9\u6cd5"}, {"label": "\u5904\u7406\u51fd\u6570\u6216\u4f8b\u7a0b", "value": "heapam_methods"}, {"label": "\u8bb0\u5f55\u7684\u56de\u8c03", "value": "44"}], "tables": [{"key": "callbacks", "rows": [{"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u5143\u7ec4\u69fd", "callback": "slot_callbacks", "implementation": "heapam_slot_callbacks"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u5f00\u59cb\u626b\u63cf", "callback": "scan_begin", "implementation": "heap_beginscan"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u521d\u59cb\u5316\u5e76\u884c\u626b\u63cf", "callback": "parallelscan_initialize", "implementation": "table_block_parallelscan_initialize"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u5f00\u59cb\u7d22\u5f15\u67e5\u627e", "callback": "index_fetch_begin", "implementation": "heapam_index_fetch_begin"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u83b7\u53d6\u6307\u5b9a\u5143\u7ec4", "callback": "index_fetch_tuple", "implementation": "heapam_index_fetch_tuple"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u63d2\u5165\u5143\u7ec4", "callback": "tuple_insert", "implementation": "heapam_tuple_insert"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u66f4\u65b0\u5143\u7ec4", "callback": "tuple_update", "implementation": "heapam_tuple_update"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u5220\u9664\u5143\u7ec4", "callback": "tuple_delete", "implementation": "heapam_tuple_delete"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u5bf9\u5173\u7cfb\u6267\u884c VACUUM", "callback": "relation_vacuum", "implementation": "heap_vacuum_rel"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u5206\u6790\u6570\u636e\u5757", "callback": "scan_analyze_next_block", "implementation": "heapam_scan_analyze_next_block"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "TOAST \u5224\u5b9a", "callback": "relation_needs_toast_table", "implementation": "heapam_relation_needs_toast_table"}], "title": "\u6ce8\u518c\u7684\u63a5\u53e3\u5904\u7406\u51fd\u6570", "columns": [{"key": "feature", "label": "\u63a5\u53e3\u64cd\u4f5c"}, {"key": "state", "label": "\u6e90\u7801\u89c2\u5bdf"}, {"key": "callback", "label": "\u56de\u8c03"}, {"key": "implementation", "label": "\u5b9e\u73b0"}]}], "related": [{"url": "/wiki/catalog/pg_am/?v=14", "label": "\u7cfb\u7edf\u76ee\u5f55 pg_am"}, {"url": "/wiki/guc/default_table_access_method/?v=14", "label": "default_table_access_method"}, {"url": "/wiki/indexam/?v=14", "label": "\u7d22\u5f15\u8bbf\u95ee\u65b9\u6cd5"}], "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://pg.center/docs/14/tableam.html", "path": "tableam.html", "label": "PostgreSQL 14 English manual", "sha256": "935eb557dd2605cec6a969afe4739666db36be6dfb09557293f096a59ea9525a", "language": "en", "original_url": "/docs/14/tableam.html"}, {"url": "https://ftp.postgresql.org/pub/source/v14.24/postgresql-14.24.tar.bz2", "line": 2539, "path": "src/backend/access/heap/heapam_handler.c", "label": "src/backend/access/heap/heapam_handler.c:2539", "sha256": "13ab8be6d597a85414e7d921717eb959d3516e362acb94c3e67926a5b3715e2a", "archive_sha256": "a7fa7ed3d558172355f51406097a7bd4f6b473be80f311ef7cda96bf383d8897"}, {"url": "https://pg.center/docs/14/mvcc-intro.html", "path": "mvcc-intro.html", "label": "PostgreSQL 14 English manual", "sha256": "5007d7da5abbae92e3dbda5590c9171ed73c22a171a29bea875c93464cdcfafa", "language": "en", "original_url": "/docs/14/mvcc-intro.html"}, {"url": "https://pg.center/docs/14/sql-createtable.html", "path": "sql-createtable.html", "label": "PostgreSQL 14 English manual", "sha256": "2d92d1040e37f5d94ce279dc9f1555a720179397fcf3aa8412f5278ec1d943e8", "language": "en", "original_url": "/docs/14/sql-createtable.html"}, {"url": "https://pg.center/docs/14/routine-vacuuming.html", "path": "routine-vacuuming.html", "label": "PostgreSQL 14 English manual", "sha256": "3c8ae732adb6e03978d28407de3a25552b338da62859ddb3c70ca7d7c60d1239", "language": "en", "original_url": "/docs/14/routine-vacuuming.html"}, {"url": "https://pg.center/docs/14/catalog-pg-am.html", "path": "catalog-pg-am.html", "label": "PostgreSQL 14 English manual", "sha256": "a7431722a73e39d7ca74d4d0fa8c51435a442e5cd66564907330493a7b80edd5", "language": "en", "original_url": "/docs/14/catalog-pg-am.html"}], "sections": [{"title": "\u63a5\u53e3\u4e0e\u80fd\u529b\u8fb9\u754c", "paragraphs": ["\u77e9\u9635\u8bb0\u5f55\u6b64\u6e90\u7801\u6784\u5efa\u5b9e\u9645\u6ce8\u518c\u7684\u56de\u8c03\u3002\u6ce8\u518c\u8868\u660e\u5b9e\u73b0\u4e86\u76f8\u5e94\u63a5\u53e3\u94a9\u5b50\uff1b\u64cd\u4f5c\u662f\u5426\u5141\u8bb8\u8fd8\u53d6\u51b3\u4e8e\u9009\u9879\u3001\u67e5\u8be2\u5f62\u5f0f\u3001\u6743\u9650\u548c\u63d0\u4f9b\u65b9\u89c4\u5219\u3002", "\u4e0b\u65b9\u4fdd\u7559\u540c\u7248\u672c\u5b8c\u6574\u624b\u518c\uff0c\u5305\u62ec\u914d\u7f6e\u3001\u7ea6\u675f\u548c\u793a\u4f8b\u3002\u4e0d\u58f0\u79f0\u5df2\u8fdb\u884c\u8fd0\u884c\u65f6\u80fd\u529b\u6d4b\u8bd5\u3002"]}, {"title": "\u5806\u5b58\u50a8\u3001\u53ef\u89c1\u6027\u4e0e WAL", "paragraphs": ["\u6b64\u6e05\u5355\u4ece PostgreSQL 12 \u5f15\u5165\u7684 Table AM \u63a5\u53e3\u5f00\u59cb\u3002\u4e0d\u4f1a\u5c06\u66f4\u65e9\u7248\u672c\u7684 PostgreSQL \u5806\u5b58\u50a8\u91cd\u65b0\u6807\u4e3a Table AM \u5b9e\u73b0\u3002", "\u5806\u53ef\u89c1\u6027\u9075\u5faa PostgreSQL \u5feb\u7167\u3002WAL \u548c\u5d29\u6e83\u6062\u590d\u884c\u4e3a\u53d6\u51b3\u4e8e\u5173\u7cfb\u7684\u6301\u4e45\u6027\uff1b\u4e34\u65f6\u8868\u3001\u65e0\u65e5\u5fd7\u8868\u4e0e\u6c38\u4e45\u8868\u4e0d\u540c\u3002\u7d22\u5f15\u8bbf\u95ee\u65b9\u6cd5\u4e0e\u8868\u5b58\u50a8\u63a5\u53e3\u5206\u5f00\u3002"]}, {"code": "{\n\t.type = T_TableAmRoutine,\n\n\t.slot_callbacks = heapam_slot_callbacks,\n\n\t.scan_begin = heap_beginscan,\n\t.scan_end = heap_endscan,\n\t.scan_rescan = heap_rescan,\n\t.scan_getnextslot = heap_getnextslot,\n\n\t.scan_set_tidrange = heap_set_tidrange,\n\t.scan_getnextslot_tidrange = heap_getnextslot_tidrange,\n\n\t.parallelscan_estimate = table_block_parallelscan_estimate,\n\t.parallelscan_initialize = table_block_parallelscan_initialize,\n\t.parallelscan_reinitialize = table_block_parallelscan_reinitialize,\n\n\t.index_fetch_begin = heapam_index_fetch_begin,\n\t.index_fetch_reset = heapam_index_fetch_reset,\n\t.index_fetch_end = heapam_index_fetch_end,\n\t.index_fetch_tuple = heapam_index_fetch_tuple,\n\n\t.tuple_insert = heapam_tuple_insert,\n\t.tuple_insert_speculative = heapam_tuple_insert_speculative,\n\t.tuple_complete_speculative = heapam_tuple_complete_speculative,\n\t.multi_insert = heap_multi_insert,\n\t.tuple_delete = heapam_tuple_delete,\n\t.tuple_update = heapam_tuple_update,\n\t.tuple_lock = heapam_tuple_lock,\n\n\t.tuple_fetch_row_version = heapam_fetch_row_version,\n\t.tuple_get_latest_tid = heap_get_latest_tid,\n\t.tuple_tid_valid = heapam_tuple_tid_valid,\n\t.tuple_satisfies_snapshot = heapam_tuple_satisfies_snapshot,\n\t.index_delete_tuples = heap_index_delete_tuples,\n\n\t.relation_set_new_filenode = heapam_relation_set_new_filenode,\n\t.relation_nontransactional_truncate = heapam_relation_nontransactional_truncate,\n\t.relation_copy_data = heapam_relation_copy_data,\n\t.relation_copy_for_cluster = heapam_relation_copy_for_cluster,\n\t.relation_vacuum = heap_vacuum_rel,\n\t.scan_analyze_next_block = heapam_scan_analyze_next_block,\n\t.scan_analyze_next_tuple = heapam_scan_analyze_next_tuple,\n\t.index_build_range_scan = heapam_index_build_range_scan,\n\t.index_validate_scan = heapam_index_validate_scan,\n\n\t.relation_size = table_block_relation_size,\n\t.relation_needs_toast_table = heapam_relation_needs_toast_table,\n\t.relation_toast_am = heapam_relation_toast_am,\n\t.relation_fetch_toast_slice = heap_fetch_toast_slice,\n\n\t.relation_estimate_size = heapam_estimate_rel_size,\n\n\t.scan_bitmap_next_block = heapam_scan_bitmap_next_block,\n\t.scan_bitmap_next_tuple = heapam_scan_bitmap_next_tuple,\n\t.scan_sample_next_block = heapam_scan_sample_next_block,\n\t.scan_sample_next_tuple = heapam_scan_sample_next_tuple\n}", "title": "\u6838\u5fc3\u6e90\u7801\u4e2d\u6ce8\u518c\u7684\u5b9e\u73b0"}], "callbacks": {"scan_end": "heap_endscan", "scan_begin": "heap_beginscan", "tuple_lock": "heapam_tuple_lock", "scan_rescan": "heap_rescan", "multi_insert": "heap_multi_insert", "tuple_delete": "heapam_tuple_delete", "tuple_insert": "heapam_tuple_insert", "tuple_update": "heapam_tuple_update", "relation_size": "table_block_relation_size", "slot_callbacks": "heapam_slot_callbacks", "index_fetch_end": "heapam_index_fetch_end", "relation_vacuum": "heap_vacuum_rel", "tuple_tid_valid": "heapam_tuple_tid_valid", "scan_getnextslot": "heap_getnextslot", "index_fetch_begin": "heapam_index_fetch_begin", "index_fetch_reset": "heapam_index_fetch_reset", "index_fetch_tuple": "heapam_index_fetch_tuple", "relation_toast_am": "heapam_relation_toast_am", "scan_set_tidrange": "heap_set_tidrange", "relation_copy_data": "heapam_relation_copy_data", "index_delete_tuples": "heap_index_delete_tuples", "index_validate_scan": "heapam_index_validate_scan", "tuple_get_latest_tid": "heap_get_latest_tid", "parallelscan_estimate": "table_block_parallelscan_estimate", "index_build_range_scan": "heapam_index_build_range_scan", "relation_estimate_size": "heapam_estimate_rel_size", "scan_bitmap_next_block": "heapam_scan_bitmap_next_block", "scan_bitmap_next_tuple": "heapam_scan_bitmap_next_tuple", "scan_sample_next_block": "heapam_scan_sample_next_block", "scan_sample_next_tuple": "heapam_scan_sample_next_tuple", "parallelscan_initialize": "table_block_parallelscan_initialize", "scan_analyze_next_block": "heapam_scan_analyze_next_block", "scan_analyze_next_tuple": "heapam_scan_analyze_next_tuple", "tuple_fetch_row_version": "heapam_fetch_row_version", "tuple_insert_speculative": "heapam_tuple_insert_speculative", "tuple_satisfies_snapshot": "heapam_tuple_satisfies_snapshot", "parallelscan_reinitialize": "table_block_parallelscan_reinitialize", "relation_copy_for_cluster": "heapam_relation_copy_for_cluster", "relation_set_new_filenode": "heapam_relation_set_new_filenode", "scan_getnextslot_tidrange": "heap_getnextslot_tidrange", "relation_fetch_toast_slice": "heap_fetch_toast_slice", "relation_needs_toast_table": "heapam_relation_needs_toast_table", "tuple_complete_speculative": "heapam_tuple_complete_speculative", "relation_nontransactional_truncate": "heapam_relation_nontransactional_truncate"}, "description": ["\u5185\u7f6e heap \u8868\u8bbf\u95ee\u65b9\u6cd5\u5c06\u5143\u7ec4\u5b58\u50a8\u3001\u53ef\u89c1\u6027\u3001\u626b\u63cf\u3001\u7d22\u5f15\u83b7\u53d6\u548c\u7ef4\u62a4\u64cd\u4f5c\u96c6\u6210\u5230 PostgreSQL \u4e2d\u3002"], "manual_html": "<div class=\"chapter\" id=\"TABLEAM\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h2 class=\"title\" lang=\"zh\">\u7b2c 61 \u7ae0. Table Access Method Interface Definition</h2>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u672c\u7ae0\u8bf4\u660e <span class=\"productname\">PostgreSQL</span> \u6838\u5fc3\u7cfb\u7edf\u4e0e\u7ba1\u7406\u8868\u5b58\u50a8\u7684<em class=\"firstterm\">\u8868\u8bbf\u95ee\u65b9\u6cd5</em>\u4e4b\u95f4\u7684\u63a5\u53e3\u3002\u9664\u8fd9\u91cc\u89c4\u5b9a\u7684\u5185\u5bb9\u4e4b\u5916\uff0c\u6838\u5fc3\u7cfb\u7edf\u5bf9\u8fd9\u4e9b\u8bbf\u95ee\u65b9\u6cd5\u77e5\u4e4b\u751a\u5c11\uff0c\u56e0\u6b64\u53ef\u4ee5\u901a\u8fc7\u7f16\u5199\u9644\u52a0\u4ee3\u7801\u6765\u5f00\u53d1\u5168\u65b0\u7684\u8bbf\u95ee\u65b9\u6cd5\u7c7b\u578b\u3002</p>\n<p lang=\"zh\">\u6bcf\u4e2a\u8868\u8bbf\u95ee\u65b9\u6cd5\u90fd\u7531\u7cfb\u7edf\u76ee\u5f55 <a class=\"link\" href=\"/docs/14/catalog-pg-am.html\" title=\"52.3.\u00a0pg_am\"><code class=\"structname\">pg_am</code></a> \u4e2d\u7684\u4e00\u884c\u63cf\u8ff0\u3002<code class=\"structname\">pg_am</code> \u6761\u76ee\u6307\u5b9a\u4e86\u8be5\u8868\u8bbf\u95ee\u65b9\u6cd5\u7684\u540d\u79f0\u4ee5\u53ca\u4e00\u4e2a<em class=\"firstterm\">\u5904\u7406\u5668\u51fd\u6570</em>\u3002\u8fd9\u4e9b\u6761\u76ee\u53ef\u4ee5\u901a\u8fc7<a class=\"xref\" href=\"/docs/14/sql-create-access-method.html\" title=\"CREATE ACCESS METHOD\"><span class=\"refentrytitle\">CREATE ACCESS METHOD</span></a>\u548c<a class=\"xref\" href=\"/docs/14/sql-drop-access-method.html\" title=\"DROP ACCESS METHOD\"><span class=\"refentrytitle\">DROP ACCESS METHOD</span></a> SQL \u547d\u4ee4\u521b\u5efa\u548c\u5220\u9664\u3002</p>\n<p lang=\"zh\">\u8868\u8bbf\u95ee\u65b9\u6cd5\u7684\u5904\u7406\u5668\u51fd\u6570\u5fc5\u987b\u58f0\u660e\u4e3a\u63a5\u53d7\u4e00\u4e2a <code class=\"type\">internal</code> \u7c7b\u578b\u7684\u53c2\u6570\uff0c\u5e76\u8fd4\u56de\u4f2a\u7c7b\u578b <code class=\"type\">table_am_handler</code>\u3002\u8fd9\u4e2a\u53c2\u6570\u53ea\u662f\u4e00\u4e2a\u5360\u4f4d\u503c\uff0c\u7528\u6765\u9632\u6b62\u5904\u7406\u5668\u51fd\u6570\u88ab SQL \u547d\u4ee4\u76f4\u63a5\u8c03\u7528\u3002\u8be5\u51fd\u6570\u7684\u7ed3\u679c\u5fc5\u987b\u662f\u4e00\u4e2a\u6307\u5411 <code class=\"structname\">TableAmRoutine</code> \u7ed3\u6784\u4f53\u7684\u6307\u9488\uff0c\u5176\u4e2d\u5305\u542b\u6838\u5fc3\u4ee3\u7801\u4f7f\u7528\u8be5\u8868\u8bbf\u95ee\u65b9\u6cd5\u6240\u9700\u7684\u5168\u90e8\u4fe1\u606f\u3002\u8fd4\u56de\u503c\u9700\u8981\u5177\u6709\u670d\u52a1\u5668\u751f\u547d\u5468\u671f\uff0c\u8fd9\u901a\u5e38\u901a\u8fc7\u5c06\u5176\u5b9a\u4e49\u4e3a\u5168\u5c40\u4f5c\u7528\u57df\u4e2d\u7684 <code class=\"literal\">static const</code> \u53d8\u91cf\u6765\u5b9e\u73b0\u3002<code class=\"structname\">TableAmRoutine</code> \u7ed3\u6784\u4f53\u4e5f\u79f0\u4e3a\u8be5\u8bbf\u95ee\u65b9\u6cd5\u7684<em class=\"firstterm\">API \u7ed3\u6784\u4f53</em>\uff0c\u5b83\u901a\u8fc7\u56de\u8c03\u6765\u5b9a\u4e49\u8bbf\u95ee\u65b9\u6cd5\u7684\u884c\u4e3a\u3002\u8fd9\u4e9b\u56de\u8c03\u662f\u666e\u901a C \u51fd\u6570\u7684\u6307\u9488\uff0c\u5728 SQL \u5c42\u65e2\u4e0d\u53ef\u89c1\u4e5f\u4e0d\u53ef\u8c03\u7528\u3002\u6240\u6709\u56de\u8c03\u53ca\u5176\u884c\u4e3a\u90fd\u5b9a\u4e49\u5728 <code class=\"structname\">TableAmRoutine</code> \u7ed3\u6784\u4f53\u4e2d\uff08\u7ed3\u6784\u4f53\u5185\u7684\u6ce8\u91ca\u8bf4\u660e\u4e86\u5bf9\u56de\u8c03\u7684\u8981\u6c42\uff09\u3002\u5927\u591a\u6570\u56de\u8c03\u90fd\u6709\u5305\u88c5\u51fd\u6570\uff0c\u5176\u6587\u6863\u662f\u4ece\u8868\u8bbf\u95ee\u65b9\u6cd5\u4f7f\u7528\u8005\u800c\u975e\u5b9e\u73b0\u8005\u7684\u89d2\u5ea6\u7f16\u5199\u7684\u3002\u8be6\u60c5\u8bf7\u53c2\u9605 <a class=\"ulink\" href=\"https://git.postgresql.org/gitweb/?p=postgresql.git;a=blob;f=src/include/access/tableam.h;hb=HEAD\" target=\"_top\"><code class=\"filename\">src/include/access/tableam.h</code></a> \u6587\u4ef6\u3002</p>\n<p lang=\"zh\">\u5b9e\u73b0\u8bbf\u95ee\u65b9\u6cd5\u65f6\uff0c\u901a\u5e38\u9700\u8981\u5b9e\u73b0\u4e13\u7528\u7684\u5143\u7ec4\u8868\u69fd\u4f4d\u7c7b\u578b\uff08\u53c2\u89c1 src/include/executor/tuptable.h\uff09\uff0c\u4f7f\u8bbf\u95ee\u65b9\u6cd5\u4e4b\u5916\u7684\u4ee3\u7801\u53ef\u4ee5\u6301\u6709\u8be5\u65b9\u6cd5\u7684\u5143\u7ec4\u5f15\u7528\uff0c\u5e76\u8bbf\u95ee\u5143\u7ec4\u5404\u5217\u3002</p>\n<p lang=\"zh\">\u76ee\u524d\uff0cAM \u5b9e\u9645\u5b58\u50a8\u6570\u636e\u7684\u65b9\u5f0f\u6240\u53d7\u9650\u5236\u76f8\u5f53\u5c11\u3002\u4f8b\u5982\uff0c\u53ef\u4ee5\u4f7f\u7528 postgres \u7684\u5171\u4eab\u7f13\u51b2\u533a\u7f13\u5b58\uff0c\u4f46\u8fd9\u5e76\u975e\u5fc5\u9700\u3002\u5982\u679c\u4f7f\u7528\u5b83\uff0c\u90a3\u4e48\u91c7\u7528 <span class=\"productname\">PostgreSQL</span> \u5728<a class=\"xref\" href=\"/docs/14/storage-page-layout.html\" title=\"70.6.\u00a0\u6570\u636e\u5e93\u9875\u9762\u5e03\u5c40\">\u7b2c\u00a070.6\u00a0\u8282</a>\u4e2d\u63cf\u8ff0\u7684\u6807\u51c6\u9875\u9762\u5e03\u5c40\u901a\u5e38\u662f\u6709\u610f\u4e49\u7684\u3002</p>\n<p lang=\"zh\">\u8868\u8bbf\u95ee\u65b9\u6cd5 API \u76ee\u524d\u7684\u4e00\u9879\u8f83\u5927\u9650\u5236\u662f\uff1a\u82e5\u8bbf\u95ee\u65b9\u6cd5\u5e0c\u671b\u652f\u6301\u4fee\u6539\u64cd\u4f5c\u548c/\u6216\u7d22\u5f15\uff0c\u6bcf\u4e2a\u5143\u7ec4\u5fc5\u987b\u6709\u4e00\u4e2a\u7531\u5757\u53f7\u548c\u9879\u53f7\u7ec4\u6210\u7684\u5143\u7ec4\u6807\u8bc6\u7b26 TID\uff08\u53e6\u89c1\u7b2c 70.6 \u8282\uff09\u3002TID \u5404\u90e8\u5206\u4e0d\u5fc5\u5177\u6709\u4e0e heap \u4e2d\u5b8c\u5168\u76f8\u540c\u7684\u542b\u4e49\uff1b\u4f46\u5982\u679c\u8981\u652f\u6301\u53ef\u9009\u7684\u4f4d\u56fe\u626b\u63cf\uff0c\u5757\u53f7\u5c31\u9700\u8981\u63d0\u4f9b\u5c40\u90e8\u6027\u3002</p>\n<p lang=\"zh\">\u4e3a\u4fdd\u8bc1\u5d29\u6e83\u5b89\u5168\uff0cAM \u53ef\u4ee5\u4f7f\u7528 <span class=\"productname\">PostgreSQL</span> \u7684<a class=\"link\" href=\"/docs/14/wal.html\" title=\"\u7b2c\u00a030\u00a0\u7ae0\u00a0\u53ef\u9760\u6027\u4e0e\u9884\u5199\u5f0f\u65e5\u5fd7\"><acronym class=\"acronym\">WAL</acronym></a>\uff0c\u4e5f\u53ef\u4ee5\u4f7f\u7528\u81ea\u5b9a\u4e49\u5b9e\u73b0\u3002\u5982\u679c\u9009\u62e9\u4e86 <acronym class=\"acronym\">WAL</acronym>\uff0c\u53ef\u4ee5\u4f7f\u7528<a class=\"link\" href=\"/docs/14/generic-wal.html\" title=\"\u7b2c\u00a063\u00a0\u7ae0\u00a0\u901a\u7528 WAL \u8bb0\u5f55\">\u901a\u7528 WAL \u8bb0\u5f55</a>\uff0c\u4e5f\u53ef\u4ee5\u5b9e\u73b0\u4e00\u79cd\u65b0\u7684 <acronym class=\"acronym\">WAL</acronym> \u8bb0\u5f55\u7c7b\u578b\u3002\u901a\u7528 WAL \u8bb0\u5f55\u4f7f\u7528\u7b80\u5355\uff0c\u4f46\u610f\u5473\u7740\u66f4\u5927\u7684 WAL \u91cf\u3002\u76ee\u524d\u5b9e\u73b0\u65b0\u7684 WAL \u8bb0\u5f55\u7c7b\u578b\u9700\u8981\u4fee\u6539\u6838\u5fc3\u4ee3\u7801\uff08\u5177\u4f53\u6765\u8bf4\u662f <code class=\"filename\">src/include/access/rmgrlist.h</code>\uff09\u3002</p>\n<p lang=\"zh\">\u8981\u4ee5\u5141\u8bb8\u5728\u5355\u4e2a\u4e8b\u52a1\u4e2d\u8bbf\u95ee\u4e0d\u540c\u8868\u8bbf\u95ee\u65b9\u6cd5\u7684\u65b9\u5f0f\u5b9e\u73b0\u4e8b\u52a1\u652f\u6301\uff0c\u5f88\u53ef\u80fd\u9700\u8981\u4e0e <code class=\"filename\">src/backend/access/transam/xlog.c</code> \u4e2d\u7684\u673a\u5236\u7d27\u5bc6\u96c6\u6210\u3002</p>\n<p lang=\"zh\">\u5f00\u53d1\u65b0\u7684\u8868\u8bbf\u95ee\u65b9\u6cd5\u65f6\uff0c\u53ef\u4ee5\u53c2\u7167 src/backend/access/heap/heapam_handler.c \u4e2d\u73b0\u6709\u7684\u5806\u5b9e\u73b0\uff0c\u4e86\u89e3\u5b9e\u73b0\u7ec6\u8282\u3002</p>\n</div>", "manual_path": "/docs/14/tableam.html", "localization": {"status": "complete", "sources": [{"url": "/docs/14/tableam.html", "method": "same-major semantic node", "sha256": "7d4f5f4e5bad53c80eb27ff81884bfa98d1fa447df8dd24a37806189a541a350", "language": "zh", "matched_nodes": ["#TABLEAM/p[10]", "#TABLEAM/p[3]", "#TABLEAM/p[4]", "#TABLEAM/p[5]", "#TABLEAM/p[7]", "#TABLEAM/p[9]"]}], "language": "zh", "original_text": {"/versions/14/description/0": "The built-in heap table access method integrates tuple storage, visibility, scans, index fetches and maintenance with PostgreSQL.", "/versions/14/facts/0/label": "Interface family", "/versions/14/facts/0/value": "Table access method", "/versions/14/facts/1/label": "Handler or routine", "/versions/14/facts/2/label": "Recorded callbacks", "/versions/14/tables/0/title": "Registered interface handlers", "/versions/14/related/0/label": "System catalog pg_am", "/versions/14/related/2/label": "Index AM", "/versions/14/sections/0/title": "Interface and capability boundaries", "/versions/14/sections/1/title": "Heap storage, visibility and WAL", "/versions/14/sections/2/title": "Registered implementation in core source", "/versions/14/tables/0/rows/0/state": "Handler registered; conditions apply", "/versions/14/tables/0/rows/1/state": "Handler registered; conditions apply", "/versions/14/tables/0/rows/2/state": "Handler registered; conditions apply", "/versions/14/tables/0/rows/3/state": "Handler registered; conditions apply", "/versions/14/tables/0/rows/4/state": "Handler registered; conditions apply", "/versions/14/tables/0/rows/5/state": "Handler registered; conditions apply", "/versions/14/tables/0/rows/6/state": "Handler registered; conditions apply", "/versions/14/tables/0/rows/7/state": "Handler registered; conditions apply", "/versions/14/tables/0/rows/8/state": "Handler registered; conditions apply", "/versions/14/tables/0/rows/9/state": "Handler registered; conditions apply", "/versions/14/tables/0/rows/10/state": "Handler registered; conditions apply", "/versions/14/sections/0/paragraphs/0": "The matrix records callbacks actually registered in this source build. Registration identifies an implemented interface hook; options, query shape, privileges and provider rules determine whether an operation is allowed.", "/versions/14/sections/0/paragraphs/1": "The complete same-version manual below retains configuration, constraints and examples. No runtime capability test is claimed.", "/versions/14/sections/1/paragraphs/0": "This inventory starts with the Table AM interface in PostgreSQL 12. Earlier PostgreSQL heap storage is not relabeled as a Table AM implementation.", "/versions/14/sections/1/paragraphs/1": "Heap visibility follows PostgreSQL snapshots. WAL and crash-recovery behavior depend on relation persistence; temporary and unlogged tables differ from permanent tables. Index access methods remain separate from the table storage interface.", "/versions/14/tables/0/rows/0/feature": "Tuple slot", "/versions/14/tables/0/rows/1/feature": "Begin scan", "/versions/14/tables/0/rows/2/feature": "Parallel scan initialization", "/versions/14/tables/0/rows/3/feature": "Begin index lookup", "/versions/14/tables/0/rows/4/feature": "Fetch identified tuple", "/versions/14/tables/0/rows/5/feature": "Insert tuple", "/versions/14/tables/0/rows/6/feature": "Update tuple", "/versions/14/tables/0/rows/7/feature": "Delete tuple", "/versions/14/tables/0/rows/8/feature": "Vacuum relation", "/versions/14/tables/0/rows/9/feature": "Analyze block", "/versions/14/tables/0/columns/0/label": "Interface operation", "/versions/14/tables/0/columns/1/label": "Source observation", "/versions/14/tables/0/columns/2/label": "Callback", "/versions/14/tables/0/columns/3/label": "Implementation", "/versions/14/tables/0/rows/10/feature": "TOAST decision"}, "fallback_fields": [], "source_language": "en", "original_snapshot_sha256": "19f27da0dd95d5a4ca75384201d11d2779ab7c8190ffe696ff56f60c24a62285"}, "evidence_kind": "source and documentation", "comparison_data": {"options": [], "callbacks": {"scan_end": "heap_endscan", "scan_begin": "heap_beginscan", "tuple_lock": "heapam_tuple_lock", "scan_rescan": "heap_rescan", "multi_insert": "heap_multi_insert", "tuple_delete": "heapam_tuple_delete", "tuple_insert": "heapam_tuple_insert", "tuple_update": "heapam_tuple_update", "relation_size": "table_block_relation_size", "slot_callbacks": "heapam_slot_callbacks", "index_fetch_end": "heapam_index_fetch_end", "relation_vacuum": "heap_vacuum_rel", "tuple_tid_valid": "heapam_tuple_tid_valid", "scan_getnextslot": "heap_getnextslot", "index_fetch_begin": "heapam_index_fetch_begin", "index_fetch_reset": "heapam_index_fetch_reset", "index_fetch_tuple": "heapam_index_fetch_tuple", "relation_toast_am": "heapam_relation_toast_am", "scan_set_tidrange": "heap_set_tidrange", "relation_copy_data": "heapam_relation_copy_data", "index_delete_tuples": "heap_index_delete_tuples", "index_validate_scan": "heapam_index_validate_scan", "tuple_get_latest_tid": "heap_get_latest_tid", "parallelscan_estimate": "table_block_parallelscan_estimate", "index_build_range_scan": "heapam_index_build_range_scan", "relation_estimate_size": "heapam_estimate_rel_size", "scan_bitmap_next_block": "heapam_scan_bitmap_next_block", "scan_bitmap_next_tuple": "heapam_scan_bitmap_next_tuple", "scan_sample_next_block": "heapam_scan_sample_next_block", "scan_sample_next_tuple": "heapam_scan_sample_next_tuple", "parallelscan_initialize": "table_block_parallelscan_initialize", "scan_analyze_next_block": "heapam_scan_analyze_next_block", "scan_analyze_next_tuple": "heapam_scan_analyze_next_tuple", "tuple_fetch_row_version": "heapam_fetch_row_version", "tuple_insert_speculative": "heapam_tuple_insert_speculative", "tuple_satisfies_snapshot": "heapam_tuple_satisfies_snapshot", "parallelscan_reinitialize": "table_block_parallelscan_reinitialize", "relation_copy_for_cluster": "heapam_relation_copy_for_cluster", "relation_set_new_filenode": "heapam_relation_set_new_filenode", "scan_getnextslot_tidrange": "heap_getnextslot_tidrange", "relation_fetch_toast_slice": "heap_fetch_toast_slice", "relation_needs_toast_table": "heapam_relation_needs_toast_table", "tuple_complete_speculative": "heapam_tuple_complete_speculative", "relation_nontransactional_truncate": "heapam_relation_nontransactional_truncate"}, "source_options": [], "protocol_versions": {}}, "comparison_hash": "eee603c9509a489abd6ec6a12129951277b59ad8334e2edc6299d8edd5fa0e38", "manual_language": "zh", "runtime_verified": false}, "15": {"facts": [{"label": "\u63a5\u53e3\u7c7b\u522b", "value": "\u8868\u8bbf\u95ee\u65b9\u6cd5"}, {"label": "\u5904\u7406\u51fd\u6570\u6216\u4f8b\u7a0b", "value": "heapam_methods"}, {"label": "\u8bb0\u5f55\u7684\u56de\u8c03", "value": "44"}], "tables": [{"key": "callbacks", "rows": [{"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u5143\u7ec4\u69fd", "callback": "slot_callbacks", "implementation": "heapam_slot_callbacks"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u5f00\u59cb\u626b\u63cf", "callback": "scan_begin", "implementation": "heap_beginscan"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u521d\u59cb\u5316\u5e76\u884c\u626b\u63cf", "callback": "parallelscan_initialize", "implementation": "table_block_parallelscan_initialize"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u5f00\u59cb\u7d22\u5f15\u67e5\u627e", "callback": "index_fetch_begin", "implementation": "heapam_index_fetch_begin"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u83b7\u53d6\u6307\u5b9a\u5143\u7ec4", "callback": "index_fetch_tuple", "implementation": "heapam_index_fetch_tuple"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u63d2\u5165\u5143\u7ec4", "callback": "tuple_insert", "implementation": "heapam_tuple_insert"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u66f4\u65b0\u5143\u7ec4", "callback": "tuple_update", "implementation": "heapam_tuple_update"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u5220\u9664\u5143\u7ec4", "callback": "tuple_delete", "implementation": "heapam_tuple_delete"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u5bf9\u5173\u7cfb\u6267\u884c VACUUM", "callback": "relation_vacuum", "implementation": "heap_vacuum_rel"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u5206\u6790\u6570\u636e\u5757", "callback": "scan_analyze_next_block", "implementation": "heapam_scan_analyze_next_block"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "TOAST \u5224\u5b9a", "callback": "relation_needs_toast_table", "implementation": "heapam_relation_needs_toast_table"}], "title": "\u6ce8\u518c\u7684\u63a5\u53e3\u5904\u7406\u51fd\u6570", "columns": [{"key": "feature", "label": "\u63a5\u53e3\u64cd\u4f5c"}, {"key": "state", "label": "\u6e90\u7801\u89c2\u5bdf"}, {"key": "callback", "label": "\u56de\u8c03"}, {"key": "implementation", "label": "\u5b9e\u73b0"}]}], "related": [{"url": "/wiki/catalog/pg_am/?v=15", "label": "\u7cfb\u7edf\u76ee\u5f55 pg_am"}, {"url": "/wiki/guc/default_table_access_method/?v=15", "label": "default_table_access_method"}, {"url": "/wiki/indexam/?v=15", "label": "\u7d22\u5f15\u8bbf\u95ee\u65b9\u6cd5"}], "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://pg.center/docs/15/tableam.html", "path": "tableam.html", "label": "PostgreSQL 15 English manual", "sha256": "5ee4097a59afae0117b872700e0a36e63b92fdbefd8a1cc59fd2d77dee35dcc3", "language": "en", "original_url": "/docs/15/tableam.html"}, {"url": "https://ftp.postgresql.org/pub/source/v15.19/postgresql-15.19.tar.bz2", "line": 2538, "path": "src/backend/access/heap/heapam_handler.c", "label": "src/backend/access/heap/heapam_handler.c:2538", "sha256": "defee509717f844e43f49497885213030e3bbf0c4f94ea9706605db9d74effe4", "archive_sha256": "e1a64a87a46b825b88c082e4518161a47aab53c45694964f8ba1df28f7859f89"}, {"url": "https://pg.center/docs/15/mvcc-intro.html", "path": "mvcc-intro.html", "label": "PostgreSQL 15 English manual", "sha256": "560c3702c5ba7ce54cd9ab5c0b7548859fa73c2bc1e560a5cb12955a34d550b9", "language": "en", "original_url": "/docs/15/mvcc-intro.html"}, {"url": "https://pg.center/docs/15/sql-createtable.html", "path": "sql-createtable.html", "label": "PostgreSQL 15 English manual", "sha256": "dcb246be9d6131c7227ccde6745458865a0c97ac4c8891c2cbea73a30769d6df", "language": "en", "original_url": "/docs/15/sql-createtable.html"}, {"url": "https://pg.center/docs/15/routine-vacuuming.html", "path": "routine-vacuuming.html", "label": "PostgreSQL 15 English manual", "sha256": "ea4f9434e9f615892aec6bdd734639a8f68968e7e5a447a7819ed64936602def", "language": "en", "original_url": "/docs/15/routine-vacuuming.html"}, {"url": "https://pg.center/docs/15/catalog-pg-am.html", "path": "catalog-pg-am.html", "label": "PostgreSQL 15 English manual", "sha256": "afaeb26977cb9fa6503500d6eff1bc108f5ac76cc80185345bcde2b8e39c9c93", "language": "en", "original_url": "/docs/15/catalog-pg-am.html"}], "sections": [{"title": "\u63a5\u53e3\u4e0e\u80fd\u529b\u8fb9\u754c", "paragraphs": ["\u77e9\u9635\u8bb0\u5f55\u6b64\u6e90\u7801\u6784\u5efa\u5b9e\u9645\u6ce8\u518c\u7684\u56de\u8c03\u3002\u6ce8\u518c\u8868\u660e\u5b9e\u73b0\u4e86\u76f8\u5e94\u63a5\u53e3\u94a9\u5b50\uff1b\u64cd\u4f5c\u662f\u5426\u5141\u8bb8\u8fd8\u53d6\u51b3\u4e8e\u9009\u9879\u3001\u67e5\u8be2\u5f62\u5f0f\u3001\u6743\u9650\u548c\u63d0\u4f9b\u65b9\u89c4\u5219\u3002", "\u4e0b\u65b9\u4fdd\u7559\u540c\u7248\u672c\u5b8c\u6574\u624b\u518c\uff0c\u5305\u62ec\u914d\u7f6e\u3001\u7ea6\u675f\u548c\u793a\u4f8b\u3002\u4e0d\u58f0\u79f0\u5df2\u8fdb\u884c\u8fd0\u884c\u65f6\u80fd\u529b\u6d4b\u8bd5\u3002"]}, {"title": "\u5806\u5b58\u50a8\u3001\u53ef\u89c1\u6027\u4e0e WAL", "paragraphs": ["\u6b64\u6e05\u5355\u4ece PostgreSQL 12 \u5f15\u5165\u7684 Table AM \u63a5\u53e3\u5f00\u59cb\u3002\u4e0d\u4f1a\u5c06\u66f4\u65e9\u7248\u672c\u7684 PostgreSQL \u5806\u5b58\u50a8\u91cd\u65b0\u6807\u4e3a Table AM \u5b9e\u73b0\u3002", "\u5806\u53ef\u89c1\u6027\u9075\u5faa PostgreSQL \u5feb\u7167\u3002WAL \u548c\u5d29\u6e83\u6062\u590d\u884c\u4e3a\u53d6\u51b3\u4e8e\u5173\u7cfb\u7684\u6301\u4e45\u6027\uff1b\u4e34\u65f6\u8868\u3001\u65e0\u65e5\u5fd7\u8868\u4e0e\u6c38\u4e45\u8868\u4e0d\u540c\u3002\u7d22\u5f15\u8bbf\u95ee\u65b9\u6cd5\u4e0e\u8868\u5b58\u50a8\u63a5\u53e3\u5206\u5f00\u3002"]}, {"code": "{\n\t.type = T_TableAmRoutine,\n\n\t.slot_callbacks = heapam_slot_callbacks,\n\n\t.scan_begin = heap_beginscan,\n\t.scan_end = heap_endscan,\n\t.scan_rescan = heap_rescan,\n\t.scan_getnextslot = heap_getnextslot,\n\n\t.scan_set_tidrange = heap_set_tidrange,\n\t.scan_getnextslot_tidrange = heap_getnextslot_tidrange,\n\n\t.parallelscan_estimate = table_block_parallelscan_estimate,\n\t.parallelscan_initialize = table_block_parallelscan_initialize,\n\t.parallelscan_reinitialize = table_block_parallelscan_reinitialize,\n\n\t.index_fetch_begin = heapam_index_fetch_begin,\n\t.index_fetch_reset = heapam_index_fetch_reset,\n\t.index_fetch_end = heapam_index_fetch_end,\n\t.index_fetch_tuple = heapam_index_fetch_tuple,\n\n\t.tuple_insert = heapam_tuple_insert,\n\t.tuple_insert_speculative = heapam_tuple_insert_speculative,\n\t.tuple_complete_speculative = heapam_tuple_complete_speculative,\n\t.multi_insert = heap_multi_insert,\n\t.tuple_delete = heapam_tuple_delete,\n\t.tuple_update = heapam_tuple_update,\n\t.tuple_lock = heapam_tuple_lock,\n\n\t.tuple_fetch_row_version = heapam_fetch_row_version,\n\t.tuple_get_latest_tid = heap_get_latest_tid,\n\t.tuple_tid_valid = heapam_tuple_tid_valid,\n\t.tuple_satisfies_snapshot = heapam_tuple_satisfies_snapshot,\n\t.index_delete_tuples = heap_index_delete_tuples,\n\n\t.relation_set_new_filenode = heapam_relation_set_new_filenode,\n\t.relation_nontransactional_truncate = heapam_relation_nontransactional_truncate,\n\t.relation_copy_data = heapam_relation_copy_data,\n\t.relation_copy_for_cluster = heapam_relation_copy_for_cluster,\n\t.relation_vacuum = heap_vacuum_rel,\n\t.scan_analyze_next_block = heapam_scan_analyze_next_block,\n\t.scan_analyze_next_tuple = heapam_scan_analyze_next_tuple,\n\t.index_build_range_scan = heapam_index_build_range_scan,\n\t.index_validate_scan = heapam_index_validate_scan,\n\n\t.relation_size = table_block_relation_size,\n\t.relation_needs_toast_table = heapam_relation_needs_toast_table,\n\t.relation_toast_am = heapam_relation_toast_am,\n\t.relation_fetch_toast_slice = heap_fetch_toast_slice,\n\n\t.relation_estimate_size = heapam_estimate_rel_size,\n\n\t.scan_bitmap_next_block = heapam_scan_bitmap_next_block,\n\t.scan_bitmap_next_tuple = heapam_scan_bitmap_next_tuple,\n\t.scan_sample_next_block = heapam_scan_sample_next_block,\n\t.scan_sample_next_tuple = heapam_scan_sample_next_tuple\n}", "title": "\u6838\u5fc3\u6e90\u7801\u4e2d\u6ce8\u518c\u7684\u5b9e\u73b0"}], "callbacks": {"scan_end": "heap_endscan", "scan_begin": "heap_beginscan", "tuple_lock": "heapam_tuple_lock", "scan_rescan": "heap_rescan", "multi_insert": "heap_multi_insert", "tuple_delete": "heapam_tuple_delete", "tuple_insert": "heapam_tuple_insert", "tuple_update": "heapam_tuple_update", "relation_size": "table_block_relation_size", "slot_callbacks": "heapam_slot_callbacks", "index_fetch_end": "heapam_index_fetch_end", "relation_vacuum": "heap_vacuum_rel", "tuple_tid_valid": "heapam_tuple_tid_valid", "scan_getnextslot": "heap_getnextslot", "index_fetch_begin": "heapam_index_fetch_begin", "index_fetch_reset": "heapam_index_fetch_reset", "index_fetch_tuple": "heapam_index_fetch_tuple", "relation_toast_am": "heapam_relation_toast_am", "scan_set_tidrange": "heap_set_tidrange", "relation_copy_data": "heapam_relation_copy_data", "index_delete_tuples": "heap_index_delete_tuples", "index_validate_scan": "heapam_index_validate_scan", "tuple_get_latest_tid": "heap_get_latest_tid", "parallelscan_estimate": "table_block_parallelscan_estimate", "index_build_range_scan": "heapam_index_build_range_scan", "relation_estimate_size": "heapam_estimate_rel_size", "scan_bitmap_next_block": "heapam_scan_bitmap_next_block", "scan_bitmap_next_tuple": "heapam_scan_bitmap_next_tuple", "scan_sample_next_block": "heapam_scan_sample_next_block", "scan_sample_next_tuple": "heapam_scan_sample_next_tuple", "parallelscan_initialize": "table_block_parallelscan_initialize", "scan_analyze_next_block": "heapam_scan_analyze_next_block", "scan_analyze_next_tuple": "heapam_scan_analyze_next_tuple", "tuple_fetch_row_version": "heapam_fetch_row_version", "tuple_insert_speculative": "heapam_tuple_insert_speculative", "tuple_satisfies_snapshot": "heapam_tuple_satisfies_snapshot", "parallelscan_reinitialize": "table_block_parallelscan_reinitialize", "relation_copy_for_cluster": "heapam_relation_copy_for_cluster", "relation_set_new_filenode": "heapam_relation_set_new_filenode", "scan_getnextslot_tidrange": "heap_getnextslot_tidrange", "relation_fetch_toast_slice": "heap_fetch_toast_slice", "relation_needs_toast_table": "heapam_relation_needs_toast_table", "tuple_complete_speculative": "heapam_tuple_complete_speculative", "relation_nontransactional_truncate": "heapam_relation_nontransactional_truncate"}, "description": ["\u5185\u7f6e heap \u8868\u8bbf\u95ee\u65b9\u6cd5\u5c06\u5143\u7ec4\u5b58\u50a8\u3001\u53ef\u89c1\u6027\u3001\u626b\u63cf\u3001\u7d22\u5f15\u83b7\u53d6\u548c\u7ef4\u62a4\u64cd\u4f5c\u96c6\u6210\u5230 PostgreSQL \u4e2d\u3002"], "manual_html": "<div class=\"chapter\" id=\"TABLEAM\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h2 class=\"title\" lang=\"zh\">\u7b2c 63 \u7ae0. Table Access Method Interface Definition</h2>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u672c\u7ae0\u8bf4\u660e <span class=\"productname\">PostgreSQL</span> \u6838\u5fc3\u7cfb\u7edf\u4e0e\u7ba1\u7406\u8868\u5b58\u50a8\u7684<em class=\"firstterm\">\u8868\u8bbf\u95ee\u65b9\u6cd5</em>\u4e4b\u95f4\u7684\u63a5\u53e3\u3002\u9664\u8fd9\u91cc\u89c4\u5b9a\u7684\u5185\u5bb9\u4e4b\u5916\uff0c\u6838\u5fc3\u7cfb\u7edf\u5bf9\u8fd9\u4e9b\u8bbf\u95ee\u65b9\u6cd5\u77e5\u4e4b\u751a\u5c11\uff0c\u56e0\u6b64\u53ef\u4ee5\u901a\u8fc7\u7f16\u5199\u9644\u52a0\u4ee3\u7801\u6765\u5f00\u53d1\u5168\u65b0\u7684\u8bbf\u95ee\u65b9\u6cd5\u7c7b\u578b\u3002</p>\n<p lang=\"zh\">\u6bcf\u4e2a\u8868\u8bbf\u95ee\u65b9\u6cd5\u90fd\u7531\u7cfb\u7edf\u76ee\u5f55 <a class=\"link\" href=\"/docs/15/catalog-pg-am.html\" title=\"53.3.\u00a0pg_am\"><code class=\"structname\">pg_am</code></a> \u4e2d\u7684\u4e00\u884c\u63cf\u8ff0\u3002<code class=\"structname\">pg_am</code> \u6761\u76ee\u6307\u5b9a\u4e86\u8be5\u8868\u8bbf\u95ee\u65b9\u6cd5\u7684\u540d\u79f0\u4ee5\u53ca\u4e00\u4e2a<em class=\"firstterm\">\u5904\u7406\u5668\u51fd\u6570</em>\u3002\u8fd9\u4e9b\u6761\u76ee\u53ef\u4ee5\u901a\u8fc7<a class=\"xref\" href=\"/docs/15/sql-create-access-method.html\" title=\"CREATE ACCESS METHOD\"><span class=\"refentrytitle\">CREATE ACCESS METHOD</span></a>\u548c<a class=\"xref\" href=\"/docs/15/sql-drop-access-method.html\" title=\"DROP ACCESS METHOD\"><span class=\"refentrytitle\">DROP ACCESS METHOD</span></a> SQL \u547d\u4ee4\u521b\u5efa\u548c\u5220\u9664\u3002</p>\n<p lang=\"zh\">\u8868\u8bbf\u95ee\u65b9\u6cd5\u7684\u5904\u7406\u5668\u51fd\u6570\u5fc5\u987b\u58f0\u660e\u4e3a\u63a5\u53d7\u4e00\u4e2a <code class=\"type\">internal</code> \u7c7b\u578b\u7684\u53c2\u6570\uff0c\u5e76\u8fd4\u56de\u4f2a\u7c7b\u578b <code class=\"type\">table_am_handler</code>\u3002\u8fd9\u4e2a\u53c2\u6570\u53ea\u662f\u4e00\u4e2a\u5360\u4f4d\u503c\uff0c\u7528\u6765\u9632\u6b62\u5904\u7406\u5668\u51fd\u6570\u88ab SQL \u547d\u4ee4\u76f4\u63a5\u8c03\u7528\u3002\u8be5\u51fd\u6570\u7684\u7ed3\u679c\u5fc5\u987b\u662f\u4e00\u4e2a\u6307\u5411 <code class=\"structname\">TableAmRoutine</code> \u7ed3\u6784\u4f53\u7684\u6307\u9488\uff0c\u5176\u4e2d\u5305\u542b\u6838\u5fc3\u4ee3\u7801\u4f7f\u7528\u8be5\u8868\u8bbf\u95ee\u65b9\u6cd5\u6240\u9700\u7684\u5168\u90e8\u4fe1\u606f\u3002\u8fd4\u56de\u503c\u9700\u8981\u5177\u6709\u670d\u52a1\u5668\u751f\u547d\u5468\u671f\uff0c\u8fd9\u901a\u5e38\u901a\u8fc7\u5c06\u5176\u5b9a\u4e49\u4e3a\u5168\u5c40\u4f5c\u7528\u57df\u4e2d\u7684 <code class=\"literal\">static const</code> \u53d8\u91cf\u6765\u5b9e\u73b0\u3002<code class=\"structname\">TableAmRoutine</code> \u7ed3\u6784\u4f53\u4e5f\u79f0\u4e3a\u8be5\u8bbf\u95ee\u65b9\u6cd5\u7684<em class=\"firstterm\">API \u7ed3\u6784\u4f53</em>\uff0c\u5b83\u901a\u8fc7\u56de\u8c03\u6765\u5b9a\u4e49\u8bbf\u95ee\u65b9\u6cd5\u7684\u884c\u4e3a\u3002\u8fd9\u4e9b\u56de\u8c03\u662f\u666e\u901a C \u51fd\u6570\u7684\u6307\u9488\uff0c\u5728 SQL \u5c42\u65e2\u4e0d\u53ef\u89c1\u4e5f\u4e0d\u53ef\u8c03\u7528\u3002\u6240\u6709\u56de\u8c03\u53ca\u5176\u884c\u4e3a\u90fd\u5b9a\u4e49\u5728 <code class=\"structname\">TableAmRoutine</code> \u7ed3\u6784\u4f53\u4e2d\uff08\u7ed3\u6784\u4f53\u5185\u7684\u6ce8\u91ca\u8bf4\u660e\u4e86\u5bf9\u56de\u8c03\u7684\u8981\u6c42\uff09\u3002\u5927\u591a\u6570\u56de\u8c03\u90fd\u6709\u5305\u88c5\u51fd\u6570\uff0c\u5176\u6587\u6863\u662f\u4ece\u8868\u8bbf\u95ee\u65b9\u6cd5\u4f7f\u7528\u8005\u800c\u975e\u5b9e\u73b0\u8005\u7684\u89d2\u5ea6\u7f16\u5199\u7684\u3002\u8be6\u60c5\u8bf7\u53c2\u9605 <a class=\"ulink\" href=\"https://git.postgresql.org/gitweb/?p=postgresql.git;a=blob;f=src/include/access/tableam.h;hb=HEAD\" target=\"_top\"><code class=\"filename\">src/include/access/tableam.h</code></a> \u6587\u4ef6\u3002</p>\n<p lang=\"zh\">\u5b9e\u73b0\u8bbf\u95ee\u65b9\u6cd5\u65f6\uff0c\u901a\u5e38\u9700\u8981\u5b9e\u73b0\u4e13\u7528\u7684\u5143\u7ec4\u8868\u69fd\u4f4d\u7c7b\u578b\uff08\u53c2\u89c1 src/include/executor/tuptable.h\uff09\uff0c\u4f7f\u8bbf\u95ee\u65b9\u6cd5\u4e4b\u5916\u7684\u4ee3\u7801\u53ef\u4ee5\u6301\u6709\u8be5\u65b9\u6cd5\u7684\u5143\u7ec4\u5f15\u7528\uff0c\u5e76\u8bbf\u95ee\u5143\u7ec4\u5404\u5217\u3002</p>\n<p lang=\"zh\">\u76ee\u524d\uff0cAM \u5b9e\u9645\u5b58\u50a8\u6570\u636e\u7684\u65b9\u5f0f\u6240\u53d7\u9650\u5236\u76f8\u5f53\u5c11\u3002\u4f8b\u5982\uff0c\u53ef\u4ee5\u4f7f\u7528 postgres \u7684\u5171\u4eab\u7f13\u51b2\u533a\u7f13\u5b58\uff0c\u4f46\u8fd9\u5e76\u975e\u5fc5\u9700\u3002\u5982\u679c\u4f7f\u7528\u5b83\uff0c\u90a3\u4e48\u91c7\u7528 <span class=\"productname\">PostgreSQL</span> \u5728<a class=\"xref\" href=\"/docs/15/storage-page-layout.html\" title=\"73.6.\u00a0\u6570\u636e\u5e93\u9875\u9762\u5e03\u5c40\">\u7b2c\u00a073.6\u00a0\u8282</a>\u4e2d\u63cf\u8ff0\u7684\u6807\u51c6\u9875\u9762\u5e03\u5c40\u901a\u5e38\u662f\u6709\u610f\u4e49\u7684\u3002</p>\n<p lang=\"zh\">\u8868\u8bbf\u95ee\u65b9\u6cd5 API \u76ee\u524d\u7684\u4e00\u9879\u8f83\u5927\u9650\u5236\u662f\uff1a\u82e5\u8bbf\u95ee\u65b9\u6cd5\u5e0c\u671b\u652f\u6301\u4fee\u6539\u64cd\u4f5c\u548c/\u6216\u7d22\u5f15\uff0c\u6bcf\u4e2a\u5143\u7ec4\u5fc5\u987b\u6709\u4e00\u4e2a\u7531\u5757\u53f7\u548c\u9879\u53f7\u7ec4\u6210\u7684\u5143\u7ec4\u6807\u8bc6\u7b26 TID\uff08\u53e6\u89c1\u7b2c 73.6 \u8282\uff09\u3002TID \u5404\u90e8\u5206\u4e0d\u5fc5\u5177\u6709\u4e0e heap \u4e2d\u5b8c\u5168\u76f8\u540c\u7684\u542b\u4e49\uff1b\u4f46\u5982\u679c\u8981\u652f\u6301\u53ef\u9009\u7684\u4f4d\u56fe\u626b\u63cf\uff0c\u5757\u53f7\u5c31\u9700\u8981\u63d0\u4f9b\u5c40\u90e8\u6027\u3002</p>\n<p lang=\"zh\">\u4e3a\u4fdd\u8bc1\u5d29\u6e83\u5b89\u5168\uff0cAM \u53ef\u4ee5\u4f7f\u7528 postgres \u7684<a class=\"link\" href=\"/docs/15/wal.html\" title=\"\u7b2c\u00a030\u00a0\u7ae0\u00a0\u53ef\u9760\u6027\u4e0e\u9884\u5199\u5f0f\u65e5\u5fd7\"><acronym class=\"acronym\">WAL</acronym></a>\uff0c\u4e5f\u53ef\u4ee5\u4f7f\u7528\u81ea\u5b9a\u4e49\u5b9e\u73b0\u3002\u5982\u679c\u9009\u62e9\u4e86 <acronym class=\"acronym\">WAL</acronym>\uff0c\u53ef\u4ee5\u4f7f\u7528<a class=\"link\" href=\"/docs/15/generic-wal.html\" title=\"\u7b2c\u00a065\u00a0\u7ae0\u00a0\u901a\u7528 WAL \u8bb0\u5f55\">\u901a\u7528 WAL \u8bb0\u5f55</a>\uff0c\u4e5f\u53ef\u4ee5\u5b9e\u73b0\u4e00\u4e2a<a class=\"link\" href=\"/docs/15/custom-rmgr.html\" title=\"\u7b2c\u00a066\u00a0\u7ae0\u00a0\u81ea\u5b9a\u4e49 WAL \u8d44\u6e90\u7ba1\u7406\u5668\">\u81ea\u5b9a\u4e49 WAL \u8d44\u6e90\u7ba1\u7406\u5668</a>\u3002</p>\n<p lang=\"zh\">\u8981\u4ee5\u5141\u8bb8\u5728\u5355\u4e2a\u4e8b\u52a1\u4e2d\u8bbf\u95ee\u4e0d\u540c\u8868\u8bbf\u95ee\u65b9\u6cd5\u7684\u65b9\u5f0f\u5b9e\u73b0\u4e8b\u52a1\u652f\u6301\uff0c\u5f88\u53ef\u80fd\u9700\u8981\u4e0e <code class=\"filename\">src/backend/access/transam/xlog.c</code> \u4e2d\u7684\u673a\u5236\u7d27\u5bc6\u96c6\u6210\u3002</p>\n<p lang=\"zh\">\u5f00\u53d1\u65b0\u7684\u8868\u8bbf\u95ee\u65b9\u6cd5\u65f6\uff0c\u53ef\u4ee5\u53c2\u7167 src/backend/access/heap/heapam_handler.c \u4e2d\u73b0\u6709\u7684\u5806\u5b9e\u73b0\uff0c\u4e86\u89e3\u5b9e\u73b0\u7ec6\u8282\u3002</p>\n</div>", "manual_path": "/docs/15/tableam.html", "localization": {"status": "complete", "sources": [{"url": "/docs/15/tableam.html", "method": "same-major semantic node", "sha256": "003870ea971f3df488358bb9e59e85b1ccd4aabb5022b51491d2eaf0c1810391", "language": "zh", "matched_nodes": ["#TABLEAM/p[10]", "#TABLEAM/p[3]", "#TABLEAM/p[4]", "#TABLEAM/p[5]", "#TABLEAM/p[7]", "#TABLEAM/p[9]"]}], "language": "zh", "original_text": {"/versions/15/description/0": "The built-in heap table access method integrates tuple storage, visibility, scans, index fetches and maintenance with PostgreSQL.", "/versions/15/facts/0/label": "Interface family", "/versions/15/facts/0/value": "Table access method", "/versions/15/facts/1/label": "Handler or routine", "/versions/15/facts/2/label": "Recorded callbacks", "/versions/15/tables/0/title": "Registered interface handlers", "/versions/15/related/0/label": "System catalog pg_am", "/versions/15/related/2/label": "Index AM", "/versions/15/sections/0/title": "Interface and capability boundaries", "/versions/15/sections/1/title": "Heap storage, visibility and WAL", "/versions/15/sections/2/title": "Registered implementation in core source", "/versions/15/tables/0/rows/0/state": "Handler registered; conditions apply", "/versions/15/tables/0/rows/1/state": "Handler registered; conditions apply", "/versions/15/tables/0/rows/2/state": "Handler registered; conditions apply", "/versions/15/tables/0/rows/3/state": "Handler registered; conditions apply", "/versions/15/tables/0/rows/4/state": "Handler registered; conditions apply", "/versions/15/tables/0/rows/5/state": "Handler registered; conditions apply", "/versions/15/tables/0/rows/6/state": "Handler registered; conditions apply", "/versions/15/tables/0/rows/7/state": "Handler registered; conditions apply", "/versions/15/tables/0/rows/8/state": "Handler registered; conditions apply", "/versions/15/tables/0/rows/9/state": "Handler registered; conditions apply", "/versions/15/tables/0/rows/10/state": "Handler registered; conditions apply", "/versions/15/sections/0/paragraphs/0": "The matrix records callbacks actually registered in this source build. Registration identifies an implemented interface hook; options, query shape, privileges and provider rules determine whether an operation is allowed.", "/versions/15/sections/0/paragraphs/1": "The complete same-version manual below retains configuration, constraints and examples. No runtime capability test is claimed.", "/versions/15/sections/1/paragraphs/0": "This inventory starts with the Table AM interface in PostgreSQL 12. Earlier PostgreSQL heap storage is not relabeled as a Table AM implementation.", "/versions/15/sections/1/paragraphs/1": "Heap visibility follows PostgreSQL snapshots. WAL and crash-recovery behavior depend on relation persistence; temporary and unlogged tables differ from permanent tables. Index access methods remain separate from the table storage interface.", "/versions/15/tables/0/rows/0/feature": "Tuple slot", "/versions/15/tables/0/rows/1/feature": "Begin scan", "/versions/15/tables/0/rows/2/feature": "Parallel scan initialization", "/versions/15/tables/0/rows/3/feature": "Begin index lookup", "/versions/15/tables/0/rows/4/feature": "Fetch identified tuple", "/versions/15/tables/0/rows/5/feature": "Insert tuple", "/versions/15/tables/0/rows/6/feature": "Update tuple", "/versions/15/tables/0/rows/7/feature": "Delete tuple", "/versions/15/tables/0/rows/8/feature": "Vacuum relation", "/versions/15/tables/0/rows/9/feature": "Analyze block", "/versions/15/tables/0/columns/0/label": "Interface operation", "/versions/15/tables/0/columns/1/label": "Source observation", "/versions/15/tables/0/columns/2/label": "Callback", "/versions/15/tables/0/columns/3/label": "Implementation", "/versions/15/tables/0/rows/10/feature": "TOAST decision"}, "fallback_fields": [], "source_language": "en", "original_snapshot_sha256": "3c255a06f1775bc2fdd3347af22f1dd65602a0856c92c828752539ef3d5d31dd"}, "evidence_kind": "source and documentation", "comparison_data": {"options": [], "callbacks": {"scan_end": "heap_endscan", "scan_begin": "heap_beginscan", "tuple_lock": "heapam_tuple_lock", "scan_rescan": "heap_rescan", "multi_insert": "heap_multi_insert", "tuple_delete": "heapam_tuple_delete", "tuple_insert": "heapam_tuple_insert", "tuple_update": "heapam_tuple_update", "relation_size": "table_block_relation_size", "slot_callbacks": "heapam_slot_callbacks", "index_fetch_end": "heapam_index_fetch_end", "relation_vacuum": "heap_vacuum_rel", "tuple_tid_valid": "heapam_tuple_tid_valid", "scan_getnextslot": "heap_getnextslot", "index_fetch_begin": "heapam_index_fetch_begin", "index_fetch_reset": "heapam_index_fetch_reset", "index_fetch_tuple": "heapam_index_fetch_tuple", "relation_toast_am": "heapam_relation_toast_am", "scan_set_tidrange": "heap_set_tidrange", "relation_copy_data": "heapam_relation_copy_data", "index_delete_tuples": "heap_index_delete_tuples", "index_validate_scan": "heapam_index_validate_scan", "tuple_get_latest_tid": "heap_get_latest_tid", "parallelscan_estimate": "table_block_parallelscan_estimate", "index_build_range_scan": "heapam_index_build_range_scan", "relation_estimate_size": "heapam_estimate_rel_size", "scan_bitmap_next_block": "heapam_scan_bitmap_next_block", "scan_bitmap_next_tuple": "heapam_scan_bitmap_next_tuple", "scan_sample_next_block": "heapam_scan_sample_next_block", "scan_sample_next_tuple": "heapam_scan_sample_next_tuple", "parallelscan_initialize": "table_block_parallelscan_initialize", "scan_analyze_next_block": "heapam_scan_analyze_next_block", "scan_analyze_next_tuple": "heapam_scan_analyze_next_tuple", "tuple_fetch_row_version": "heapam_fetch_row_version", "tuple_insert_speculative": "heapam_tuple_insert_speculative", "tuple_satisfies_snapshot": "heapam_tuple_satisfies_snapshot", "parallelscan_reinitialize": "table_block_parallelscan_reinitialize", "relation_copy_for_cluster": "heapam_relation_copy_for_cluster", "relation_set_new_filenode": "heapam_relation_set_new_filenode", "scan_getnextslot_tidrange": "heap_getnextslot_tidrange", "relation_fetch_toast_slice": "heap_fetch_toast_slice", "relation_needs_toast_table": "heapam_relation_needs_toast_table", "tuple_complete_speculative": "heapam_tuple_complete_speculative", "relation_nontransactional_truncate": "heapam_relation_nontransactional_truncate"}, "source_options": [], "protocol_versions": {}}, "comparison_hash": "eee603c9509a489abd6ec6a12129951277b59ad8334e2edc6299d8edd5fa0e38", "manual_language": "zh", "runtime_verified": false}, "16": {"facts": [{"label": "\u63a5\u53e3\u7c7b\u522b", "value": "\u8868\u8bbf\u95ee\u65b9\u6cd5"}, {"label": "\u5904\u7406\u51fd\u6570\u6216\u4f8b\u7a0b", "value": "heapam_methods"}, {"label": "\u8bb0\u5f55\u7684\u56de\u8c03", "value": "44"}], "tables": [{"key": "callbacks", "rows": [{"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u5143\u7ec4\u69fd", "callback": "slot_callbacks", "implementation": "heapam_slot_callbacks"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u5f00\u59cb\u626b\u63cf", "callback": "scan_begin", "implementation": "heap_beginscan"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u521d\u59cb\u5316\u5e76\u884c\u626b\u63cf", "callback": "parallelscan_initialize", "implementation": "table_block_parallelscan_initialize"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u5f00\u59cb\u7d22\u5f15\u67e5\u627e", "callback": "index_fetch_begin", "implementation": "heapam_index_fetch_begin"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u83b7\u53d6\u6307\u5b9a\u5143\u7ec4", "callback": "index_fetch_tuple", "implementation": "heapam_index_fetch_tuple"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u63d2\u5165\u5143\u7ec4", "callback": "tuple_insert", "implementation": "heapam_tuple_insert"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u66f4\u65b0\u5143\u7ec4", "callback": "tuple_update", "implementation": "heapam_tuple_update"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u5220\u9664\u5143\u7ec4", "callback": "tuple_delete", "implementation": "heapam_tuple_delete"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u5bf9\u5173\u7cfb\u6267\u884c VACUUM", "callback": "relation_vacuum", "implementation": "heap_vacuum_rel"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u5206\u6790\u6570\u636e\u5757", "callback": "scan_analyze_next_block", "implementation": "heapam_scan_analyze_next_block"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "TOAST \u5224\u5b9a", "callback": "relation_needs_toast_table", "implementation": "heapam_relation_needs_toast_table"}], "title": "\u6ce8\u518c\u7684\u63a5\u53e3\u5904\u7406\u51fd\u6570", "columns": [{"key": "feature", "label": "\u63a5\u53e3\u64cd\u4f5c"}, {"key": "state", "label": "\u6e90\u7801\u89c2\u5bdf"}, {"key": "callback", "label": "\u56de\u8c03"}, {"key": "implementation", "label": "\u5b9e\u73b0"}]}], "related": [{"url": "/wiki/catalog/pg_am/?v=16", "label": "\u7cfb\u7edf\u76ee\u5f55 pg_am"}, {"url": "/wiki/guc/default_table_access_method/?v=16", "label": "default_table_access_method"}, {"url": "/wiki/indexam/?v=16", "label": "\u7d22\u5f15\u8bbf\u95ee\u65b9\u6cd5"}], "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://pg.center/docs/16/tableam.html", "path": "tableam.html", "label": "PostgreSQL 16 English manual", "sha256": "de4f87f56c28dceda7f0cd9d1cd06d4d743e8d40f0e0c678de9a124620fe60e8", "language": "en", "original_url": "/docs/16/tableam.html"}, {"url": "https://ftp.postgresql.org/pub/source/v16.15/postgresql-16.15.tar.bz2", "line": 2545, "path": "src/backend/access/heap/heapam_handler.c", "label": "src/backend/access/heap/heapam_handler.c:2545", "sha256": "098e4c2edc2b72869ca506104e38765eb11a5c9f84c018f932acc86a355c0749", "archive_sha256": "c1575341fa7bd40f5274ea465b34390f4dc64cdd0770af327005caaeb9f6b7ed"}, {"url": "https://pg.center/docs/16/mvcc-intro.html", "path": "mvcc-intro.html", "label": "PostgreSQL 16 English manual", "sha256": "44ad702b3a2801b752f632abc5637a121f19d3dec107beedd3ae430b47efed70", "language": "en", "original_url": "/docs/16/mvcc-intro.html"}, {"url": "https://pg.center/docs/16/sql-createtable.html", "path": "sql-createtable.html", "label": "PostgreSQL 16 English manual", "sha256": "dde6108abda6f7358eeccc6867eb68f5ca601329ea3f50bc3d5b728c944a65a8", "language": "en", "original_url": "/docs/16/sql-createtable.html"}, {"url": "https://pg.center/docs/16/routine-vacuuming.html", "path": "routine-vacuuming.html", "label": "PostgreSQL 16 English manual", "sha256": "776a9e2655314bbdc3f689ca444ddac910ab2dc352aec54b102481846d1f1777", "language": "en", "original_url": "/docs/16/routine-vacuuming.html"}, {"url": "https://pg.center/docs/16/catalog-pg-am.html", "path": "catalog-pg-am.html", "label": "PostgreSQL 16 English manual", "sha256": "596022bb02bdc457528b9821745971fc926674d3ee14dd5d91afb387b927844c", "language": "en", "original_url": "/docs/16/catalog-pg-am.html"}], "sections": [{"title": "\u63a5\u53e3\u4e0e\u80fd\u529b\u8fb9\u754c", "paragraphs": ["\u77e9\u9635\u8bb0\u5f55\u6b64\u6e90\u7801\u6784\u5efa\u5b9e\u9645\u6ce8\u518c\u7684\u56de\u8c03\u3002\u6ce8\u518c\u8868\u660e\u5b9e\u73b0\u4e86\u76f8\u5e94\u63a5\u53e3\u94a9\u5b50\uff1b\u64cd\u4f5c\u662f\u5426\u5141\u8bb8\u8fd8\u53d6\u51b3\u4e8e\u9009\u9879\u3001\u67e5\u8be2\u5f62\u5f0f\u3001\u6743\u9650\u548c\u63d0\u4f9b\u65b9\u89c4\u5219\u3002", "\u4e0b\u65b9\u4fdd\u7559\u540c\u7248\u672c\u5b8c\u6574\u624b\u518c\uff0c\u5305\u62ec\u914d\u7f6e\u3001\u7ea6\u675f\u548c\u793a\u4f8b\u3002\u4e0d\u58f0\u79f0\u5df2\u8fdb\u884c\u8fd0\u884c\u65f6\u80fd\u529b\u6d4b\u8bd5\u3002"]}, {"title": "\u5806\u5b58\u50a8\u3001\u53ef\u89c1\u6027\u4e0e WAL", "paragraphs": ["\u6b64\u6e05\u5355\u4ece PostgreSQL 12 \u5f15\u5165\u7684 Table AM \u63a5\u53e3\u5f00\u59cb\u3002\u4e0d\u4f1a\u5c06\u66f4\u65e9\u7248\u672c\u7684 PostgreSQL \u5806\u5b58\u50a8\u91cd\u65b0\u6807\u4e3a Table AM \u5b9e\u73b0\u3002", "\u5806\u53ef\u89c1\u6027\u9075\u5faa PostgreSQL \u5feb\u7167\u3002WAL \u548c\u5d29\u6e83\u6062\u590d\u884c\u4e3a\u53d6\u51b3\u4e8e\u5173\u7cfb\u7684\u6301\u4e45\u6027\uff1b\u4e34\u65f6\u8868\u3001\u65e0\u65e5\u5fd7\u8868\u4e0e\u6c38\u4e45\u8868\u4e0d\u540c\u3002\u7d22\u5f15\u8bbf\u95ee\u65b9\u6cd5\u4e0e\u8868\u5b58\u50a8\u63a5\u53e3\u5206\u5f00\u3002"]}, {"code": "{\n\t.type = T_TableAmRoutine,\n\n\t.slot_callbacks = heapam_slot_callbacks,\n\n\t.scan_begin = heap_beginscan,\n\t.scan_end = heap_endscan,\n\t.scan_rescan = heap_rescan,\n\t.scan_getnextslot = heap_getnextslot,\n\n\t.scan_set_tidrange = heap_set_tidrange,\n\t.scan_getnextslot_tidrange = heap_getnextslot_tidrange,\n\n\t.parallelscan_estimate = table_block_parallelscan_estimate,\n\t.parallelscan_initialize = table_block_parallelscan_initialize,\n\t.parallelscan_reinitialize = table_block_parallelscan_reinitialize,\n\n\t.index_fetch_begin = heapam_index_fetch_begin,\n\t.index_fetch_reset = heapam_index_fetch_reset,\n\t.index_fetch_end = heapam_index_fetch_end,\n\t.index_fetch_tuple = heapam_index_fetch_tuple,\n\n\t.tuple_insert = heapam_tuple_insert,\n\t.tuple_insert_speculative = heapam_tuple_insert_speculative,\n\t.tuple_complete_speculative = heapam_tuple_complete_speculative,\n\t.multi_insert = heap_multi_insert,\n\t.tuple_delete = heapam_tuple_delete,\n\t.tuple_update = heapam_tuple_update,\n\t.tuple_lock = heapam_tuple_lock,\n\n\t.tuple_fetch_row_version = heapam_fetch_row_version,\n\t.tuple_get_latest_tid = heap_get_latest_tid,\n\t.tuple_tid_valid = heapam_tuple_tid_valid,\n\t.tuple_satisfies_snapshot = heapam_tuple_satisfies_snapshot,\n\t.index_delete_tuples = heap_index_delete_tuples,\n\n\t.relation_set_new_filelocator = heapam_relation_set_new_filelocator,\n\t.relation_nontransactional_truncate = heapam_relation_nontransactional_truncate,\n\t.relation_copy_data = heapam_relation_copy_data,\n\t.relation_copy_for_cluster = heapam_relation_copy_for_cluster,\n\t.relation_vacuum = heap_vacuum_rel,\n\t.scan_analyze_next_block = heapam_scan_analyze_next_block,\n\t.scan_analyze_next_tuple = heapam_scan_analyze_next_tuple,\n\t.index_build_range_scan = heapam_index_build_range_scan,\n\t.index_validate_scan = heapam_index_validate_scan,\n\n\t.relation_size = table_block_relation_size,\n\t.relation_needs_toast_table = heapam_relation_needs_toast_table,\n\t.relation_toast_am = heapam_relation_toast_am,\n\t.relation_fetch_toast_slice = heap_fetch_toast_slice,\n\n\t.relation_estimate_size = heapam_estimate_rel_size,\n\n\t.scan_bitmap_next_block = heapam_scan_bitmap_next_block,\n\t.scan_bitmap_next_tuple = heapam_scan_bitmap_next_tuple,\n\t.scan_sample_next_block = heapam_scan_sample_next_block,\n\t.scan_sample_next_tuple = heapam_scan_sample_next_tuple\n}", "title": "\u6838\u5fc3\u6e90\u7801\u4e2d\u6ce8\u518c\u7684\u5b9e\u73b0"}], "callbacks": {"scan_end": "heap_endscan", "scan_begin": "heap_beginscan", "tuple_lock": "heapam_tuple_lock", "scan_rescan": "heap_rescan", "multi_insert": "heap_multi_insert", "tuple_delete": "heapam_tuple_delete", "tuple_insert": "heapam_tuple_insert", "tuple_update": "heapam_tuple_update", "relation_size": "table_block_relation_size", "slot_callbacks": "heapam_slot_callbacks", "index_fetch_end": "heapam_index_fetch_end", "relation_vacuum": "heap_vacuum_rel", "tuple_tid_valid": "heapam_tuple_tid_valid", "scan_getnextslot": "heap_getnextslot", "index_fetch_begin": "heapam_index_fetch_begin", "index_fetch_reset": "heapam_index_fetch_reset", "index_fetch_tuple": "heapam_index_fetch_tuple", "relation_toast_am": "heapam_relation_toast_am", "scan_set_tidrange": "heap_set_tidrange", "relation_copy_data": "heapam_relation_copy_data", "index_delete_tuples": "heap_index_delete_tuples", "index_validate_scan": "heapam_index_validate_scan", "tuple_get_latest_tid": "heap_get_latest_tid", "parallelscan_estimate": "table_block_parallelscan_estimate", "index_build_range_scan": "heapam_index_build_range_scan", "relation_estimate_size": "heapam_estimate_rel_size", "scan_bitmap_next_block": "heapam_scan_bitmap_next_block", "scan_bitmap_next_tuple": "heapam_scan_bitmap_next_tuple", "scan_sample_next_block": "heapam_scan_sample_next_block", "scan_sample_next_tuple": "heapam_scan_sample_next_tuple", "parallelscan_initialize": "table_block_parallelscan_initialize", "scan_analyze_next_block": "heapam_scan_analyze_next_block", "scan_analyze_next_tuple": "heapam_scan_analyze_next_tuple", "tuple_fetch_row_version": "heapam_fetch_row_version", "tuple_insert_speculative": "heapam_tuple_insert_speculative", "tuple_satisfies_snapshot": "heapam_tuple_satisfies_snapshot", "parallelscan_reinitialize": "table_block_parallelscan_reinitialize", "relation_copy_for_cluster": "heapam_relation_copy_for_cluster", "scan_getnextslot_tidrange": "heap_getnextslot_tidrange", "relation_fetch_toast_slice": "heap_fetch_toast_slice", "relation_needs_toast_table": "heapam_relation_needs_toast_table", "tuple_complete_speculative": "heapam_tuple_complete_speculative", "relation_set_new_filelocator": "heapam_relation_set_new_filelocator", "relation_nontransactional_truncate": "heapam_relation_nontransactional_truncate"}, "description": ["\u5185\u7f6e heap \u8868\u8bbf\u95ee\u65b9\u6cd5\u5c06\u5143\u7ec4\u5b58\u50a8\u3001\u53ef\u89c1\u6027\u3001\u626b\u63cf\u3001\u7d22\u5f15\u83b7\u53d6\u548c\u7ef4\u62a4\u64cd\u4f5c\u96c6\u6210\u5230 PostgreSQL \u4e2d\u3002"], "manual_html": "<div class=\"chapter\" id=\"TABLEAM\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h2 class=\"title\" lang=\"zh\">\u7b2c 63 \u7ae0. Table Access Method Interface Definition</h2>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u672c\u7ae0\u8bf4\u660e <span class=\"productname\">PostgreSQL</span> \u6838\u5fc3\u7cfb\u7edf\u4e0e\u7ba1\u7406\u8868\u5b58\u50a8\u7684<em class=\"firstterm\">\u8868\u8bbf\u95ee\u65b9\u6cd5</em>\u4e4b\u95f4\u7684\u63a5\u53e3\u3002\u9664\u8fd9\u91cc\u89c4\u5b9a\u7684\u5185\u5bb9\u4e4b\u5916\uff0c\u6838\u5fc3\u7cfb\u7edf\u5bf9\u8fd9\u4e9b\u8bbf\u95ee\u65b9\u6cd5\u77e5\u4e4b\u751a\u5c11\uff0c\u56e0\u6b64\u53ef\u4ee5\u901a\u8fc7\u7f16\u5199\u9644\u52a0\u4ee3\u7801\u6765\u5f00\u53d1\u5168\u65b0\u7684\u8bbf\u95ee\u65b9\u6cd5\u7c7b\u578b\u3002</p>\n<p lang=\"zh\">\u6bcf\u4e2a\u8868\u8bbf\u95ee\u65b9\u6cd5\u90fd\u7531\u7cfb\u7edf\u76ee\u5f55 <a class=\"link\" href=\"/docs/16/catalog-pg-am.html\" title=\"53.3.\u00a0pg_am\"><code class=\"structname\">pg_am</code></a> \u4e2d\u7684\u4e00\u884c\u63cf\u8ff0\u3002<code class=\"structname\">pg_am</code> \u6761\u76ee\u6307\u5b9a\u4e86\u8be5\u8868\u8bbf\u95ee\u65b9\u6cd5\u7684\u540d\u79f0\u4ee5\u53ca\u4e00\u4e2a<em class=\"firstterm\">\u5904\u7406\u5668\u51fd\u6570</em>\u3002\u8fd9\u4e9b\u6761\u76ee\u53ef\u4ee5\u901a\u8fc7<a class=\"xref\" href=\"/docs/16/sql-create-access-method.html\" title=\"CREATE ACCESS METHOD\"><span class=\"refentrytitle\">CREATE ACCESS METHOD</span></a>\u548c<a class=\"xref\" href=\"/docs/16/sql-drop-access-method.html\" title=\"DROP ACCESS METHOD\"><span class=\"refentrytitle\">DROP ACCESS METHOD</span></a> SQL \u547d\u4ee4\u521b\u5efa\u548c\u5220\u9664\u3002</p>\n<p lang=\"zh\">\u8868\u8bbf\u95ee\u65b9\u6cd5\u7684\u5904\u7406\u5668\u51fd\u6570\u5fc5\u987b\u58f0\u660e\u4e3a\u63a5\u53d7\u4e00\u4e2a <code class=\"type\">internal</code> \u7c7b\u578b\u7684\u53c2\u6570\uff0c\u5e76\u8fd4\u56de\u4f2a\u7c7b\u578b <code class=\"type\">table_am_handler</code>\u3002\u8fd9\u4e2a\u53c2\u6570\u53ea\u662f\u4e00\u4e2a\u5360\u4f4d\u503c\uff0c\u7528\u6765\u9632\u6b62\u5904\u7406\u5668\u51fd\u6570\u88ab SQL \u547d\u4ee4\u76f4\u63a5\u8c03\u7528\u3002\u8be5\u51fd\u6570\u7684\u7ed3\u679c\u5fc5\u987b\u662f\u4e00\u4e2a\u6307\u5411 <code class=\"structname\">TableAmRoutine</code> \u7ed3\u6784\u4f53\u7684\u6307\u9488\uff0c\u5176\u4e2d\u5305\u542b\u6838\u5fc3\u4ee3\u7801\u4f7f\u7528\u8be5\u8868\u8bbf\u95ee\u65b9\u6cd5\u6240\u9700\u7684\u5168\u90e8\u4fe1\u606f\u3002\u8fd4\u56de\u503c\u9700\u8981\u5177\u6709\u670d\u52a1\u5668\u751f\u547d\u5468\u671f\uff0c\u8fd9\u901a\u5e38\u901a\u8fc7\u5c06\u5176\u5b9a\u4e49\u4e3a\u5168\u5c40\u4f5c\u7528\u57df\u4e2d\u7684 <code class=\"literal\">static const</code> \u53d8\u91cf\u6765\u5b9e\u73b0\u3002<code class=\"structname\">TableAmRoutine</code> \u7ed3\u6784\u4f53\u4e5f\u79f0\u4e3a\u8be5\u8bbf\u95ee\u65b9\u6cd5\u7684<em class=\"firstterm\">API \u7ed3\u6784\u4f53</em>\uff0c\u5b83\u901a\u8fc7\u56de\u8c03\u6765\u5b9a\u4e49\u8bbf\u95ee\u65b9\u6cd5\u7684\u884c\u4e3a\u3002\u8fd9\u4e9b\u56de\u8c03\u662f\u666e\u901a C \u51fd\u6570\u7684\u6307\u9488\uff0c\u5728 SQL \u5c42\u65e2\u4e0d\u53ef\u89c1\u4e5f\u4e0d\u53ef\u8c03\u7528\u3002\u6240\u6709\u56de\u8c03\u53ca\u5176\u884c\u4e3a\u90fd\u5b9a\u4e49\u5728 <code class=\"structname\">TableAmRoutine</code> \u7ed3\u6784\u4f53\u4e2d\uff08\u7ed3\u6784\u4f53\u5185\u7684\u6ce8\u91ca\u8bf4\u660e\u4e86\u5bf9\u56de\u8c03\u7684\u8981\u6c42\uff09\u3002\u5927\u591a\u6570\u56de\u8c03\u90fd\u6709\u5305\u88c5\u51fd\u6570\uff0c\u5176\u6587\u6863\u662f\u4ece\u8868\u8bbf\u95ee\u65b9\u6cd5\u4f7f\u7528\u8005\u800c\u975e\u5b9e\u73b0\u8005\u7684\u89d2\u5ea6\u7f16\u5199\u7684\u3002\u8be6\u60c5\u8bf7\u53c2\u9605 <a class=\"ulink\" href=\"https://git.postgresql.org/gitweb/?p=postgresql.git;a=blob;f=src/include/access/tableam.h;hb=HEAD\" target=\"_top\"><code class=\"filename\">src/include/access/tableam.h</code></a> \u6587\u4ef6\u3002</p>\n<p lang=\"zh\">\u5b9e\u73b0\u8bbf\u95ee\u65b9\u6cd5\u65f6\uff0c\u901a\u5e38\u9700\u8981\u5b9e\u73b0\u4e13\u7528\u7684\u5143\u7ec4\u8868\u69fd\u4f4d\u7c7b\u578b\uff08\u53c2\u89c1 src/include/executor/tuptable.h\uff09\uff0c\u4f7f\u8bbf\u95ee\u65b9\u6cd5\u4e4b\u5916\u7684\u4ee3\u7801\u53ef\u4ee5\u6301\u6709\u8be5\u65b9\u6cd5\u7684\u5143\u7ec4\u5f15\u7528\uff0c\u5e76\u8bbf\u95ee\u5143\u7ec4\u5404\u5217\u3002</p>\n<p lang=\"zh\">\u76ee\u524d\uff0cAM \u5b9e\u9645\u5b58\u50a8\u6570\u636e\u7684\u65b9\u5f0f\u6240\u53d7\u9650\u5236\u76f8\u5f53\u5c11\u3002\u4f8b\u5982\uff0c\u53ef\u4ee5\u4f7f\u7528 postgres \u7684\u5171\u4eab\u7f13\u51b2\u533a\u7f13\u5b58\uff0c\u4f46\u8fd9\u5e76\u975e\u5fc5\u9700\u3002\u5982\u679c\u4f7f\u7528\u5b83\uff0c\u90a3\u4e48\u91c7\u7528 <span class=\"productname\">PostgreSQL</span> \u5728<a class=\"xref\" href=\"/docs/16/storage-page-layout.html\" title=\"73.6.\u00a0\u6570\u636e\u5e93\u9875\u9762\u5e03\u5c40\">\u7b2c\u00a073.6\u00a0\u8282</a>\u4e2d\u63cf\u8ff0\u7684\u6807\u51c6\u9875\u9762\u5e03\u5c40\u901a\u5e38\u662f\u6709\u610f\u4e49\u7684\u3002</p>\n<p lang=\"zh\">\u8868\u8bbf\u95ee\u65b9\u6cd5 API \u76ee\u524d\u7684\u4e00\u9879\u8f83\u5927\u9650\u5236\u662f\uff1a\u82e5\u8bbf\u95ee\u65b9\u6cd5\u5e0c\u671b\u652f\u6301\u4fee\u6539\u64cd\u4f5c\u548c/\u6216\u7d22\u5f15\uff0c\u6bcf\u4e2a\u5143\u7ec4\u5fc5\u987b\u6709\u4e00\u4e2a\u7531\u5757\u53f7\u548c\u9879\u53f7\u7ec4\u6210\u7684\u5143\u7ec4\u6807\u8bc6\u7b26 TID\uff08\u53e6\u89c1\u7b2c 73.6 \u8282\uff09\u3002TID \u5404\u90e8\u5206\u4e0d\u5fc5\u5177\u6709\u4e0e heap \u4e2d\u5b8c\u5168\u76f8\u540c\u7684\u542b\u4e49\uff1b\u4f46\u5982\u679c\u8981\u652f\u6301\u53ef\u9009\u7684\u4f4d\u56fe\u626b\u63cf\uff0c\u5757\u53f7\u5c31\u9700\u8981\u63d0\u4f9b\u5c40\u90e8\u6027\u3002</p>\n<p lang=\"zh\">\u4e3a\u4fdd\u8bc1\u5d29\u6e83\u5b89\u5168\uff0cAM \u53ef\u4ee5\u4f7f\u7528 postgres \u7684<a class=\"link\" href=\"/docs/16/wal.html\" title=\"\u7b2c\u00a030\u00a0\u7ae0\u00a0\u53ef\u9760\u6027\u4e0e\u9884\u5199\u5f0f\u65e5\u5fd7\"><acronym class=\"acronym\">WAL</acronym></a>\uff0c\u4e5f\u53ef\u4ee5\u4f7f\u7528\u81ea\u5b9a\u4e49\u5b9e\u73b0\u3002\u5982\u679c\u9009\u62e9\u4e86 <acronym class=\"acronym\">WAL</acronym>\uff0c\u53ef\u4ee5\u4f7f\u7528<a class=\"link\" href=\"/docs/16/generic-wal.html\" title=\"\u7b2c\u00a065\u00a0\u7ae0\u00a0\u901a\u7528 WAL \u8bb0\u5f55\">\u901a\u7528 WAL \u8bb0\u5f55</a>\uff0c\u4e5f\u53ef\u4ee5\u5b9e\u73b0\u4e00\u4e2a<a class=\"link\" href=\"/docs/16/custom-rmgr.html\" title=\"\u7b2c\u00a066\u00a0\u7ae0\u00a0\u81ea\u5b9a\u4e49 WAL \u8d44\u6e90\u7ba1\u7406\u5668\">\u81ea\u5b9a\u4e49 WAL \u8d44\u6e90\u7ba1\u7406\u5668</a>\u3002</p>\n<p lang=\"zh\">\u8981\u4ee5\u5141\u8bb8\u5728\u5355\u4e2a\u4e8b\u52a1\u4e2d\u8bbf\u95ee\u4e0d\u540c\u8868\u8bbf\u95ee\u65b9\u6cd5\u7684\u65b9\u5f0f\u5b9e\u73b0\u4e8b\u52a1\u652f\u6301\uff0c\u5f88\u53ef\u80fd\u9700\u8981\u4e0e <code class=\"filename\">src/backend/access/transam/xlog.c</code> \u4e2d\u7684\u673a\u5236\u7d27\u5bc6\u96c6\u6210\u3002</p>\n<p lang=\"zh\">\u5f00\u53d1\u65b0\u7684\u8868\u8bbf\u95ee\u65b9\u6cd5\u65f6\uff0c\u53ef\u4ee5\u53c2\u7167 src/backend/access/heap/heapam_handler.c \u4e2d\u73b0\u6709\u7684\u5806\u5b9e\u73b0\uff0c\u4e86\u89e3\u5b9e\u73b0\u7ec6\u8282\u3002</p>\n</div>", "manual_path": "/docs/16/tableam.html", "localization": {"status": "complete", "sources": [{"url": "/docs/16/tableam.html", "method": "same-major semantic node", "sha256": "00d4d7ce2a226005787acdea4183d3b8d54bbe9d468e19070e2e9d121f4eac4b", "language": "zh", "matched_nodes": ["#TABLEAM/p[10]", "#TABLEAM/p[3]", "#TABLEAM/p[4]", "#TABLEAM/p[5]", "#TABLEAM/p[7]", "#TABLEAM/p[9]"]}], "language": "zh", "original_text": {"/versions/16/description/0": "The built-in heap table access method integrates tuple storage, visibility, scans, index fetches and maintenance with PostgreSQL.", "/versions/16/facts/0/label": "Interface family", "/versions/16/facts/0/value": "Table access method", "/versions/16/facts/1/label": "Handler or routine", "/versions/16/facts/2/label": "Recorded callbacks", "/versions/16/tables/0/title": "Registered interface handlers", "/versions/16/related/0/label": "System catalog pg_am", "/versions/16/related/2/label": "Index AM", "/versions/16/sections/0/title": "Interface and capability boundaries", "/versions/16/sections/1/title": "Heap storage, visibility and WAL", "/versions/16/sections/2/title": "Registered implementation in core source", "/versions/16/tables/0/rows/0/state": "Handler registered; conditions apply", "/versions/16/tables/0/rows/1/state": "Handler registered; conditions apply", "/versions/16/tables/0/rows/2/state": "Handler registered; conditions apply", "/versions/16/tables/0/rows/3/state": "Handler registered; conditions apply", "/versions/16/tables/0/rows/4/state": "Handler registered; conditions apply", "/versions/16/tables/0/rows/5/state": "Handler registered; conditions apply", "/versions/16/tables/0/rows/6/state": "Handler registered; conditions apply", "/versions/16/tables/0/rows/7/state": "Handler registered; conditions apply", "/versions/16/tables/0/rows/8/state": "Handler registered; conditions apply", "/versions/16/tables/0/rows/9/state": "Handler registered; conditions apply", "/versions/16/tables/0/rows/10/state": "Handler registered; conditions apply", "/versions/16/sections/0/paragraphs/0": "The matrix records callbacks actually registered in this source build. Registration identifies an implemented interface hook; options, query shape, privileges and provider rules determine whether an operation is allowed.", "/versions/16/sections/0/paragraphs/1": "The complete same-version manual below retains configuration, constraints and examples. No runtime capability test is claimed.", "/versions/16/sections/1/paragraphs/0": "This inventory starts with the Table AM interface in PostgreSQL 12. Earlier PostgreSQL heap storage is not relabeled as a Table AM implementation.", "/versions/16/sections/1/paragraphs/1": "Heap visibility follows PostgreSQL snapshots. WAL and crash-recovery behavior depend on relation persistence; temporary and unlogged tables differ from permanent tables. Index access methods remain separate from the table storage interface.", "/versions/16/tables/0/rows/0/feature": "Tuple slot", "/versions/16/tables/0/rows/1/feature": "Begin scan", "/versions/16/tables/0/rows/2/feature": "Parallel scan initialization", "/versions/16/tables/0/rows/3/feature": "Begin index lookup", "/versions/16/tables/0/rows/4/feature": "Fetch identified tuple", "/versions/16/tables/0/rows/5/feature": "Insert tuple", "/versions/16/tables/0/rows/6/feature": "Update tuple", "/versions/16/tables/0/rows/7/feature": "Delete tuple", "/versions/16/tables/0/rows/8/feature": "Vacuum relation", "/versions/16/tables/0/rows/9/feature": "Analyze block", "/versions/16/tables/0/columns/0/label": "Interface operation", "/versions/16/tables/0/columns/1/label": "Source observation", "/versions/16/tables/0/columns/2/label": "Callback", "/versions/16/tables/0/columns/3/label": "Implementation", "/versions/16/tables/0/rows/10/feature": "TOAST decision"}, "fallback_fields": [], "source_language": "en", "original_snapshot_sha256": "1a9c8bbcbca0c856d83935c2f65b36c7894f29e81c4665321c1a53d4c71aaf30"}, "evidence_kind": "source and documentation", "comparison_data": {"options": [], "callbacks": {"scan_end": "heap_endscan", "scan_begin": "heap_beginscan", "tuple_lock": "heapam_tuple_lock", "scan_rescan": "heap_rescan", "multi_insert": "heap_multi_insert", "tuple_delete": "heapam_tuple_delete", "tuple_insert": "heapam_tuple_insert", "tuple_update": "heapam_tuple_update", "relation_size": "table_block_relation_size", "slot_callbacks": "heapam_slot_callbacks", "index_fetch_end": "heapam_index_fetch_end", "relation_vacuum": "heap_vacuum_rel", "tuple_tid_valid": "heapam_tuple_tid_valid", "scan_getnextslot": "heap_getnextslot", "index_fetch_begin": "heapam_index_fetch_begin", "index_fetch_reset": "heapam_index_fetch_reset", "index_fetch_tuple": "heapam_index_fetch_tuple", "relation_toast_am": "heapam_relation_toast_am", "scan_set_tidrange": "heap_set_tidrange", "relation_copy_data": "heapam_relation_copy_data", "index_delete_tuples": "heap_index_delete_tuples", "index_validate_scan": "heapam_index_validate_scan", "tuple_get_latest_tid": "heap_get_latest_tid", "parallelscan_estimate": "table_block_parallelscan_estimate", "index_build_range_scan": "heapam_index_build_range_scan", "relation_estimate_size": "heapam_estimate_rel_size", "scan_bitmap_next_block": "heapam_scan_bitmap_next_block", "scan_bitmap_next_tuple": "heapam_scan_bitmap_next_tuple", "scan_sample_next_block": "heapam_scan_sample_next_block", "scan_sample_next_tuple": "heapam_scan_sample_next_tuple", "parallelscan_initialize": "table_block_parallelscan_initialize", "scan_analyze_next_block": "heapam_scan_analyze_next_block", "scan_analyze_next_tuple": "heapam_scan_analyze_next_tuple", "tuple_fetch_row_version": "heapam_fetch_row_version", "tuple_insert_speculative": "heapam_tuple_insert_speculative", "tuple_satisfies_snapshot": "heapam_tuple_satisfies_snapshot", "parallelscan_reinitialize": "table_block_parallelscan_reinitialize", "relation_copy_for_cluster": "heapam_relation_copy_for_cluster", "scan_getnextslot_tidrange": "heap_getnextslot_tidrange", "relation_fetch_toast_slice": "heap_fetch_toast_slice", "relation_needs_toast_table": "heapam_relation_needs_toast_table", "tuple_complete_speculative": "heapam_tuple_complete_speculative", "relation_set_new_filelocator": "heapam_relation_set_new_filelocator", "relation_nontransactional_truncate": "heapam_relation_nontransactional_truncate"}, "source_options": [], "protocol_versions": {}}, "comparison_hash": "d129057b9afc0cb9f38d3137a9d84fd96a035ed851fab81db9903db8ab10aabd", "manual_language": "zh", "runtime_verified": false}, "17": {"facts": [{"label": "\u63a5\u53e3\u7c7b\u522b", "value": "\u8868\u8bbf\u95ee\u65b9\u6cd5"}, {"label": "\u5904\u7406\u51fd\u6570\u6216\u4f8b\u7a0b", "value": "heapam_methods"}, {"label": "\u8bb0\u5f55\u7684\u56de\u8c03", "value": "44"}], "tables": [{"key": "callbacks", "rows": [{"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u5143\u7ec4\u69fd", "callback": "slot_callbacks", "implementation": "heapam_slot_callbacks"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u5f00\u59cb\u626b\u63cf", "callback": "scan_begin", "implementation": "heap_beginscan"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u521d\u59cb\u5316\u5e76\u884c\u626b\u63cf", "callback": "parallelscan_initialize", "implementation": "table_block_parallelscan_initialize"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u5f00\u59cb\u7d22\u5f15\u67e5\u627e", "callback": "index_fetch_begin", "implementation": "heapam_index_fetch_begin"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u83b7\u53d6\u6307\u5b9a\u5143\u7ec4", "callback": "index_fetch_tuple", "implementation": "heapam_index_fetch_tuple"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u63d2\u5165\u5143\u7ec4", "callback": "tuple_insert", "implementation": "heapam_tuple_insert"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u66f4\u65b0\u5143\u7ec4", "callback": "tuple_update", "implementation": "heapam_tuple_update"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u5220\u9664\u5143\u7ec4", "callback": "tuple_delete", "implementation": "heapam_tuple_delete"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u5bf9\u5173\u7cfb\u6267\u884c VACUUM", "callback": "relation_vacuum", "implementation": "heap_vacuum_rel"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u5206\u6790\u6570\u636e\u5757", "callback": "scan_analyze_next_block", "implementation": "heapam_scan_analyze_next_block"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "TOAST \u5224\u5b9a", "callback": "relation_needs_toast_table", "implementation": "heapam_relation_needs_toast_table"}], "title": "\u6ce8\u518c\u7684\u63a5\u53e3\u5904\u7406\u51fd\u6570", "columns": [{"key": "feature", "label": "\u63a5\u53e3\u64cd\u4f5c"}, {"key": "state", "label": "\u6e90\u7801\u89c2\u5bdf"}, {"key": "callback", "label": "\u56de\u8c03"}, {"key": "implementation", "label": "\u5b9e\u73b0"}]}], "related": [{"url": "/wiki/catalog/pg_am/?v=17", "label": "\u7cfb\u7edf\u76ee\u5f55 pg_am"}, {"url": "/wiki/guc/default_table_access_method/?v=17", "label": "default_table_access_method"}, {"url": "/wiki/indexam/?v=17", "label": "\u7d22\u5f15\u8bbf\u95ee\u65b9\u6cd5"}], "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://pg.center/docs/17/tableam.html", "path": "tableam.html", "label": "PostgreSQL 17 English manual", "sha256": "fe8df94617712b5fe74fe0a46f7f72438e671e243b03a4fb68c5925a10c7aefe", "language": "en", "original_url": "/docs/17/tableam.html"}, {"url": "https://ftp.postgresql.org/pub/source/v17.11/postgresql-17.11.tar.bz2", "line": 2592, "path": "src/backend/access/heap/heapam_handler.c", "label": "src/backend/access/heap/heapam_handler.c:2592", "sha256": "c2cb15c279b21f71cb491ea1c6abf94479cb6a7166a341827bce308da56bccd4", "archive_sha256": "dd27f2b3c59e73ed14aa3324901242bf69a032a6347805f274e6260322d42979"}, {"url": "https://pg.center/docs/17/mvcc-intro.html", "path": "mvcc-intro.html", "label": "PostgreSQL 17 English manual", "sha256": "0ccd499b03dc7f8e803e7682cff147929ae032ff893dcf4b36e66a4480ef0b9a", "language": "en", "original_url": "/docs/17/mvcc-intro.html"}, {"url": "https://pg.center/docs/17/sql-createtable.html", "path": "sql-createtable.html", "label": "PostgreSQL 17 English manual", "sha256": "97385c16a0ff155ad89fe616bb074bf0a8328bcb21f5e64a7a6a0a03ddb1f4ef", "language": "en", "original_url": "/docs/17/sql-createtable.html"}, {"url": "https://pg.center/docs/17/routine-vacuuming.html", "path": "routine-vacuuming.html", "label": "PostgreSQL 17 English manual", "sha256": "2f7caa1e26c93613937e7a6f422db31839f7aae55ee5c97f7b8807ff6b544e38", "language": "en", "original_url": "/docs/17/routine-vacuuming.html"}, {"url": "https://pg.center/docs/17/catalog-pg-am.html", "path": "catalog-pg-am.html", "label": "PostgreSQL 17 English manual", "sha256": "919e02926ce8d5b206bb575cb8a1c5f60b2eee3d06cd375c0891fc779802b798", "language": "en", "original_url": "/docs/17/catalog-pg-am.html"}], "sections": [{"title": "\u63a5\u53e3\u4e0e\u80fd\u529b\u8fb9\u754c", "paragraphs": ["\u77e9\u9635\u8bb0\u5f55\u6b64\u6e90\u7801\u6784\u5efa\u5b9e\u9645\u6ce8\u518c\u7684\u56de\u8c03\u3002\u6ce8\u518c\u8868\u660e\u5b9e\u73b0\u4e86\u76f8\u5e94\u63a5\u53e3\u94a9\u5b50\uff1b\u64cd\u4f5c\u662f\u5426\u5141\u8bb8\u8fd8\u53d6\u51b3\u4e8e\u9009\u9879\u3001\u67e5\u8be2\u5f62\u5f0f\u3001\u6743\u9650\u548c\u63d0\u4f9b\u65b9\u89c4\u5219\u3002", "\u4e0b\u65b9\u4fdd\u7559\u540c\u7248\u672c\u5b8c\u6574\u624b\u518c\uff0c\u5305\u62ec\u914d\u7f6e\u3001\u7ea6\u675f\u548c\u793a\u4f8b\u3002\u4e0d\u58f0\u79f0\u5df2\u8fdb\u884c\u8fd0\u884c\u65f6\u80fd\u529b\u6d4b\u8bd5\u3002"]}, {"title": "\u5806\u5b58\u50a8\u3001\u53ef\u89c1\u6027\u4e0e WAL", "paragraphs": ["\u6b64\u6e05\u5355\u4ece PostgreSQL 12 \u5f15\u5165\u7684 Table AM \u63a5\u53e3\u5f00\u59cb\u3002\u4e0d\u4f1a\u5c06\u66f4\u65e9\u7248\u672c\u7684 PostgreSQL \u5806\u5b58\u50a8\u91cd\u65b0\u6807\u4e3a Table AM \u5b9e\u73b0\u3002", "\u5806\u53ef\u89c1\u6027\u9075\u5faa PostgreSQL \u5feb\u7167\u3002WAL \u548c\u5d29\u6e83\u6062\u590d\u884c\u4e3a\u53d6\u51b3\u4e8e\u5173\u7cfb\u7684\u6301\u4e45\u6027\uff1b\u4e34\u65f6\u8868\u3001\u65e0\u65e5\u5fd7\u8868\u4e0e\u6c38\u4e45\u8868\u4e0d\u540c\u3002\u7d22\u5f15\u8bbf\u95ee\u65b9\u6cd5\u4e0e\u8868\u5b58\u50a8\u63a5\u53e3\u5206\u5f00\u3002"]}, {"code": "{\n\t.type = T_TableAmRoutine,\n\n\t.slot_callbacks = heapam_slot_callbacks,\n\n\t.scan_begin = heap_beginscan,\n\t.scan_end = heap_endscan,\n\t.scan_rescan = heap_rescan,\n\t.scan_getnextslot = heap_getnextslot,\n\n\t.scan_set_tidrange = heap_set_tidrange,\n\t.scan_getnextslot_tidrange = heap_getnextslot_tidrange,\n\n\t.parallelscan_estimate = table_block_parallelscan_estimate,\n\t.parallelscan_initialize = table_block_parallelscan_initialize,\n\t.parallelscan_reinitialize = table_block_parallelscan_reinitialize,\n\n\t.index_fetch_begin = heapam_index_fetch_begin,\n\t.index_fetch_reset = heapam_index_fetch_reset,\n\t.index_fetch_end = heapam_index_fetch_end,\n\t.index_fetch_tuple = heapam_index_fetch_tuple,\n\n\t.tuple_insert = heapam_tuple_insert,\n\t.tuple_insert_speculative = heapam_tuple_insert_speculative,\n\t.tuple_complete_speculative = heapam_tuple_complete_speculative,\n\t.multi_insert = heap_multi_insert,\n\t.tuple_delete = heapam_tuple_delete,\n\t.tuple_update = heapam_tuple_update,\n\t.tuple_lock = heapam_tuple_lock,\n\n\t.tuple_fetch_row_version = heapam_fetch_row_version,\n\t.tuple_get_latest_tid = heap_get_latest_tid,\n\t.tuple_tid_valid = heapam_tuple_tid_valid,\n\t.tuple_satisfies_snapshot = heapam_tuple_satisfies_snapshot,\n\t.index_delete_tuples = heap_index_delete_tuples,\n\n\t.relation_set_new_filelocator = heapam_relation_set_new_filelocator,\n\t.relation_nontransactional_truncate = heapam_relation_nontransactional_truncate,\n\t.relation_copy_data = heapam_relation_copy_data,\n\t.relation_copy_for_cluster = heapam_relation_copy_for_cluster,\n\t.relation_vacuum = heap_vacuum_rel,\n\t.scan_analyze_next_block = heapam_scan_analyze_next_block,\n\t.scan_analyze_next_tuple = heapam_scan_analyze_next_tuple,\n\t.index_build_range_scan = heapam_index_build_range_scan,\n\t.index_validate_scan = heapam_index_validate_scan,\n\n\t.relation_size = table_block_relation_size,\n\t.relation_needs_toast_table = heapam_relation_needs_toast_table,\n\t.relation_toast_am = heapam_relation_toast_am,\n\t.relation_fetch_toast_slice = heap_fetch_toast_slice,\n\n\t.relation_estimate_size = heapam_estimate_rel_size,\n\n\t.scan_bitmap_next_block = heapam_scan_bitmap_next_block,\n\t.scan_bitmap_next_tuple = heapam_scan_bitmap_next_tuple,\n\t.scan_sample_next_block = heapam_scan_sample_next_block,\n\t.scan_sample_next_tuple = heapam_scan_sample_next_tuple\n}", "title": "\u6838\u5fc3\u6e90\u7801\u4e2d\u6ce8\u518c\u7684\u5b9e\u73b0"}], "callbacks": {"scan_end": "heap_endscan", "scan_begin": "heap_beginscan", "tuple_lock": "heapam_tuple_lock", "scan_rescan": "heap_rescan", "multi_insert": "heap_multi_insert", "tuple_delete": "heapam_tuple_delete", "tuple_insert": "heapam_tuple_insert", "tuple_update": "heapam_tuple_update", "relation_size": "table_block_relation_size", "slot_callbacks": "heapam_slot_callbacks", "index_fetch_end": "heapam_index_fetch_end", "relation_vacuum": "heap_vacuum_rel", "tuple_tid_valid": "heapam_tuple_tid_valid", "scan_getnextslot": "heap_getnextslot", "index_fetch_begin": "heapam_index_fetch_begin", "index_fetch_reset": "heapam_index_fetch_reset", "index_fetch_tuple": "heapam_index_fetch_tuple", "relation_toast_am": "heapam_relation_toast_am", "scan_set_tidrange": "heap_set_tidrange", "relation_copy_data": "heapam_relation_copy_data", "index_delete_tuples": "heap_index_delete_tuples", "index_validate_scan": "heapam_index_validate_scan", "tuple_get_latest_tid": "heap_get_latest_tid", "parallelscan_estimate": "table_block_parallelscan_estimate", "index_build_range_scan": "heapam_index_build_range_scan", "relation_estimate_size": "heapam_estimate_rel_size", "scan_bitmap_next_block": "heapam_scan_bitmap_next_block", "scan_bitmap_next_tuple": "heapam_scan_bitmap_next_tuple", "scan_sample_next_block": "heapam_scan_sample_next_block", "scan_sample_next_tuple": "heapam_scan_sample_next_tuple", "parallelscan_initialize": "table_block_parallelscan_initialize", "scan_analyze_next_block": "heapam_scan_analyze_next_block", "scan_analyze_next_tuple": "heapam_scan_analyze_next_tuple", "tuple_fetch_row_version": "heapam_fetch_row_version", "tuple_insert_speculative": "heapam_tuple_insert_speculative", "tuple_satisfies_snapshot": "heapam_tuple_satisfies_snapshot", "parallelscan_reinitialize": "table_block_parallelscan_reinitialize", "relation_copy_for_cluster": "heapam_relation_copy_for_cluster", "scan_getnextslot_tidrange": "heap_getnextslot_tidrange", "relation_fetch_toast_slice": "heap_fetch_toast_slice", "relation_needs_toast_table": "heapam_relation_needs_toast_table", "tuple_complete_speculative": "heapam_tuple_complete_speculative", "relation_set_new_filelocator": "heapam_relation_set_new_filelocator", "relation_nontransactional_truncate": "heapam_relation_nontransactional_truncate"}, "description": ["\u5185\u7f6e heap \u8868\u8bbf\u95ee\u65b9\u6cd5\u5c06\u5143\u7ec4\u5b58\u50a8\u3001\u53ef\u89c1\u6027\u3001\u626b\u63cf\u3001\u7d22\u5f15\u83b7\u53d6\u548c\u7ef4\u62a4\u64cd\u4f5c\u96c6\u6210\u5230 PostgreSQL \u4e2d\u3002"], "manual_html": "<div class=\"chapter\" id=\"TABLEAM\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h2 class=\"title\" lang=\"zh\">\u7b2c 61 \u7ae0. Table Access Method Interface Definition</h2>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u672c\u7ae0\u8bf4\u660e <span class=\"productname\">PostgreSQL</span> \u6838\u5fc3\u7cfb\u7edf\u4e0e\u7ba1\u7406\u8868\u5b58\u50a8\u7684<em class=\"firstterm\">\u8868\u8bbf\u95ee\u65b9\u6cd5</em>\u4e4b\u95f4\u7684\u63a5\u53e3\u3002\u9664\u8fd9\u91cc\u89c4\u5b9a\u7684\u5185\u5bb9\u4e4b\u5916\uff0c\u6838\u5fc3\u7cfb\u7edf\u5bf9\u8fd9\u4e9b\u8bbf\u95ee\u65b9\u6cd5\u77e5\u4e4b\u751a\u5c11\uff0c\u56e0\u6b64\u53ef\u4ee5\u901a\u8fc7\u7f16\u5199\u9644\u52a0\u4ee3\u7801\u6765\u5f00\u53d1\u5168\u65b0\u7684\u8bbf\u95ee\u65b9\u6cd5\u7c7b\u578b\u3002</p>\n<p lang=\"zh\">\u6bcf\u4e2a\u8868\u8bbf\u95ee\u65b9\u6cd5\u90fd\u7531\u7cfb\u7edf\u76ee\u5f55 <a class=\"link\" href=\"/docs/17/catalog-pg-am.html\" title=\"51.3.\u00a0pg_am\"><code class=\"structname\">pg_am</code></a> \u4e2d\u7684\u4e00\u884c\u63cf\u8ff0\u3002<code class=\"structname\">pg_am</code> \u6761\u76ee\u6307\u5b9a\u4e86\u8be5\u8868\u8bbf\u95ee\u65b9\u6cd5\u7684\u540d\u79f0\u4ee5\u53ca\u4e00\u4e2a<em class=\"firstterm\">\u5904\u7406\u5668\u51fd\u6570</em>\u3002\u8fd9\u4e9b\u6761\u76ee\u53ef\u4ee5\u901a\u8fc7<a class=\"xref\" href=\"/docs/17/sql-create-access-method.html\" title=\"CREATE ACCESS METHOD\"><span class=\"refentrytitle\">CREATE ACCESS METHOD</span></a>\u548c<a class=\"xref\" href=\"/docs/17/sql-drop-access-method.html\" title=\"DROP ACCESS METHOD\"><span class=\"refentrytitle\">DROP ACCESS METHOD</span></a> SQL \u547d\u4ee4\u521b\u5efa\u548c\u5220\u9664\u3002</p>\n<p lang=\"zh\">\u8868\u8bbf\u95ee\u65b9\u6cd5\u7684\u5904\u7406\u5668\u51fd\u6570\u5fc5\u987b\u58f0\u660e\u4e3a\u63a5\u53d7\u4e00\u4e2a <code class=\"type\">internal</code> \u7c7b\u578b\u7684\u53c2\u6570\uff0c\u5e76\u8fd4\u56de\u4f2a\u7c7b\u578b <code class=\"type\">table_am_handler</code>\u3002\u8fd9\u4e2a\u53c2\u6570\u53ea\u662f\u4e00\u4e2a\u5360\u4f4d\u503c\uff0c\u7528\u6765\u9632\u6b62\u5904\u7406\u5668\u51fd\u6570\u88ab SQL \u547d\u4ee4\u76f4\u63a5\u8c03\u7528\u3002\u8be5\u51fd\u6570\u7684\u7ed3\u679c\u5fc5\u987b\u662f\u4e00\u4e2a\u6307\u5411 <code class=\"structname\">TableAmRoutine</code> \u7ed3\u6784\u4f53\u7684\u6307\u9488\uff0c\u5176\u4e2d\u5305\u542b\u6838\u5fc3\u4ee3\u7801\u4f7f\u7528\u8be5\u8868\u8bbf\u95ee\u65b9\u6cd5\u6240\u9700\u7684\u5168\u90e8\u4fe1\u606f\u3002\u8fd4\u56de\u503c\u9700\u8981\u5177\u6709\u670d\u52a1\u5668\u751f\u547d\u5468\u671f\uff0c\u8fd9\u901a\u5e38\u901a\u8fc7\u5c06\u5176\u5b9a\u4e49\u4e3a\u5168\u5c40\u4f5c\u7528\u57df\u4e2d\u7684 <code class=\"literal\">static const</code> \u53d8\u91cf\u6765\u5b9e\u73b0\u3002<code class=\"structname\">TableAmRoutine</code> \u7ed3\u6784\u4f53\u4e5f\u79f0\u4e3a\u8be5\u8bbf\u95ee\u65b9\u6cd5\u7684<em class=\"firstterm\">API \u7ed3\u6784\u4f53</em>\uff0c\u5b83\u901a\u8fc7\u56de\u8c03\u6765\u5b9a\u4e49\u8bbf\u95ee\u65b9\u6cd5\u7684\u884c\u4e3a\u3002\u8fd9\u4e9b\u56de\u8c03\u662f\u666e\u901a C \u51fd\u6570\u7684\u6307\u9488\uff0c\u5728 SQL \u5c42\u65e2\u4e0d\u53ef\u89c1\u4e5f\u4e0d\u53ef\u8c03\u7528\u3002\u6240\u6709\u56de\u8c03\u53ca\u5176\u884c\u4e3a\u90fd\u5b9a\u4e49\u5728 <code class=\"structname\">TableAmRoutine</code> \u7ed3\u6784\u4f53\u4e2d\uff08\u7ed3\u6784\u4f53\u5185\u7684\u6ce8\u91ca\u8bf4\u660e\u4e86\u5bf9\u56de\u8c03\u7684\u8981\u6c42\uff09\u3002\u5927\u591a\u6570\u56de\u8c03\u90fd\u6709\u5305\u88c5\u51fd\u6570\uff0c\u5176\u6587\u6863\u662f\u4ece\u8868\u8bbf\u95ee\u65b9\u6cd5\u4f7f\u7528\u8005\u800c\u975e\u5b9e\u73b0\u8005\u7684\u89d2\u5ea6\u7f16\u5199\u7684\u3002\u8be6\u60c5\u8bf7\u53c2\u9605 <a class=\"ulink\" href=\"https://git.postgresql.org/gitweb/?p=postgresql.git;a=blob;f=src/include/access/tableam.h;hb=HEAD\" target=\"_top\"><code class=\"filename\">src/include/access/tableam.h</code></a> \u6587\u4ef6\u3002</p>\n<p lang=\"zh\">\u5b9e\u73b0\u8bbf\u95ee\u65b9\u6cd5\u65f6\uff0c\u901a\u5e38\u9700\u8981\u5b9e\u73b0\u4e13\u7528\u7684\u5143\u7ec4\u8868\u69fd\u4f4d\u7c7b\u578b\uff08\u53c2\u89c1 src/include/executor/tuptable.h\uff09\uff0c\u4f7f\u8bbf\u95ee\u65b9\u6cd5\u4e4b\u5916\u7684\u4ee3\u7801\u53ef\u4ee5\u6301\u6709\u8be5\u65b9\u6cd5\u7684\u5143\u7ec4\u5f15\u7528\uff0c\u5e76\u8bbf\u95ee\u5143\u7ec4\u5404\u5217\u3002</p>\n<p lang=\"zh\">\u76ee\u524d\uff0cAM \u5b9e\u9645\u5b58\u50a8\u6570\u636e\u7684\u65b9\u5f0f\u6240\u53d7\u9650\u5236\u76f8\u5f53\u5c11\u3002\u4f8b\u5982\uff0c\u53ef\u4ee5\u4f7f\u7528 postgres \u7684\u5171\u4eab\u7f13\u51b2\u533a\u7f13\u5b58\uff0c\u4f46\u8fd9\u5e76\u975e\u5fc5\u9700\u3002\u5982\u679c\u4f7f\u7528\u5b83\uff0c\u90a3\u4e48\u91c7\u7528 <span class=\"productname\">PostgreSQL</span> \u5728<a class=\"xref\" href=\"/docs/17/storage-page-layout.html\" title=\"65.6.\u00a0\u6570\u636e\u5e93\u9875\u9762\u5e03\u5c40\">\u7b2c\u00a065.6\u00a0\u8282</a>\u4e2d\u63cf\u8ff0\u7684\u6807\u51c6\u9875\u9762\u5e03\u5c40\u901a\u5e38\u662f\u6709\u610f\u4e49\u7684\u3002</p>\n<p lang=\"zh\">\u8868\u8bbf\u95ee\u65b9\u6cd5 API \u76ee\u524d\u7684\u4e00\u9879\u8f83\u5927\u9650\u5236\u662f\uff1a\u82e5\u8bbf\u95ee\u65b9\u6cd5\u5e0c\u671b\u652f\u6301\u4fee\u6539\u64cd\u4f5c\u548c/\u6216\u7d22\u5f15\uff0c\u6bcf\u4e2a\u5143\u7ec4\u5fc5\u987b\u6709\u4e00\u4e2a\u7531\u5757\u53f7\u548c\u9879\u53f7\u7ec4\u6210\u7684\u5143\u7ec4\u6807\u8bc6\u7b26 TID\uff08\u53e6\u89c1\u7b2c 65.6 \u8282\uff09\u3002TID \u5404\u90e8\u5206\u4e0d\u5fc5\u5177\u6709\u4e0e heap \u4e2d\u5b8c\u5168\u76f8\u540c\u7684\u542b\u4e49\uff1b\u4f46\u5982\u679c\u8981\u652f\u6301\u53ef\u9009\u7684\u4f4d\u56fe\u626b\u63cf\uff0c\u5757\u53f7\u5c31\u9700\u8981\u63d0\u4f9b\u5c40\u90e8\u6027\u3002</p>\n<p lang=\"zh\">\u4e3a\u4fdd\u8bc1\u5d29\u6e83\u5b89\u5168\uff0cAM \u53ef\u4ee5\u4f7f\u7528 postgres \u7684<a class=\"link\" href=\"/docs/17/wal.html\" title=\"\u7b2c\u00a028\u00a0\u7ae0\u00a0\u53ef\u9760\u6027\u4e0e\u9884\u5199\u5f0f\u65e5\u5fd7\"><acronym class=\"acronym\">WAL</acronym></a>\uff0c\u4e5f\u53ef\u4ee5\u4f7f\u7528\u81ea\u5b9a\u4e49\u5b9e\u73b0\u3002\u5982\u679c\u9009\u62e9\u4e86 <acronym class=\"acronym\">WAL</acronym>\uff0c\u53ef\u4ee5\u4f7f\u7528<a class=\"link\" href=\"/docs/17/generic-wal.html\" title=\"63.1.\u00a0\u901a\u7528 WAL \u8bb0\u5f55\">\u901a\u7528 WAL \u8bb0\u5f55</a>\uff0c\u4e5f\u53ef\u4ee5\u5b9e\u73b0\u4e00\u4e2a<a class=\"link\" href=\"/docs/17/custom-rmgr.html\" title=\"63.2.\u00a0\u81ea\u5b9a\u4e49 WAL \u8d44\u6e90\u7ba1\u7406\u5668\">\u81ea\u5b9a\u4e49 WAL \u8d44\u6e90\u7ba1\u7406\u5668</a>\u3002</p>\n<p lang=\"zh\">\u8981\u4ee5\u5141\u8bb8\u5728\u5355\u4e2a\u4e8b\u52a1\u4e2d\u8bbf\u95ee\u4e0d\u540c\u8868\u8bbf\u95ee\u65b9\u6cd5\u7684\u65b9\u5f0f\u5b9e\u73b0\u4e8b\u52a1\u652f\u6301\uff0c\u5f88\u53ef\u80fd\u9700\u8981\u4e0e <code class=\"filename\">src/backend/access/transam/xlog.c</code> \u4e2d\u7684\u673a\u5236\u7d27\u5bc6\u96c6\u6210\u3002</p>\n<p lang=\"zh\">\u5f00\u53d1\u65b0\u7684\u8868\u8bbf\u95ee\u65b9\u6cd5\u65f6\uff0c\u53ef\u4ee5\u53c2\u7167 src/backend/access/heap/heapam_handler.c \u4e2d\u73b0\u6709\u7684\u5806\u5b9e\u73b0\uff0c\u4e86\u89e3\u5b9e\u73b0\u7ec6\u8282\u3002</p>\n</div>", "manual_path": "/docs/17/tableam.html", "localization": {"status": "complete", "sources": [{"url": "/docs/17/tableam.html", "method": "same-major semantic node", "sha256": "ca73f37930100ff33aba97daef737d45dbc72bfaa127f973a18dfd1608cd5c74", "language": "zh", "matched_nodes": ["#TABLEAM/p[10]", "#TABLEAM/p[3]", "#TABLEAM/p[4]", "#TABLEAM/p[5]", "#TABLEAM/p[7]", "#TABLEAM/p[9]"]}], "language": "zh", "original_text": {"/versions/17/description/0": "The built-in heap table access method integrates tuple storage, visibility, scans, index fetches and maintenance with PostgreSQL.", "/versions/17/facts/0/label": "Interface family", "/versions/17/facts/0/value": "Table access method", "/versions/17/facts/1/label": "Handler or routine", "/versions/17/facts/2/label": "Recorded callbacks", "/versions/17/tables/0/title": "Registered interface handlers", "/versions/17/related/0/label": "System catalog pg_am", "/versions/17/related/2/label": "Index AM", "/versions/17/sections/0/title": "Interface and capability boundaries", "/versions/17/sections/1/title": "Heap storage, visibility and WAL", "/versions/17/sections/2/title": "Registered implementation in core source", "/versions/17/tables/0/rows/0/state": "Handler registered; conditions apply", "/versions/17/tables/0/rows/1/state": "Handler registered; conditions apply", "/versions/17/tables/0/rows/2/state": "Handler registered; conditions apply", "/versions/17/tables/0/rows/3/state": "Handler registered; conditions apply", "/versions/17/tables/0/rows/4/state": "Handler registered; conditions apply", "/versions/17/tables/0/rows/5/state": "Handler registered; conditions apply", "/versions/17/tables/0/rows/6/state": "Handler registered; conditions apply", "/versions/17/tables/0/rows/7/state": "Handler registered; conditions apply", "/versions/17/tables/0/rows/8/state": "Handler registered; conditions apply", "/versions/17/tables/0/rows/9/state": "Handler registered; conditions apply", "/versions/17/tables/0/rows/10/state": "Handler registered; conditions apply", "/versions/17/sections/0/paragraphs/0": "The matrix records callbacks actually registered in this source build. Registration identifies an implemented interface hook; options, query shape, privileges and provider rules determine whether an operation is allowed.", "/versions/17/sections/0/paragraphs/1": "The complete same-version manual below retains configuration, constraints and examples. No runtime capability test is claimed.", "/versions/17/sections/1/paragraphs/0": "This inventory starts with the Table AM interface in PostgreSQL 12. Earlier PostgreSQL heap storage is not relabeled as a Table AM implementation.", "/versions/17/sections/1/paragraphs/1": "Heap visibility follows PostgreSQL snapshots. WAL and crash-recovery behavior depend on relation persistence; temporary and unlogged tables differ from permanent tables. Index access methods remain separate from the table storage interface.", "/versions/17/tables/0/rows/0/feature": "Tuple slot", "/versions/17/tables/0/rows/1/feature": "Begin scan", "/versions/17/tables/0/rows/2/feature": "Parallel scan initialization", "/versions/17/tables/0/rows/3/feature": "Begin index lookup", "/versions/17/tables/0/rows/4/feature": "Fetch identified tuple", "/versions/17/tables/0/rows/5/feature": "Insert tuple", "/versions/17/tables/0/rows/6/feature": "Update tuple", "/versions/17/tables/0/rows/7/feature": "Delete tuple", "/versions/17/tables/0/rows/8/feature": "Vacuum relation", "/versions/17/tables/0/rows/9/feature": "Analyze block", "/versions/17/tables/0/columns/0/label": "Interface operation", "/versions/17/tables/0/columns/1/label": "Source observation", "/versions/17/tables/0/columns/2/label": "Callback", "/versions/17/tables/0/columns/3/label": "Implementation", "/versions/17/tables/0/rows/10/feature": "TOAST decision"}, "fallback_fields": [], "source_language": "en", "original_snapshot_sha256": "c1d9721769c8557cb9594ecfcdddfbbc571fd11768bfd2848c6c4227502362d5"}, "evidence_kind": "source and documentation", "comparison_data": {"options": [], "callbacks": {"scan_end": "heap_endscan", "scan_begin": "heap_beginscan", "tuple_lock": "heapam_tuple_lock", "scan_rescan": "heap_rescan", "multi_insert": "heap_multi_insert", "tuple_delete": "heapam_tuple_delete", "tuple_insert": "heapam_tuple_insert", "tuple_update": "heapam_tuple_update", "relation_size": "table_block_relation_size", "slot_callbacks": "heapam_slot_callbacks", "index_fetch_end": "heapam_index_fetch_end", "relation_vacuum": "heap_vacuum_rel", "tuple_tid_valid": "heapam_tuple_tid_valid", "scan_getnextslot": "heap_getnextslot", "index_fetch_begin": "heapam_index_fetch_begin", "index_fetch_reset": "heapam_index_fetch_reset", "index_fetch_tuple": "heapam_index_fetch_tuple", "relation_toast_am": "heapam_relation_toast_am", "scan_set_tidrange": "heap_set_tidrange", "relation_copy_data": "heapam_relation_copy_data", "index_delete_tuples": "heap_index_delete_tuples", "index_validate_scan": "heapam_index_validate_scan", "tuple_get_latest_tid": "heap_get_latest_tid", "parallelscan_estimate": "table_block_parallelscan_estimate", "index_build_range_scan": "heapam_index_build_range_scan", "relation_estimate_size": "heapam_estimate_rel_size", "scan_bitmap_next_block": "heapam_scan_bitmap_next_block", "scan_bitmap_next_tuple": "heapam_scan_bitmap_next_tuple", "scan_sample_next_block": "heapam_scan_sample_next_block", "scan_sample_next_tuple": "heapam_scan_sample_next_tuple", "parallelscan_initialize": "table_block_parallelscan_initialize", "scan_analyze_next_block": "heapam_scan_analyze_next_block", "scan_analyze_next_tuple": "heapam_scan_analyze_next_tuple", "tuple_fetch_row_version": "heapam_fetch_row_version", "tuple_insert_speculative": "heapam_tuple_insert_speculative", "tuple_satisfies_snapshot": "heapam_tuple_satisfies_snapshot", "parallelscan_reinitialize": "table_block_parallelscan_reinitialize", "relation_copy_for_cluster": "heapam_relation_copy_for_cluster", "scan_getnextslot_tidrange": "heap_getnextslot_tidrange", "relation_fetch_toast_slice": "heap_fetch_toast_slice", "relation_needs_toast_table": "heapam_relation_needs_toast_table", "tuple_complete_speculative": "heapam_tuple_complete_speculative", "relation_set_new_filelocator": "heapam_relation_set_new_filelocator", "relation_nontransactional_truncate": "heapam_relation_nontransactional_truncate"}, "source_options": [], "protocol_versions": {}}, "comparison_hash": "d129057b9afc0cb9f38d3137a9d84fd96a035ed851fab81db9903db8ab10aabd", "manual_language": "zh", "runtime_verified": false}, "18": {"facts": [{"label": "\u63a5\u53e3\u7c7b\u522b", "value": "\u8868\u8bbf\u95ee\u65b9\u6cd5"}, {"label": "\u5904\u7406\u51fd\u6570\u6216\u4f8b\u7a0b", "value": "heapam_methods"}, {"label": "\u8bb0\u5f55\u7684\u56de\u8c03", "value": "43"}], "tables": [{"key": "callbacks", "rows": [{"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u5143\u7ec4\u69fd", "callback": "slot_callbacks", "implementation": "heapam_slot_callbacks"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u5f00\u59cb\u626b\u63cf", "callback": "scan_begin", "implementation": "heap_beginscan"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u521d\u59cb\u5316\u5e76\u884c\u626b\u63cf", "callback": "parallelscan_initialize", "implementation": "table_block_parallelscan_initialize"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u5f00\u59cb\u7d22\u5f15\u67e5\u627e", "callback": "index_fetch_begin", "implementation": "heapam_index_fetch_begin"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u83b7\u53d6\u6307\u5b9a\u5143\u7ec4", "callback": "index_fetch_tuple", "implementation": "heapam_index_fetch_tuple"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u63d2\u5165\u5143\u7ec4", "callback": "tuple_insert", "implementation": "heapam_tuple_insert"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u66f4\u65b0\u5143\u7ec4", "callback": "tuple_update", "implementation": "heapam_tuple_update"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u5220\u9664\u5143\u7ec4", "callback": "tuple_delete", "implementation": "heapam_tuple_delete"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u5bf9\u5173\u7cfb\u6267\u884c VACUUM", "callback": "relation_vacuum", "implementation": "heap_vacuum_rel"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u5206\u6790\u6570\u636e\u5757", "callback": "scan_analyze_next_block", "implementation": "heapam_scan_analyze_next_block"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "TOAST \u5224\u5b9a", "callback": "relation_needs_toast_table", "implementation": "heapam_relation_needs_toast_table"}], "title": "\u6ce8\u518c\u7684\u63a5\u53e3\u5904\u7406\u51fd\u6570", "columns": [{"key": "feature", "label": "\u63a5\u53e3\u64cd\u4f5c"}, {"key": "state", "label": "\u6e90\u7801\u89c2\u5bdf"}, {"key": "callback", "label": "\u56de\u8c03"}, {"key": "implementation", "label": "\u5b9e\u73b0"}]}], "related": [{"url": "/wiki/catalog/pg_am/?v=18", "label": "\u7cfb\u7edf\u76ee\u5f55 pg_am"}, {"url": "/wiki/guc/default_table_access_method/?v=18", "label": "default_table_access_method"}, {"url": "/wiki/indexam/?v=18", "label": "\u7d22\u5f15\u8bbf\u95ee\u65b9\u6cd5"}], "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://pg.center/docs/18/tableam.html", "path": "tableam.html", "label": "PostgreSQL 18 English manual", "sha256": "e659dece936c960dfea9e801720deb3d76abf2c3696abb3f58d32ac17d0f22aa", "language": "en", "original_url": "/docs/18/tableam.html"}, {"url": "https://ftp.postgresql.org/pub/source/v18.6/postgresql-18.6.tar.bz2", "line": 2616, "path": "src/backend/access/heap/heapam_handler.c", "label": "src/backend/access/heap/heapam_handler.c:2616", "sha256": "fd60a1f8d5530ce5c33fda6b74123c3c22e8c3b9ca6455a0e5d47aa392797a1e", "archive_sha256": "555610c24d53e4316da5b7d3fc25c279d96856d5e0e23ee308c328c5fa881d9f"}, {"url": "https://pg.center/docs/18/mvcc-intro.html", "path": "mvcc-intro.html", "label": "PostgreSQL 18 English manual", "sha256": "456469051ccd15ec2cfa1f2e656901a3bb63414db367003215ff810d638593e1", "language": "en", "original_url": "/docs/18/mvcc-intro.html"}, {"url": "https://pg.center/docs/18/sql-createtable.html", "path": "sql-createtable.html", "label": "PostgreSQL 18 English manual", "sha256": "b4d703391fe1102d0e02bd6769bef928513eb7a5542f38f7448fc77fe69e0d5b", "language": "en", "original_url": "/docs/18/sql-createtable.html"}, {"url": "https://pg.center/docs/18/routine-vacuuming.html", "path": "routine-vacuuming.html", "label": "PostgreSQL 18 English manual", "sha256": "ede8964df385f5bc69ae991369e6eaf99ae58aa2d6210e8bf868f090bb95b002", "language": "en", "original_url": "/docs/18/routine-vacuuming.html"}, {"url": "https://pg.center/docs/18/catalog-pg-am.html", "path": "catalog-pg-am.html", "label": "PostgreSQL 18 English manual", "sha256": "579364179365a51945e2edb6481df5d198916c2c725e506f166824dedf08994c", "language": "en", "original_url": "/docs/18/catalog-pg-am.html"}], "sections": [{"title": "\u63a5\u53e3\u4e0e\u80fd\u529b\u8fb9\u754c", "paragraphs": ["\u77e9\u9635\u8bb0\u5f55\u6b64\u6e90\u7801\u6784\u5efa\u5b9e\u9645\u6ce8\u518c\u7684\u56de\u8c03\u3002\u6ce8\u518c\u8868\u660e\u5b9e\u73b0\u4e86\u76f8\u5e94\u63a5\u53e3\u94a9\u5b50\uff1b\u64cd\u4f5c\u662f\u5426\u5141\u8bb8\u8fd8\u53d6\u51b3\u4e8e\u9009\u9879\u3001\u67e5\u8be2\u5f62\u5f0f\u3001\u6743\u9650\u548c\u63d0\u4f9b\u65b9\u89c4\u5219\u3002", "\u4e0b\u65b9\u4fdd\u7559\u540c\u7248\u672c\u5b8c\u6574\u624b\u518c\uff0c\u5305\u62ec\u914d\u7f6e\u3001\u7ea6\u675f\u548c\u793a\u4f8b\u3002\u4e0d\u58f0\u79f0\u5df2\u8fdb\u884c\u8fd0\u884c\u65f6\u80fd\u529b\u6d4b\u8bd5\u3002"]}, {"title": "\u5806\u5b58\u50a8\u3001\u53ef\u89c1\u6027\u4e0e WAL", "paragraphs": ["\u6b64\u6e05\u5355\u4ece PostgreSQL 12 \u5f15\u5165\u7684 Table AM \u63a5\u53e3\u5f00\u59cb\u3002\u4e0d\u4f1a\u5c06\u66f4\u65e9\u7248\u672c\u7684 PostgreSQL \u5806\u5b58\u50a8\u91cd\u65b0\u6807\u4e3a Table AM \u5b9e\u73b0\u3002", "\u5806\u53ef\u89c1\u6027\u9075\u5faa PostgreSQL \u5feb\u7167\u3002WAL \u548c\u5d29\u6e83\u6062\u590d\u884c\u4e3a\u53d6\u51b3\u4e8e\u5173\u7cfb\u7684\u6301\u4e45\u6027\uff1b\u4e34\u65f6\u8868\u3001\u65e0\u65e5\u5fd7\u8868\u4e0e\u6c38\u4e45\u8868\u4e0d\u540c\u3002\u7d22\u5f15\u8bbf\u95ee\u65b9\u6cd5\u4e0e\u8868\u5b58\u50a8\u63a5\u53e3\u5206\u5f00\u3002"]}, {"code": "{\n\t.type = T_TableAmRoutine,\n\n\t.slot_callbacks = heapam_slot_callbacks,\n\n\t.scan_begin = heap_beginscan,\n\t.scan_end = heap_endscan,\n\t.scan_rescan = heap_rescan,\n\t.scan_getnextslot = heap_getnextslot,\n\n\t.scan_set_tidrange = heap_set_tidrange,\n\t.scan_getnextslot_tidrange = heap_getnextslot_tidrange,\n\n\t.parallelscan_estimate = table_block_parallelscan_estimate,\n\t.parallelscan_initialize = table_block_parallelscan_initialize,\n\t.parallelscan_reinitialize = table_block_parallelscan_reinitialize,\n\n\t.index_fetch_begin = heapam_index_fetch_begin,\n\t.index_fetch_reset = heapam_index_fetch_reset,\n\t.index_fetch_end = heapam_index_fetch_end,\n\t.index_fetch_tuple = heapam_index_fetch_tuple,\n\n\t.tuple_insert = heapam_tuple_insert,\n\t.tuple_insert_speculative = heapam_tuple_insert_speculative,\n\t.tuple_complete_speculative = heapam_tuple_complete_speculative,\n\t.multi_insert = heap_multi_insert,\n\t.tuple_delete = heapam_tuple_delete,\n\t.tuple_update = heapam_tuple_update,\n\t.tuple_lock = heapam_tuple_lock,\n\n\t.tuple_fetch_row_version = heapam_fetch_row_version,\n\t.tuple_get_latest_tid = heap_get_latest_tid,\n\t.tuple_tid_valid = heapam_tuple_tid_valid,\n\t.tuple_satisfies_snapshot = heapam_tuple_satisfies_snapshot,\n\t.index_delete_tuples = heap_index_delete_tuples,\n\n\t.relation_set_new_filelocator = heapam_relation_set_new_filelocator,\n\t.relation_nontransactional_truncate = heapam_relation_nontransactional_truncate,\n\t.relation_copy_data = heapam_relation_copy_data,\n\t.relation_copy_for_cluster = heapam_relation_copy_for_cluster,\n\t.relation_vacuum = heap_vacuum_rel,\n\t.scan_analyze_next_block = heapam_scan_analyze_next_block,\n\t.scan_analyze_next_tuple = heapam_scan_analyze_next_tuple,\n\t.index_build_range_scan = heapam_index_build_range_scan,\n\t.index_validate_scan = heapam_index_validate_scan,\n\n\t.relation_size = table_block_relation_size,\n\t.relation_needs_toast_table = heapam_relation_needs_toast_table,\n\t.relation_toast_am = heapam_relation_toast_am,\n\t.relation_fetch_toast_slice = heap_fetch_toast_slice,\n\n\t.relation_estimate_size = heapam_estimate_rel_size,\n\n\t.scan_bitmap_next_tuple = heapam_scan_bitmap_next_tuple,\n\t.scan_sample_next_block = heapam_scan_sample_next_block,\n\t.scan_sample_next_tuple = heapam_scan_sample_next_tuple\n}", "title": "\u6838\u5fc3\u6e90\u7801\u4e2d\u6ce8\u518c\u7684\u5b9e\u73b0"}], "callbacks": {"scan_end": "heap_endscan", "scan_begin": "heap_beginscan", "tuple_lock": "heapam_tuple_lock", "scan_rescan": "heap_rescan", "multi_insert": "heap_multi_insert", "tuple_delete": "heapam_tuple_delete", "tuple_insert": "heapam_tuple_insert", "tuple_update": "heapam_tuple_update", "relation_size": "table_block_relation_size", "slot_callbacks": "heapam_slot_callbacks", "index_fetch_end": "heapam_index_fetch_end", "relation_vacuum": "heap_vacuum_rel", "tuple_tid_valid": "heapam_tuple_tid_valid", "scan_getnextslot": "heap_getnextslot", "index_fetch_begin": "heapam_index_fetch_begin", "index_fetch_reset": "heapam_index_fetch_reset", "index_fetch_tuple": "heapam_index_fetch_tuple", "relation_toast_am": "heapam_relation_toast_am", "scan_set_tidrange": "heap_set_tidrange", "relation_copy_data": "heapam_relation_copy_data", "index_delete_tuples": "heap_index_delete_tuples", "index_validate_scan": "heapam_index_validate_scan", "tuple_get_latest_tid": "heap_get_latest_tid", "parallelscan_estimate": "table_block_parallelscan_estimate", "index_build_range_scan": "heapam_index_build_range_scan", "relation_estimate_size": "heapam_estimate_rel_size", "scan_bitmap_next_tuple": "heapam_scan_bitmap_next_tuple", "scan_sample_next_block": "heapam_scan_sample_next_block", "scan_sample_next_tuple": "heapam_scan_sample_next_tuple", "parallelscan_initialize": "table_block_parallelscan_initialize", "scan_analyze_next_block": "heapam_scan_analyze_next_block", "scan_analyze_next_tuple": "heapam_scan_analyze_next_tuple", "tuple_fetch_row_version": "heapam_fetch_row_version", "tuple_insert_speculative": "heapam_tuple_insert_speculative", "tuple_satisfies_snapshot": "heapam_tuple_satisfies_snapshot", "parallelscan_reinitialize": "table_block_parallelscan_reinitialize", "relation_copy_for_cluster": "heapam_relation_copy_for_cluster", "scan_getnextslot_tidrange": "heap_getnextslot_tidrange", "relation_fetch_toast_slice": "heap_fetch_toast_slice", "relation_needs_toast_table": "heapam_relation_needs_toast_table", "tuple_complete_speculative": "heapam_tuple_complete_speculative", "relation_set_new_filelocator": "heapam_relation_set_new_filelocator", "relation_nontransactional_truncate": "heapam_relation_nontransactional_truncate"}, "description": ["\u5185\u7f6e heap \u8868\u8bbf\u95ee\u65b9\u6cd5\u5c06\u5143\u7ec4\u5b58\u50a8\u3001\u53ef\u89c1\u6027\u3001\u626b\u63cf\u3001\u7d22\u5f15\u83b7\u53d6\u548c\u7ef4\u62a4\u64cd\u4f5c\u96c6\u6210\u5230 PostgreSQL \u4e2d\u3002"], "manual_html": "<div class=\"chapter\" id=\"TABLEAM\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h2 class=\"title\" lang=\"zh\">\u7b2c 62 \u7ae0. Table Access Method Interface Definition</h2>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u672c\u7ae0\u8bf4\u660e <span class=\"productname\">PostgreSQL</span> \u6838\u5fc3\u7cfb\u7edf\u4e0e\u7ba1\u7406\u8868\u5b58\u50a8\u7684<em class=\"firstterm\">\u8868\u8bbf\u95ee\u65b9\u6cd5</em>\u4e4b\u95f4\u7684\u63a5\u53e3\u3002\u9664\u8fd9\u91cc\u89c4\u5b9a\u7684\u5185\u5bb9\u4e4b\u5916\uff0c\u6838\u5fc3\u7cfb\u7edf\u5bf9\u8fd9\u4e9b\u8bbf\u95ee\u65b9\u6cd5\u77e5\u4e4b\u751a\u5c11\uff0c\u56e0\u6b64\u53ef\u4ee5\u901a\u8fc7\u7f16\u5199\u9644\u52a0\u4ee3\u7801\u6765\u5f00\u53d1\u5168\u65b0\u7684\u8bbf\u95ee\u65b9\u6cd5\u7c7b\u578b\u3002</p>\n<p lang=\"zh\">\u6bcf\u4e2a\u8868\u8bbf\u95ee\u65b9\u6cd5\u90fd\u7531\u7cfb\u7edf\u76ee\u5f55 <a class=\"link\" href=\"/docs/18/catalog-pg-am.html\" title=\"52.3.\u00a0pg_am\"><code class=\"structname\">pg_am</code></a> \u4e2d\u7684\u4e00\u884c\u63cf\u8ff0\u3002<code class=\"structname\">pg_am</code> \u6761\u76ee\u6307\u5b9a\u4e86\u8be5\u8868\u8bbf\u95ee\u65b9\u6cd5\u7684\u540d\u79f0\u4ee5\u53ca\u4e00\u4e2a<em class=\"firstterm\">\u5904\u7406\u5668\u51fd\u6570</em>\u3002\u8fd9\u4e9b\u6761\u76ee\u53ef\u4ee5\u901a\u8fc7<a class=\"xref\" href=\"/docs/18/sql-create-access-method.html\" title=\"CREATE ACCESS METHOD\"><span class=\"refentrytitle\">CREATE ACCESS METHOD</span></a>\u548c<a class=\"xref\" href=\"/docs/18/sql-drop-access-method.html\" title=\"DROP ACCESS METHOD\"><span class=\"refentrytitle\">DROP ACCESS METHOD</span></a> SQL \u547d\u4ee4\u521b\u5efa\u548c\u5220\u9664\u3002</p>\n<p lang=\"zh\">\u8868\u8bbf\u95ee\u65b9\u6cd5\u7684\u5904\u7406\u5668\u51fd\u6570\u5fc5\u987b\u58f0\u660e\u4e3a\u63a5\u53d7\u4e00\u4e2a <code class=\"type\">internal</code> \u7c7b\u578b\u7684\u53c2\u6570\uff0c\u5e76\u8fd4\u56de\u4f2a\u7c7b\u578b <code class=\"type\">table_am_handler</code>\u3002\u8fd9\u4e2a\u53c2\u6570\u53ea\u662f\u4e00\u4e2a\u5360\u4f4d\u503c\uff0c\u7528\u6765\u9632\u6b62\u5904\u7406\u5668\u51fd\u6570\u88ab SQL \u547d\u4ee4\u76f4\u63a5\u8c03\u7528\u3002</p>\n<p lang=\"zh\">\u4e0b\u9762\u5c55\u793a\u6269\u5c55 SQL \u811a\u672c\u6587\u4ef6\u5982\u4f55\u521b\u5efa\u8868\u8bbf\u95ee\u65b9\u6cd5\u5904\u7406\u5668\uff1a</p>\n<pre class=\"programlisting\">CREATE OR REPLACE FUNCTION my_tableam_handler(internal)\n  RETURNS table_am_handler AS 'my_extension', 'my_tableam_handler'\n  LANGUAGE C STRICT;\n\nCREATE ACCESS METHOD myam TYPE TABLE HANDLER my_tableam_handler;\n</pre>\n<p lang=\"zh\">\u8be5\u51fd\u6570\u7684\u7ed3\u679c\u5fc5\u987b\u662f\u4e00\u4e2a\u6307\u5411 <code class=\"structname\">TableAmRoutine</code> \u7ed3\u6784\u4f53\u7684\u6307\u9488\uff0c\u5176\u4e2d\u5305\u542b\u6838\u5fc3\u4ee3\u7801\u4f7f\u7528\u8be5\u8868\u8bbf\u95ee\u65b9\u6cd5\u6240\u9700\u7684\u5168\u90e8\u4fe1\u606f\u3002\u8fd4\u56de\u503c\u9700\u8981\u5177\u6709\u670d\u52a1\u5668\u751f\u547d\u5468\u671f\uff0c\u8fd9\u901a\u5e38\u901a\u8fc7\u5c06\u5176\u5b9a\u4e49\u4e3a\u5168\u5c40\u4f5c\u7528\u57df\u4e2d\u7684 <code class=\"literal\">static const</code> \u53d8\u91cf\u6765\u5b9e\u73b0\u3002</p>\n<p lang=\"zh\">\u4e0b\u9762\u662f\u4e00\u4e2a\u5305\u542b\u8868\u8bbf\u95ee\u65b9\u6cd5\u5904\u7406\u5668\u7684\u6e90\u6587\u4ef6\u793a\u4f8b\uff1a</p>\n<pre class=\"programlisting\">#include \"postgres.h\"\n\n#include \"access/tableam.h\"\n#include \"fmgr.h\"\n\nPG_MODULE_MAGIC;\n\nstatic const TableAmRoutine my_tableam_methods = {\n    .type = T_TableAmRoutine,\n\n    /* Methods of TableAmRoutine omitted from example, add them here. */\n};\n\nPG_FUNCTION_INFO_V1(my_tableam_handler);\n\nDatum\nmy_tableam_handler(PG_FUNCTION_ARGS)\n{\n    PG_RETURN_POINTER(&amp;my_tableam_methods);\n}\n\n</pre>\n<p lang=\"zh\"><code class=\"structname\">TableAmRoutine</code> \u7ed3\u6784\u4f53\u4e5f\u79f0\u4e3a\u8be5\u8bbf\u95ee\u65b9\u6cd5\u7684<em class=\"firstterm\">API \u7ed3\u6784\u4f53</em>\uff0c\u5b83\u901a\u8fc7\u56de\u8c03\u6765\u5b9a\u4e49\u8bbf\u95ee\u65b9\u6cd5\u7684\u884c\u4e3a\u3002\u8fd9\u4e9b\u56de\u8c03\u662f\u666e\u901a C \u51fd\u6570\u7684\u6307\u9488\uff0c\u5728 SQL \u5c42\u65e2\u4e0d\u53ef\u89c1\u4e5f\u4e0d\u53ef\u8c03\u7528\u3002\u6240\u6709\u56de\u8c03\u53ca\u5176\u884c\u4e3a\u90fd\u5b9a\u4e49\u5728 <code class=\"structname\">TableAmRoutine</code> \u7ed3\u6784\u4f53\u4e2d\uff08\u7ed3\u6784\u4f53\u5185\u7684\u6ce8\u91ca\u8bf4\u660e\u4e86\u5bf9\u56de\u8c03\u7684\u8981\u6c42\uff09\u3002\u5927\u591a\u6570\u56de\u8c03\u90fd\u6709\u5305\u88c5\u51fd\u6570\uff0c\u5176\u6587\u6863\u662f\u4ece\u8868\u8bbf\u95ee\u65b9\u6cd5\u4f7f\u7528\u8005\u800c\u975e\u5b9e\u73b0\u8005\u7684\u89d2\u5ea6\u7f16\u5199\u7684\u3002\u8be6\u60c5\u8bf7\u53c2\u9605 <a class=\"ulink\" href=\"https://git.postgresql.org/gitweb/?p=postgresql.git;a=blob;f=src/include/access/tableam.h;hb=HEAD\" target=\"_top\"><code class=\"filename\">src/include/access/tableam.h</code></a> \u6587\u4ef6\u3002</p>\n<p lang=\"zh\">\u5b9e\u73b0\u8bbf\u95ee\u65b9\u6cd5\u65f6\uff0c\u901a\u5e38\u9700\u8981\u5b9e\u73b0\u4e13\u7528\u7684\u5143\u7ec4\u8868\u69fd\u4f4d\u7c7b\u578b\uff08\u53c2\u89c1 src/include/executor/tuptable.h\uff09\uff0c\u4f7f\u8bbf\u95ee\u65b9\u6cd5\u4e4b\u5916\u7684\u4ee3\u7801\u53ef\u4ee5\u6301\u6709\u8be5\u65b9\u6cd5\u7684\u5143\u7ec4\u5f15\u7528\uff0c\u5e76\u8bbf\u95ee\u5143\u7ec4\u5404\u5217\u3002</p>\n<p lang=\"zh\">\u76ee\u524d\uff0cAM \u5b9e\u9645\u5b58\u50a8\u6570\u636e\u7684\u65b9\u5f0f\u6240\u53d7\u9650\u5236\u76f8\u5f53\u5c11\u3002\u4f8b\u5982\uff0c\u53ef\u4ee5\u4f7f\u7528 postgres \u7684\u5171\u4eab\u7f13\u51b2\u533a\u7f13\u5b58\uff0c\u4f46\u8fd9\u5e76\u975e\u5fc5\u9700\u3002\u5982\u679c\u4f7f\u7528\u5b83\uff0c\u90a3\u4e48\u91c7\u7528 <span class=\"productname\">PostgreSQL</span> \u5728<a class=\"xref\" href=\"/docs/18/storage-page-layout.html\" title=\"66.6.\u00a0\u6570\u636e\u5e93\u9875\u9762\u5e03\u5c40\">\u7b2c\u00a066.6\u00a0\u8282</a>\u4e2d\u63cf\u8ff0\u7684\u6807\u51c6\u9875\u9762\u5e03\u5c40\u901a\u5e38\u662f\u6709\u610f\u4e49\u7684\u3002</p>\n<p lang=\"zh\">\u8868\u8bbf\u95ee\u65b9\u6cd5 API \u76ee\u524d\u7684\u4e00\u9879\u8f83\u5927\u9650\u5236\u662f\uff1a\u82e5\u8bbf\u95ee\u65b9\u6cd5\u5e0c\u671b\u652f\u6301\u4fee\u6539\u64cd\u4f5c\u548c/\u6216\u7d22\u5f15\uff0c\u6bcf\u4e2a\u5143\u7ec4\u5fc5\u987b\u6709\u4e00\u4e2a\u7531\u5757\u53f7\u548c\u9879\u53f7\u7ec4\u6210\u7684\u5143\u7ec4\u6807\u8bc6\u7b26 TID\uff08\u53e6\u89c1\u7b2c 66.6 \u8282\uff09\u3002TID \u5404\u90e8\u5206\u4e0d\u5fc5\u5177\u6709\u4e0e heap \u4e2d\u5b8c\u5168\u76f8\u540c\u7684\u542b\u4e49\uff1b\u4f46\u5982\u679c\u8981\u652f\u6301\u53ef\u9009\u7684\u4f4d\u56fe\u626b\u63cf\uff0c\u5757\u53f7\u5c31\u9700\u8981\u63d0\u4f9b\u5c40\u90e8\u6027\u3002</p>\n<p lang=\"zh\">\u4e3a\u4fdd\u8bc1\u5d29\u6e83\u5b89\u5168\uff0cAM \u53ef\u4ee5\u4f7f\u7528 postgres \u7684<a class=\"link\" href=\"/docs/18/wal.html\" title=\"\u7b2c\u00a028\u00a0\u7ae0\u00a0\u53ef\u9760\u6027\u4e0e\u9884\u5199\u5f0f\u65e5\u5fd7\"><acronym class=\"acronym\">WAL</acronym></a>\uff0c\u4e5f\u53ef\u4ee5\u4f7f\u7528\u81ea\u5b9a\u4e49\u5b9e\u73b0\u3002\u5982\u679c\u9009\u62e9\u4e86 <acronym class=\"acronym\">WAL</acronym>\uff0c\u53ef\u4ee5\u4f7f\u7528<a class=\"link\" href=\"/docs/18/generic-wal.html\" title=\"64.1.\u00a0\u901a\u7528 WAL \u8bb0\u5f55\">\u901a\u7528 WAL \u8bb0\u5f55</a>\uff0c\u4e5f\u53ef\u4ee5\u5b9e\u73b0\u4e00\u4e2a<a class=\"link\" href=\"/docs/18/custom-rmgr.html\" title=\"64.2.\u00a0\u81ea\u5b9a\u4e49 WAL \u8d44\u6e90\u7ba1\u7406\u5668\">\u81ea\u5b9a\u4e49 WAL \u8d44\u6e90\u7ba1\u7406\u5668</a>\u3002</p>\n<p lang=\"zh\">\u8981\u4ee5\u5141\u8bb8\u5728\u5355\u4e2a\u4e8b\u52a1\u4e2d\u8bbf\u95ee\u4e0d\u540c\u8868\u8bbf\u95ee\u65b9\u6cd5\u7684\u65b9\u5f0f\u5b9e\u73b0\u4e8b\u52a1\u652f\u6301\uff0c\u5f88\u53ef\u80fd\u9700\u8981\u4e0e <code class=\"filename\">src/backend/access/transam/xlog.c</code> \u4e2d\u7684\u673a\u5236\u7d27\u5bc6\u96c6\u6210\u3002</p>\n<p lang=\"zh\">\u5f00\u53d1\u65b0\u7684\u8868\u8bbf\u95ee\u65b9\u6cd5\u65f6\uff0c\u53ef\u4ee5\u53c2\u7167 src/backend/access/heap/heapam_handler.c \u4e2d\u73b0\u6709\u7684\u5806\u5b9e\u73b0\uff0c\u4e86\u89e3\u5b9e\u73b0\u7ec6\u8282\u3002</p>\n</div>", "manual_path": "/docs/18/tableam.html", "localization": {"status": "complete", "sources": [{"url": "/docs/18/tableam.html", "method": "same-major semantic node", "sha256": "29a69a32b5b468f79af513ef4e398bccc182443109d9f3da23f374e018b981e6", "language": "zh", "matched_nodes": ["#TABLEAM/p[11]", "#TABLEAM/p[13]", "#TABLEAM/p[15]", "#TABLEAM/p[16]", "#TABLEAM/p[3]", "#TABLEAM/p[4]", "#TABLEAM/p[5]", "#TABLEAM/p[6]", "#TABLEAM/p[8]", "#TABLEAM/p[9]"]}], "language": "zh", "original_text": {"/versions/18/description/0": "The built-in heap table access method integrates tuple storage, visibility, scans, index fetches and maintenance with PostgreSQL.", "/versions/18/facts/0/label": "Interface family", "/versions/18/facts/0/value": "Table access method", "/versions/18/facts/1/label": "Handler or routine", "/versions/18/facts/2/label": "Recorded callbacks", "/versions/18/tables/0/title": "Registered interface handlers", "/versions/18/related/0/label": "System catalog pg_am", "/versions/18/related/2/label": "Index AM", "/versions/18/sections/0/title": "Interface and capability boundaries", "/versions/18/sections/1/title": "Heap storage, visibility and WAL", "/versions/18/sections/2/title": "Registered implementation in core source", "/versions/18/tables/0/rows/0/state": "Handler registered; conditions apply", "/versions/18/tables/0/rows/1/state": "Handler registered; conditions apply", "/versions/18/tables/0/rows/2/state": "Handler registered; conditions apply", "/versions/18/tables/0/rows/3/state": "Handler registered; conditions apply", "/versions/18/tables/0/rows/4/state": "Handler registered; conditions apply", "/versions/18/tables/0/rows/5/state": "Handler registered; conditions apply", "/versions/18/tables/0/rows/6/state": "Handler registered; conditions apply", "/versions/18/tables/0/rows/7/state": "Handler registered; conditions apply", "/versions/18/tables/0/rows/8/state": "Handler registered; conditions apply", "/versions/18/tables/0/rows/9/state": "Handler registered; conditions apply", "/versions/18/tables/0/rows/10/state": "Handler registered; conditions apply", "/versions/18/sections/0/paragraphs/0": "The matrix records callbacks actually registered in this source build. Registration identifies an implemented interface hook; options, query shape, privileges and provider rules determine whether an operation is allowed.", "/versions/18/sections/0/paragraphs/1": "The complete same-version manual below retains configuration, constraints and examples. No runtime capability test is claimed.", "/versions/18/sections/1/paragraphs/0": "This inventory starts with the Table AM interface in PostgreSQL 12. Earlier PostgreSQL heap storage is not relabeled as a Table AM implementation.", "/versions/18/sections/1/paragraphs/1": "Heap visibility follows PostgreSQL snapshots. WAL and crash-recovery behavior depend on relation persistence; temporary and unlogged tables differ from permanent tables. Index access methods remain separate from the table storage interface.", "/versions/18/tables/0/rows/0/feature": "Tuple slot", "/versions/18/tables/0/rows/1/feature": "Begin scan", "/versions/18/tables/0/rows/2/feature": "Parallel scan initialization", "/versions/18/tables/0/rows/3/feature": "Begin index lookup", "/versions/18/tables/0/rows/4/feature": "Fetch identified tuple", "/versions/18/tables/0/rows/5/feature": "Insert tuple", "/versions/18/tables/0/rows/6/feature": "Update tuple", "/versions/18/tables/0/rows/7/feature": "Delete tuple", "/versions/18/tables/0/rows/8/feature": "Vacuum relation", "/versions/18/tables/0/rows/9/feature": "Analyze block", "/versions/18/tables/0/columns/0/label": "Interface operation", "/versions/18/tables/0/columns/1/label": "Source observation", "/versions/18/tables/0/columns/2/label": "Callback", "/versions/18/tables/0/columns/3/label": "Implementation", "/versions/18/tables/0/rows/10/feature": "TOAST decision"}, "fallback_fields": [], "source_language": "en", "original_snapshot_sha256": "6c7bd2e2f6691cce57c835d991feefc5864df47eda2ec7884768f0c2efa48406"}, "evidence_kind": "source and documentation", "comparison_data": {"options": [], "callbacks": {"scan_end": "heap_endscan", "scan_begin": "heap_beginscan", "tuple_lock": "heapam_tuple_lock", "scan_rescan": "heap_rescan", "multi_insert": "heap_multi_insert", "tuple_delete": "heapam_tuple_delete", "tuple_insert": "heapam_tuple_insert", "tuple_update": "heapam_tuple_update", "relation_size": "table_block_relation_size", "slot_callbacks": "heapam_slot_callbacks", "index_fetch_end": "heapam_index_fetch_end", "relation_vacuum": "heap_vacuum_rel", "tuple_tid_valid": "heapam_tuple_tid_valid", "scan_getnextslot": "heap_getnextslot", "index_fetch_begin": "heapam_index_fetch_begin", "index_fetch_reset": "heapam_index_fetch_reset", "index_fetch_tuple": "heapam_index_fetch_tuple", "relation_toast_am": "heapam_relation_toast_am", "scan_set_tidrange": "heap_set_tidrange", "relation_copy_data": "heapam_relation_copy_data", "index_delete_tuples": "heap_index_delete_tuples", "index_validate_scan": "heapam_index_validate_scan", "tuple_get_latest_tid": "heap_get_latest_tid", "parallelscan_estimate": "table_block_parallelscan_estimate", "index_build_range_scan": "heapam_index_build_range_scan", "relation_estimate_size": "heapam_estimate_rel_size", "scan_bitmap_next_tuple": "heapam_scan_bitmap_next_tuple", "scan_sample_next_block": "heapam_scan_sample_next_block", "scan_sample_next_tuple": "heapam_scan_sample_next_tuple", "parallelscan_initialize": "table_block_parallelscan_initialize", "scan_analyze_next_block": "heapam_scan_analyze_next_block", "scan_analyze_next_tuple": "heapam_scan_analyze_next_tuple", "tuple_fetch_row_version": "heapam_fetch_row_version", "tuple_insert_speculative": "heapam_tuple_insert_speculative", "tuple_satisfies_snapshot": "heapam_tuple_satisfies_snapshot", "parallelscan_reinitialize": "table_block_parallelscan_reinitialize", "relation_copy_for_cluster": "heapam_relation_copy_for_cluster", "scan_getnextslot_tidrange": "heap_getnextslot_tidrange", "relation_fetch_toast_slice": "heap_fetch_toast_slice", "relation_needs_toast_table": "heapam_relation_needs_toast_table", "tuple_complete_speculative": "heapam_tuple_complete_speculative", "relation_set_new_filelocator": "heapam_relation_set_new_filelocator", "relation_nontransactional_truncate": "heapam_relation_nontransactional_truncate"}, "source_options": [], "protocol_versions": {}}, "comparison_hash": "1238506f6e6c6648382f3362465d376e28e55ca6108f975b44f413d320769112", "manual_language": "zh", "runtime_verified": false}, "19": {"facts": [{"label": "\u63a5\u53e3\u7c7b\u522b", "value": "\u8868\u8bbf\u95ee\u65b9\u6cd5"}, {"label": "\u5904\u7406\u51fd\u6570\u6216\u4f8b\u7a0b", "value": "heapam_methods"}, {"label": "\u8bb0\u5f55\u7684\u56de\u8c03", "value": "43"}], "tables": [{"key": "callbacks", "rows": [{"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u5143\u7ec4\u69fd", "callback": "slot_callbacks", "implementation": "heapam_slot_callbacks"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u5f00\u59cb\u626b\u63cf", "callback": "scan_begin", "implementation": "heap_beginscan"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u521d\u59cb\u5316\u5e76\u884c\u626b\u63cf", "callback": "parallelscan_initialize", "implementation": "table_block_parallelscan_initialize"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u5f00\u59cb\u7d22\u5f15\u67e5\u627e", "callback": "index_fetch_begin", "implementation": "heapam_index_fetch_begin"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u83b7\u53d6\u6307\u5b9a\u5143\u7ec4", "callback": "index_fetch_tuple", "implementation": "heapam_index_fetch_tuple"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u63d2\u5165\u5143\u7ec4", "callback": "tuple_insert", "implementation": "heapam_tuple_insert"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u66f4\u65b0\u5143\u7ec4", "callback": "tuple_update", "implementation": "heapam_tuple_update"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u5220\u9664\u5143\u7ec4", "callback": "tuple_delete", "implementation": "heapam_tuple_delete"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u5bf9\u5173\u7cfb\u6267\u884c VACUUM", "callback": "relation_vacuum", "implementation": "heap_vacuum_rel"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u5206\u6790\u6570\u636e\u5757", "callback": "scan_analyze_next_block", "implementation": "heapam_scan_analyze_next_block"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "TOAST \u5224\u5b9a", "callback": "relation_needs_toast_table", "implementation": "heapam_relation_needs_toast_table"}], "title": "\u6ce8\u518c\u7684\u63a5\u53e3\u5904\u7406\u51fd\u6570", "columns": [{"key": "feature", "label": "\u63a5\u53e3\u64cd\u4f5c"}, {"key": "state", "label": "\u6e90\u7801\u89c2\u5bdf"}, {"key": "callback", "label": "\u56de\u8c03"}, {"key": "implementation", "label": "\u5b9e\u73b0"}]}], "related": [{"url": "/wiki/catalog/pg_am/?v=19", "label": "\u7cfb\u7edf\u76ee\u5f55 pg_am"}, {"url": "/wiki/guc/default_table_access_method/?v=19", "label": "default_table_access_method"}, {"url": "/wiki/indexam/?v=19", "label": "\u7d22\u5f15\u8bbf\u95ee\u65b9\u6cd5"}], "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://pg.center/docs/19/tableam.html", "path": "tableam.html", "label": "PostgreSQL 19 English manual", "sha256": "0dd4fc5fe12574339fd83f5a157add6d2bfcaa3a356e9b89fd1156c88e9814ce", "language": "en", "original_url": "/docs/19/tableam.html"}, {"url": "https://ftp.postgresql.org/pub/source/v19beta4/postgresql-19beta4.tar.bz2", "line": 2657, "path": "src/backend/access/heap/heapam_handler.c", "label": "src/backend/access/heap/heapam_handler.c:2657", "sha256": "a4090217097bf16b0eedc5b0448092d640aa259a9ea9ab69caf582f910f9e911", "archive_sha256": "83157ee9c599d03b2f7a3d73ef3a56ec24e0e79cc2b3501a64d1364f56398c86"}, {"url": "https://pg.center/docs/19/mvcc-intro.html", "path": "mvcc-intro.html", "label": "PostgreSQL 19 English manual", "sha256": "edcdc2d76d4d3607abb61e52b63d43af97d3141beb5b050b4fed1e2e829846b0", "language": "en", "original_url": "/docs/19/mvcc-intro.html"}, {"url": "https://pg.center/docs/19/sql-createtable.html", "path": "sql-createtable.html", "label": "PostgreSQL 19 English manual", "sha256": "75f290d105bd0e76c798f124b1eed4ad1e871c8a1d36c35f0db9d38fbb7209f8", "language": "en", "original_url": "/docs/19/sql-createtable.html"}, {"url": "https://pg.center/docs/19/routine-vacuuming.html", "path": "routine-vacuuming.html", "label": "PostgreSQL 19 English manual", "sha256": "11c034fb2035ad09a989c38a4bba17efd989a1e6856a234f0e56bd947b1c7372", "language": "en", "original_url": "/docs/19/routine-vacuuming.html"}, {"url": "https://pg.center/docs/19/catalog-pg-am.html", "path": "catalog-pg-am.html", "label": "PostgreSQL 19 English manual", "sha256": "e3e87f797a302a2761b57510dbf48acc68ec635c8f538047c78ead25c2fba9aa", "language": "en", "original_url": "/docs/19/catalog-pg-am.html"}], "sections": [{"title": "\u63a5\u53e3\u4e0e\u80fd\u529b\u8fb9\u754c", "paragraphs": ["\u77e9\u9635\u8bb0\u5f55\u6b64\u6e90\u7801\u6784\u5efa\u5b9e\u9645\u6ce8\u518c\u7684\u56de\u8c03\u3002\u6ce8\u518c\u8868\u660e\u5b9e\u73b0\u4e86\u76f8\u5e94\u63a5\u53e3\u94a9\u5b50\uff1b\u64cd\u4f5c\u662f\u5426\u5141\u8bb8\u8fd8\u53d6\u51b3\u4e8e\u9009\u9879\u3001\u67e5\u8be2\u5f62\u5f0f\u3001\u6743\u9650\u548c\u63d0\u4f9b\u65b9\u89c4\u5219\u3002", "\u4e0b\u65b9\u4fdd\u7559\u540c\u7248\u672c\u5b8c\u6574\u624b\u518c\uff0c\u5305\u62ec\u914d\u7f6e\u3001\u7ea6\u675f\u548c\u793a\u4f8b\u3002\u4e0d\u58f0\u79f0\u5df2\u8fdb\u884c\u8fd0\u884c\u65f6\u80fd\u529b\u6d4b\u8bd5\u3002"]}, {"title": "\u5806\u5b58\u50a8\u3001\u53ef\u89c1\u6027\u4e0e WAL", "paragraphs": ["\u6b64\u6e05\u5355\u4ece PostgreSQL 12 \u5f15\u5165\u7684 Table AM \u63a5\u53e3\u5f00\u59cb\u3002\u4e0d\u4f1a\u5c06\u66f4\u65e9\u7248\u672c\u7684 PostgreSQL \u5806\u5b58\u50a8\u91cd\u65b0\u6807\u4e3a Table AM \u5b9e\u73b0\u3002", "\u5806\u53ef\u89c1\u6027\u9075\u5faa PostgreSQL \u5feb\u7167\u3002WAL \u548c\u5d29\u6e83\u6062\u590d\u884c\u4e3a\u53d6\u51b3\u4e8e\u5173\u7cfb\u7684\u6301\u4e45\u6027\uff1b\u4e34\u65f6\u8868\u3001\u65e0\u65e5\u5fd7\u8868\u4e0e\u6c38\u4e45\u8868\u4e0d\u540c\u3002\u7d22\u5f15\u8bbf\u95ee\u65b9\u6cd5\u4e0e\u8868\u5b58\u50a8\u63a5\u53e3\u5206\u5f00\u3002"]}, {"code": "{\n\t.type = T_TableAmRoutine,\n\n\t.slot_callbacks = heapam_slot_callbacks,\n\n\t.scan_begin = heap_beginscan,\n\t.scan_end = heap_endscan,\n\t.scan_rescan = heap_rescan,\n\t.scan_getnextslot = heap_getnextslot,\n\n\t.scan_set_tidrange = heap_set_tidrange,\n\t.scan_getnextslot_tidrange = heap_getnextslot_tidrange,\n\n\t.parallelscan_estimate = table_block_parallelscan_estimate,\n\t.parallelscan_initialize = table_block_parallelscan_initialize,\n\t.parallelscan_reinitialize = table_block_parallelscan_reinitialize,\n\n\t.index_fetch_begin = heapam_index_fetch_begin,\n\t.index_fetch_reset = heapam_index_fetch_reset,\n\t.index_fetch_end = heapam_index_fetch_end,\n\t.index_fetch_tuple = heapam_index_fetch_tuple,\n\n\t.tuple_insert = heapam_tuple_insert,\n\t.tuple_insert_speculative = heapam_tuple_insert_speculative,\n\t.tuple_complete_speculative = heapam_tuple_complete_speculative,\n\t.multi_insert = heap_multi_insert,\n\t.tuple_delete = heapam_tuple_delete,\n\t.tuple_update = heapam_tuple_update,\n\t.tuple_lock = heapam_tuple_lock,\n\n\t.tuple_fetch_row_version = heapam_fetch_row_version,\n\t.tuple_get_latest_tid = heap_get_latest_tid,\n\t.tuple_tid_valid = heapam_tuple_tid_valid,\n\t.tuple_satisfies_snapshot = heapam_tuple_satisfies_snapshot,\n\t.index_delete_tuples = heap_index_delete_tuples,\n\n\t.relation_set_new_filelocator = heapam_relation_set_new_filelocator,\n\t.relation_nontransactional_truncate = heapam_relation_nontransactional_truncate,\n\t.relation_copy_data = heapam_relation_copy_data,\n\t.relation_copy_for_cluster = heapam_relation_copy_for_cluster,\n\t.relation_vacuum = heap_vacuum_rel,\n\t.scan_analyze_next_block = heapam_scan_analyze_next_block,\n\t.scan_analyze_next_tuple = heapam_scan_analyze_next_tuple,\n\t.index_build_range_scan = heapam_index_build_range_scan,\n\t.index_validate_scan = heapam_index_validate_scan,\n\n\t.relation_size = table_block_relation_size,\n\t.relation_needs_toast_table = heapam_relation_needs_toast_table,\n\t.relation_toast_am = heapam_relation_toast_am,\n\t.relation_fetch_toast_slice = heap_fetch_toast_slice,\n\n\t.relation_estimate_size = heapam_estimate_rel_size,\n\n\t.scan_bitmap_next_tuple = heapam_scan_bitmap_next_tuple,\n\t.scan_sample_next_block = heapam_scan_sample_next_block,\n\t.scan_sample_next_tuple = heapam_scan_sample_next_tuple\n}", "title": "\u6838\u5fc3\u6e90\u7801\u4e2d\u6ce8\u518c\u7684\u5b9e\u73b0"}], "callbacks": {"scan_end": "heap_endscan", "scan_begin": "heap_beginscan", "tuple_lock": "heapam_tuple_lock", "scan_rescan": "heap_rescan", "multi_insert": "heap_multi_insert", "tuple_delete": "heapam_tuple_delete", "tuple_insert": "heapam_tuple_insert", "tuple_update": "heapam_tuple_update", "relation_size": "table_block_relation_size", "slot_callbacks": "heapam_slot_callbacks", "index_fetch_end": "heapam_index_fetch_end", "relation_vacuum": "heap_vacuum_rel", "tuple_tid_valid": "heapam_tuple_tid_valid", "scan_getnextslot": "heap_getnextslot", "index_fetch_begin": "heapam_index_fetch_begin", "index_fetch_reset": "heapam_index_fetch_reset", "index_fetch_tuple": "heapam_index_fetch_tuple", "relation_toast_am": "heapam_relation_toast_am", "scan_set_tidrange": "heap_set_tidrange", "relation_copy_data": "heapam_relation_copy_data", "index_delete_tuples": "heap_index_delete_tuples", "index_validate_scan": "heapam_index_validate_scan", "tuple_get_latest_tid": "heap_get_latest_tid", "parallelscan_estimate": "table_block_parallelscan_estimate", "index_build_range_scan": "heapam_index_build_range_scan", "relation_estimate_size": "heapam_estimate_rel_size", "scan_bitmap_next_tuple": "heapam_scan_bitmap_next_tuple", "scan_sample_next_block": "heapam_scan_sample_next_block", "scan_sample_next_tuple": "heapam_scan_sample_next_tuple", "parallelscan_initialize": "table_block_parallelscan_initialize", "scan_analyze_next_block": "heapam_scan_analyze_next_block", "scan_analyze_next_tuple": "heapam_scan_analyze_next_tuple", "tuple_fetch_row_version": "heapam_fetch_row_version", "tuple_insert_speculative": "heapam_tuple_insert_speculative", "tuple_satisfies_snapshot": "heapam_tuple_satisfies_snapshot", "parallelscan_reinitialize": "table_block_parallelscan_reinitialize", "relation_copy_for_cluster": "heapam_relation_copy_for_cluster", "scan_getnextslot_tidrange": "heap_getnextslot_tidrange", "relation_fetch_toast_slice": "heap_fetch_toast_slice", "relation_needs_toast_table": "heapam_relation_needs_toast_table", "tuple_complete_speculative": "heapam_tuple_complete_speculative", "relation_set_new_filelocator": "heapam_relation_set_new_filelocator", "relation_nontransactional_truncate": "heapam_relation_nontransactional_truncate"}, "description": ["\u5185\u7f6e heap \u8868\u8bbf\u95ee\u65b9\u6cd5\u5c06\u5143\u7ec4\u5b58\u50a8\u3001\u53ef\u89c1\u6027\u3001\u626b\u63cf\u3001\u7d22\u5f15\u83b7\u53d6\u548c\u7ef4\u62a4\u64cd\u4f5c\u96c6\u6210\u5230 PostgreSQL \u4e2d\u3002"], "manual_html": "<div class=\"chapter\" id=\"TABLEAM\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h2 class=\"title\" lang=\"zh\">\u7b2c 62 \u7ae0. Table Access Method Interface Definition</h2>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u672c\u7ae0\u8bf4\u660e <span class=\"productname\">PostgreSQL</span> \u6838\u5fc3\u7cfb\u7edf\u4e0e\u7ba1\u7406\u8868\u5b58\u50a8\u7684<em class=\"firstterm\">\u8868\u8bbf\u95ee\u65b9\u6cd5</em>\u4e4b\u95f4\u7684\u63a5\u53e3\u3002\u9664\u8fd9\u91cc\u89c4\u5b9a\u7684\u5185\u5bb9\u4e4b\u5916\uff0c\u6838\u5fc3\u7cfb\u7edf\u5bf9\u8fd9\u4e9b\u8bbf\u95ee\u65b9\u6cd5\u77e5\u4e4b\u751a\u5c11\uff0c\u56e0\u6b64\u53ef\u4ee5\u901a\u8fc7\u7f16\u5199\u9644\u52a0\u4ee3\u7801\u6765\u5f00\u53d1\u5168\u65b0\u7684\u8bbf\u95ee\u65b9\u6cd5\u7c7b\u578b\u3002</p>\n<p lang=\"zh\">\u6bcf\u4e2a\u8868\u8bbf\u95ee\u65b9\u6cd5\u90fd\u7531\u7cfb\u7edf\u76ee\u5f55 <a class=\"link\" href=\"/docs/19/catalog-pg-am.html\" title=\"52.3.\u00a0pg_am\"><code class=\"structname\">pg_am</code></a> \u4e2d\u7684\u4e00\u884c\u63cf\u8ff0\u3002<code class=\"structname\">pg_am</code> \u6761\u76ee\u6307\u5b9a\u4e86\u8be5\u8868\u8bbf\u95ee\u65b9\u6cd5\u7684\u540d\u79f0\u4ee5\u53ca\u4e00\u4e2a<em class=\"firstterm\">\u5904\u7406\u5668\u51fd\u6570</em>\u3002\u8fd9\u4e9b\u6761\u76ee\u53ef\u4ee5\u901a\u8fc7<a class=\"xref\" href=\"/docs/19/sql-create-access-method.html\" title=\"CREATE ACCESS METHOD\"><span class=\"refentrytitle\">CREATE ACCESS METHOD</span></a>\u548c<a class=\"xref\" href=\"/docs/19/sql-drop-access-method.html\" title=\"DROP ACCESS METHOD\"><span class=\"refentrytitle\">DROP ACCESS METHOD</span></a> SQL \u547d\u4ee4\u521b\u5efa\u548c\u5220\u9664\u3002</p>\n<p lang=\"zh\">\u8868\u8bbf\u95ee\u65b9\u6cd5\u7684\u5904\u7406\u5668\u51fd\u6570\u5fc5\u987b\u58f0\u660e\u4e3a\u63a5\u53d7\u4e00\u4e2a <code class=\"type\">internal</code> \u7c7b\u578b\u7684\u53c2\u6570\uff0c\u5e76\u8fd4\u56de\u4f2a\u7c7b\u578b <code class=\"type\">table_am_handler</code>\u3002\u8fd9\u4e2a\u53c2\u6570\u53ea\u662f\u4e00\u4e2a\u5360\u4f4d\u503c\uff0c\u7528\u6765\u9632\u6b62\u5904\u7406\u5668\u51fd\u6570\u88ab SQL \u547d\u4ee4\u76f4\u63a5\u8c03\u7528\u3002</p>\n<p lang=\"zh\">\u4e0b\u9762\u5c55\u793a\u6269\u5c55 SQL \u811a\u672c\u6587\u4ef6\u5982\u4f55\u521b\u5efa\u8868\u8bbf\u95ee\u65b9\u6cd5\u5904\u7406\u5668\uff1a</p>\n<pre class=\"programlisting\">CREATE OR REPLACE FUNCTION my_tableam_handler(internal)\n  RETURNS table_am_handler AS 'my_extension', 'my_tableam_handler'\n  LANGUAGE C STRICT;\n\nCREATE ACCESS METHOD myam TYPE TABLE HANDLER my_tableam_handler;\n</pre>\n<p lang=\"zh\">\u8be5\u51fd\u6570\u7684\u7ed3\u679c\u5fc5\u987b\u662f\u4e00\u4e2a\u6307\u5411 <code class=\"structname\">TableAmRoutine</code> \u7ed3\u6784\u4f53\u7684\u6307\u9488\uff0c\u5176\u4e2d\u5305\u542b\u6838\u5fc3\u4ee3\u7801\u4f7f\u7528\u8be5\u8868\u8bbf\u95ee\u65b9\u6cd5\u6240\u9700\u7684\u5168\u90e8\u4fe1\u606f\u3002\u8fd4\u56de\u503c\u9700\u8981\u5177\u6709\u670d\u52a1\u5668\u751f\u547d\u5468\u671f\uff0c\u8fd9\u901a\u5e38\u901a\u8fc7\u5c06\u5176\u5b9a\u4e49\u4e3a\u5168\u5c40\u4f5c\u7528\u57df\u4e2d\u7684 <code class=\"literal\">static const</code> \u53d8\u91cf\u6765\u5b9e\u73b0\u3002</p>\n<p lang=\"zh\">\u4e0b\u9762\u662f\u4e00\u4e2a\u5305\u542b\u8868\u8bbf\u95ee\u65b9\u6cd5\u5904\u7406\u5668\u7684\u6e90\u6587\u4ef6\u793a\u4f8b\uff1a</p>\n<pre class=\"programlisting\">#include \"postgres.h\"\n\n#include \"access/tableam.h\"\n#include \"fmgr.h\"\n\nPG_MODULE_MAGIC;\n\nstatic const TableAmRoutine my_tableam_methods = {\n    .type = T_TableAmRoutine,\n\n    /* Methods of TableAmRoutine omitted from example, add them here. */\n};\n\nPG_FUNCTION_INFO_V1(my_tableam_handler);\n\nDatum\nmy_tableam_handler(PG_FUNCTION_ARGS)\n{\n    PG_RETURN_POINTER(&amp;my_tableam_methods);\n}\n\n</pre>\n<p lang=\"zh\"><code class=\"structname\">TableAmRoutine</code> \u7ed3\u6784\u4f53\u4e5f\u79f0\u4e3a\u8be5\u8bbf\u95ee\u65b9\u6cd5\u7684<em class=\"firstterm\">API \u7ed3\u6784\u4f53</em>\uff0c\u5b83\u901a\u8fc7\u56de\u8c03\u6765\u5b9a\u4e49\u8bbf\u95ee\u65b9\u6cd5\u7684\u884c\u4e3a\u3002\u8fd9\u4e9b\u56de\u8c03\u662f\u666e\u901a C \u51fd\u6570\u7684\u6307\u9488\uff0c\u5728 SQL \u5c42\u65e2\u4e0d\u53ef\u89c1\u4e5f\u4e0d\u53ef\u8c03\u7528\u3002\u6240\u6709\u56de\u8c03\u53ca\u5176\u884c\u4e3a\u90fd\u5b9a\u4e49\u5728 <code class=\"structname\">TableAmRoutine</code> \u7ed3\u6784\u4f53\u4e2d\uff08\u7ed3\u6784\u4f53\u5185\u7684\u6ce8\u91ca\u8bf4\u660e\u4e86\u5bf9\u56de\u8c03\u7684\u8981\u6c42\uff09\u3002\u5927\u591a\u6570\u56de\u8c03\u90fd\u6709\u5305\u88c5\u51fd\u6570\uff0c\u5176\u6587\u6863\u662f\u4ece\u8868\u8bbf\u95ee\u65b9\u6cd5\u4f7f\u7528\u8005\u800c\u975e\u5b9e\u73b0\u8005\u7684\u89d2\u5ea6\u7f16\u5199\u7684\u3002\u8be6\u60c5\u8bf7\u53c2\u9605 <a class=\"ulink\" href=\"https://git.postgresql.org/gitweb/?p=postgresql.git;a=blob;f=src/include/access/tableam.h;hb=HEAD\" target=\"_top\"><code class=\"filename\">src/include/access/tableam.h</code></a> \u6587\u4ef6\u3002</p>\n<p lang=\"zh\">\u5b9e\u73b0\u8bbf\u95ee\u65b9\u6cd5\u65f6\uff0c\u901a\u5e38\u9700\u8981\u5b9e\u73b0\u4e13\u7528\u7684\u5143\u7ec4\u8868\u69fd\u4f4d\u7c7b\u578b\uff08\u53c2\u89c1 src/include/executor/tuptable.h\uff09\uff0c\u4f7f\u8bbf\u95ee\u65b9\u6cd5\u4e4b\u5916\u7684\u4ee3\u7801\u53ef\u4ee5\u6301\u6709\u8be5\u65b9\u6cd5\u7684\u5143\u7ec4\u5f15\u7528\uff0c\u5e76\u8bbf\u95ee\u5143\u7ec4\u5404\u5217\u3002</p>\n<p lang=\"zh\">\u76ee\u524d\uff0cAM \u5b9e\u9645\u5b58\u50a8\u6570\u636e\u7684\u65b9\u5f0f\u6240\u53d7\u9650\u5236\u76f8\u5f53\u5c11\u3002\u4f8b\u5982\uff0c\u53ef\u4ee5\u4f7f\u7528 postgres \u7684\u5171\u4eab\u7f13\u51b2\u533a\u7f13\u5b58\uff0c\u4f46\u8fd9\u5e76\u975e\u5fc5\u9700\u3002\u5982\u679c\u4f7f\u7528\u5b83\uff0c\u90a3\u4e48\u91c7\u7528 <span class=\"productname\">PostgreSQL</span> \u5728<a class=\"xref\" href=\"/docs/19/storage-page-layout.html\" title=\"66.6.\u00a0\u6570\u636e\u5e93\u9875\u9762\u5e03\u5c40\">\u7b2c\u00a066.6\u00a0\u8282</a>\u4e2d\u63cf\u8ff0\u7684\u6807\u51c6\u9875\u9762\u5e03\u5c40\u901a\u5e38\u662f\u6709\u610f\u4e49\u7684\u3002</p>\n<p lang=\"zh\">\u8868\u8bbf\u95ee\u65b9\u6cd5 API \u76ee\u524d\u7684\u4e00\u9879\u8f83\u5927\u9650\u5236\u662f\uff1a\u82e5\u8bbf\u95ee\u65b9\u6cd5\u5e0c\u671b\u652f\u6301\u4fee\u6539\u64cd\u4f5c\u548c/\u6216\u7d22\u5f15\uff0c\u6bcf\u4e2a\u5143\u7ec4\u5fc5\u987b\u6709\u4e00\u4e2a\u7531\u5757\u53f7\u548c\u9879\u53f7\u7ec4\u6210\u7684\u5143\u7ec4\u6807\u8bc6\u7b26 TID\uff08\u53e6\u89c1\u7b2c 66.6 \u8282\uff09\u3002TID \u5404\u90e8\u5206\u4e0d\u5fc5\u5177\u6709\u4e0e heap \u4e2d\u5b8c\u5168\u76f8\u540c\u7684\u542b\u4e49\uff1b\u4f46\u5982\u679c\u8981\u652f\u6301\u53ef\u9009\u7684\u4f4d\u56fe\u626b\u63cf\uff0c\u5757\u53f7\u5c31\u9700\u8981\u63d0\u4f9b\u5c40\u90e8\u6027\u3002</p>\n<p lang=\"zh\">\u4e3a\u4fdd\u8bc1\u5d29\u6e83\u5b89\u5168\uff0cAM \u53ef\u4ee5\u4f7f\u7528 postgres \u7684<a class=\"link\" href=\"/docs/19/wal.html\" title=\"\u7b2c\u00a028\u00a0\u7ae0\u00a0\u53ef\u9760\u6027\u4e0e\u9884\u5199\u5f0f\u65e5\u5fd7\"><acronym class=\"acronym\">WAL</acronym></a>\uff0c\u4e5f\u53ef\u4ee5\u4f7f\u7528\u81ea\u5b9a\u4e49\u5b9e\u73b0\u3002\u5982\u679c\u9009\u62e9\u4e86 <acronym class=\"acronym\">WAL</acronym>\uff0c\u53ef\u4ee5\u4f7f\u7528<a class=\"link\" href=\"/docs/19/generic-wal.html\" title=\"64.1.\u00a0\u901a\u7528 WAL \u8bb0\u5f55\">\u901a\u7528 WAL \u8bb0\u5f55</a>\uff0c\u4e5f\u53ef\u4ee5\u5b9e\u73b0\u4e00\u4e2a<a class=\"link\" href=\"/docs/19/custom-rmgr.html\" title=\"64.2.\u00a0\u81ea\u5b9a\u4e49 WAL \u8d44\u6e90\u7ba1\u7406\u5668\">\u81ea\u5b9a\u4e49 WAL \u8d44\u6e90\u7ba1\u7406\u5668</a>\u3002</p>\n<p lang=\"zh\">\u8981\u4ee5\u5141\u8bb8\u5728\u5355\u4e2a\u4e8b\u52a1\u4e2d\u8bbf\u95ee\u4e0d\u540c\u8868\u8bbf\u95ee\u65b9\u6cd5\u7684\u65b9\u5f0f\u5b9e\u73b0\u4e8b\u52a1\u652f\u6301\uff0c\u5f88\u53ef\u80fd\u9700\u8981\u4e0e <code class=\"filename\">src/backend/access/transam/xlog.c</code> \u4e2d\u7684\u673a\u5236\u7d27\u5bc6\u96c6\u6210\u3002</p>\n<p lang=\"zh\">\u5f00\u53d1\u65b0\u7684\u8868\u8bbf\u95ee\u65b9\u6cd5\u65f6\uff0c\u53ef\u4ee5\u53c2\u7167 src/backend/access/heap/heapam_handler.c \u4e2d\u73b0\u6709\u7684\u5806\u5b9e\u73b0\uff0c\u4e86\u89e3\u5b9e\u73b0\u7ec6\u8282\u3002</p>\n</div>", "manual_path": "/docs/19/tableam.html", "localization": {"status": "complete", "sources": [{"url": "/docs/19/tableam.html", "method": "same-major semantic node", "sha256": "5735ad6434b05781c1697d3ef0c80da17d5082529c1db630537f5648188d9db6", "language": "zh", "matched_nodes": ["#TABLEAM/p[11]", "#TABLEAM/p[13]", "#TABLEAM/p[15]", "#TABLEAM/p[16]", "#TABLEAM/p[3]", "#TABLEAM/p[4]", "#TABLEAM/p[5]", "#TABLEAM/p[6]", "#TABLEAM/p[8]", "#TABLEAM/p[9]"]}], "language": "zh", "original_text": {"/versions/19/description/0": "The built-in heap table access method integrates tuple storage, visibility, scans, index fetches and maintenance with PostgreSQL.", "/versions/19/facts/0/label": "Interface family", "/versions/19/facts/0/value": "Table access method", "/versions/19/facts/1/label": "Handler or routine", "/versions/19/facts/2/label": "Recorded callbacks", "/versions/19/tables/0/title": "Registered interface handlers", "/versions/19/related/0/label": "System catalog pg_am", "/versions/19/related/2/label": "Index AM", "/versions/19/sections/0/title": "Interface and capability boundaries", "/versions/19/sections/1/title": "Heap storage, visibility and WAL", "/versions/19/sections/2/title": "Registered implementation in core source", "/versions/19/tables/0/rows/0/state": "Handler registered; conditions apply", "/versions/19/tables/0/rows/1/state": "Handler registered; conditions apply", "/versions/19/tables/0/rows/2/state": "Handler registered; conditions apply", "/versions/19/tables/0/rows/3/state": "Handler registered; conditions apply", "/versions/19/tables/0/rows/4/state": "Handler registered; conditions apply", "/versions/19/tables/0/rows/5/state": "Handler registered; conditions apply", "/versions/19/tables/0/rows/6/state": "Handler registered; conditions apply", "/versions/19/tables/0/rows/7/state": "Handler registered; conditions apply", "/versions/19/tables/0/rows/8/state": "Handler registered; conditions apply", "/versions/19/tables/0/rows/9/state": "Handler registered; conditions apply", "/versions/19/tables/0/rows/10/state": "Handler registered; conditions apply", "/versions/19/sections/0/paragraphs/0": "The matrix records callbacks actually registered in this source build. Registration identifies an implemented interface hook; options, query shape, privileges and provider rules determine whether an operation is allowed.", "/versions/19/sections/0/paragraphs/1": "The complete same-version manual below retains configuration, constraints and examples. No runtime capability test is claimed.", "/versions/19/sections/1/paragraphs/0": "This inventory starts with the Table AM interface in PostgreSQL 12. Earlier PostgreSQL heap storage is not relabeled as a Table AM implementation.", "/versions/19/sections/1/paragraphs/1": "Heap visibility follows PostgreSQL snapshots. WAL and crash-recovery behavior depend on relation persistence; temporary and unlogged tables differ from permanent tables. Index access methods remain separate from the table storage interface.", "/versions/19/tables/0/rows/0/feature": "Tuple slot", "/versions/19/tables/0/rows/1/feature": "Begin scan", "/versions/19/tables/0/rows/2/feature": "Parallel scan initialization", "/versions/19/tables/0/rows/3/feature": "Begin index lookup", "/versions/19/tables/0/rows/4/feature": "Fetch identified tuple", "/versions/19/tables/0/rows/5/feature": "Insert tuple", "/versions/19/tables/0/rows/6/feature": "Update tuple", "/versions/19/tables/0/rows/7/feature": "Delete tuple", "/versions/19/tables/0/rows/8/feature": "Vacuum relation", "/versions/19/tables/0/rows/9/feature": "Analyze block", "/versions/19/tables/0/columns/0/label": "Interface operation", "/versions/19/tables/0/columns/1/label": "Source observation", "/versions/19/tables/0/columns/2/label": "Callback", "/versions/19/tables/0/columns/3/label": "Implementation", "/versions/19/tables/0/rows/10/feature": "TOAST decision"}, "fallback_fields": [], "source_language": "en", "original_snapshot_sha256": "ccf234c79dca290e6688b616b78939fee4c12c6b6636d0c702b0ca71c375172d"}, "evidence_kind": "source and documentation", "comparison_data": {"options": [], "callbacks": {"scan_end": "heap_endscan", "scan_begin": "heap_beginscan", "tuple_lock": "heapam_tuple_lock", "scan_rescan": "heap_rescan", "multi_insert": "heap_multi_insert", "tuple_delete": "heapam_tuple_delete", "tuple_insert": "heapam_tuple_insert", "tuple_update": "heapam_tuple_update", "relation_size": "table_block_relation_size", "slot_callbacks": "heapam_slot_callbacks", "index_fetch_end": "heapam_index_fetch_end", "relation_vacuum": "heap_vacuum_rel", "tuple_tid_valid": "heapam_tuple_tid_valid", "scan_getnextslot": "heap_getnextslot", "index_fetch_begin": "heapam_index_fetch_begin", "index_fetch_reset": "heapam_index_fetch_reset", "index_fetch_tuple": "heapam_index_fetch_tuple", "relation_toast_am": "heapam_relation_toast_am", "scan_set_tidrange": "heap_set_tidrange", "relation_copy_data": "heapam_relation_copy_data", "index_delete_tuples": "heap_index_delete_tuples", "index_validate_scan": "heapam_index_validate_scan", "tuple_get_latest_tid": "heap_get_latest_tid", "parallelscan_estimate": "table_block_parallelscan_estimate", "index_build_range_scan": "heapam_index_build_range_scan", "relation_estimate_size": "heapam_estimate_rel_size", "scan_bitmap_next_tuple": "heapam_scan_bitmap_next_tuple", "scan_sample_next_block": "heapam_scan_sample_next_block", "scan_sample_next_tuple": "heapam_scan_sample_next_tuple", "parallelscan_initialize": "table_block_parallelscan_initialize", "scan_analyze_next_block": "heapam_scan_analyze_next_block", "scan_analyze_next_tuple": "heapam_scan_analyze_next_tuple", "tuple_fetch_row_version": "heapam_fetch_row_version", "tuple_insert_speculative": "heapam_tuple_insert_speculative", "tuple_satisfies_snapshot": "heapam_tuple_satisfies_snapshot", "parallelscan_reinitialize": "table_block_parallelscan_reinitialize", "relation_copy_for_cluster": "heapam_relation_copy_for_cluster", "scan_getnextslot_tidrange": "heap_getnextslot_tidrange", "relation_fetch_toast_slice": "heap_fetch_toast_slice", "relation_needs_toast_table": "heapam_relation_needs_toast_table", "tuple_complete_speculative": "heapam_tuple_complete_speculative", "relation_set_new_filelocator": "heapam_relation_set_new_filelocator", "relation_nontransactional_truncate": "heapam_relation_nontransactional_truncate"}, "source_options": [], "protocol_versions": {}}, "comparison_hash": "1238506f6e6c6648382f3362465d376e28e55ca6108f975b44f413d320769112", "manual_language": "zh", "runtime_verified": false}, "20": {"facts": [{"label": "\u63a5\u53e3\u7c7b\u522b", "value": "\u8868\u8bbf\u95ee\u65b9\u6cd5"}, {"label": "\u5904\u7406\u51fd\u6570\u6216\u4f8b\u7a0b", "value": "heapam_methods"}, {"label": "\u8bb0\u5f55\u7684\u56de\u8c03", "value": "43"}], "tables": [{"key": "callbacks", "rows": [{"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u5143\u7ec4\u69fd", "callback": "slot_callbacks", "implementation": "heapam_slot_callbacks"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u5f00\u59cb\u626b\u63cf", "callback": "scan_begin", "implementation": "heap_beginscan"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u521d\u59cb\u5316\u5e76\u884c\u626b\u63cf", "callback": "parallelscan_initialize", "implementation": "table_block_parallelscan_initialize"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u5f00\u59cb\u7d22\u5f15\u67e5\u627e", "callback": "index_scan_begin", "implementation": "heapam_index_scan_begin"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u83b7\u53d6\u6307\u5b9a\u5143\u7ec4", "callback": "fetch_tid", "implementation": "heapam_fetch_tid"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u63d2\u5165\u5143\u7ec4", "callback": "tuple_insert", "implementation": "heapam_tuple_insert"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u66f4\u65b0\u5143\u7ec4", "callback": "tuple_update", "implementation": "heapam_tuple_update"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u5220\u9664\u5143\u7ec4", "callback": "tuple_delete", "implementation": "heapam_tuple_delete"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u5bf9\u5173\u7cfb\u6267\u884c VACUUM", "callback": "relation_vacuum", "implementation": "heap_vacuum_rel"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u5206\u6790\u6570\u636e\u5757", "callback": "scan_analyze_next_block", "implementation": "heapam_scan_analyze_next_block"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "TOAST \u5224\u5b9a", "callback": "relation_needs_toast_table", "implementation": "heapam_relation_needs_toast_table"}], "title": "\u6ce8\u518c\u7684\u63a5\u53e3\u5904\u7406\u51fd\u6570", "columns": [{"key": "feature", "label": "\u63a5\u53e3\u64cd\u4f5c"}, {"key": "state", "label": "\u6e90\u7801\u89c2\u5bdf"}, {"key": "callback", "label": "\u56de\u8c03"}, {"key": "implementation", "label": "\u5b9e\u73b0"}]}], "related": [{"url": "/wiki/catalog/pg_am/?v=20", "label": "\u7cfb\u7edf\u76ee\u5f55 pg_am"}, {"url": "/wiki/guc/default_table_access_method/?v=20", "label": "default_table_access_method"}, {"url": "/wiki/indexam/?v=20", "label": "\u7d22\u5f15\u8bbf\u95ee\u65b9\u6cd5"}], "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://pg.center/docs/devel/tableam.html", "path": "tableam.html", "label": "PostgreSQL 20 English manual", "sha256": "347e2a6c7355ed2e214ad4159c547b6ee2a8b8c226e2679b9ceaba80c2a8ba33", "language": "en", "original_url": "/docs/devel/tableam.html"}, {"url": "https://ftp.postgresql.org/pub/snapshot/dev/postgresql-snapshot.tar.bz2", "line": 2652, "path": "src/backend/access/heap/heapam_handler.c", "label": "src/backend/access/heap/heapam_handler.c:2652", "sha256": "7fe580def664c769e01f174552c19a6063594639183f43ce7b71d98f24400bd8", "archive_sha256": "4d3346909b201ac1648232cf290462a7070c119326f56196f1f0253ed80fae41"}, {"url": "https://pg.center/docs/devel/mvcc-intro.html", "path": "mvcc-intro.html", "label": "PostgreSQL 20 English manual", "sha256": "ce5798f9f3a17538e466afba18c99632ee3cf7b56b0d536172934b8a6565fad7", "language": "en", "original_url": "/docs/devel/mvcc-intro.html"}, {"url": "https://pg.center/docs/devel/sql-createtable.html", "path": "sql-createtable.html", "label": "PostgreSQL 20 English manual", "sha256": "5241bd673de4e7a8fec7db6fa2a3a50d8368965206170725c4efd15d64c3fbf2", "language": "en", "original_url": "/docs/devel/sql-createtable.html"}, {"url": "https://pg.center/docs/devel/routine-vacuuming.html", "path": "routine-vacuuming.html", "label": "PostgreSQL 20 English manual", "sha256": "b4497c9f953dbf5ca1800dc56b36eba0b08e01aa431c54a6e8f6f0c24f96cec8", "language": "en", "original_url": "/docs/devel/routine-vacuuming.html"}, {"url": "https://pg.center/docs/devel/catalog-pg-am.html", "path": "catalog-pg-am.html", "label": "PostgreSQL 20 English manual", "sha256": "8cc12dbe216ff5b905632e071bed2fa385851a1a7938929650cec7b810acda0d", "language": "en", "original_url": "/docs/devel/catalog-pg-am.html"}], "sections": [{"title": "\u63a5\u53e3\u4e0e\u80fd\u529b\u8fb9\u754c", "paragraphs": ["\u77e9\u9635\u8bb0\u5f55\u6b64\u6e90\u7801\u6784\u5efa\u5b9e\u9645\u6ce8\u518c\u7684\u56de\u8c03\u3002\u6ce8\u518c\u8868\u660e\u5b9e\u73b0\u4e86\u76f8\u5e94\u63a5\u53e3\u94a9\u5b50\uff1b\u64cd\u4f5c\u662f\u5426\u5141\u8bb8\u8fd8\u53d6\u51b3\u4e8e\u9009\u9879\u3001\u67e5\u8be2\u5f62\u5f0f\u3001\u6743\u9650\u548c\u63d0\u4f9b\u65b9\u89c4\u5219\u3002", "\u4e0b\u65b9\u4fdd\u7559\u540c\u7248\u672c\u5b8c\u6574\u624b\u518c\uff0c\u5305\u62ec\u914d\u7f6e\u3001\u7ea6\u675f\u548c\u793a\u4f8b\u3002\u4e0d\u58f0\u79f0\u5df2\u8fdb\u884c\u8fd0\u884c\u65f6\u80fd\u529b\u6d4b\u8bd5\u3002"]}, {"title": "\u5806\u5b58\u50a8\u3001\u53ef\u89c1\u6027\u4e0e WAL", "paragraphs": ["\u6b64\u6e05\u5355\u4ece PostgreSQL 12 \u5f15\u5165\u7684 Table AM \u63a5\u53e3\u5f00\u59cb\u3002\u4e0d\u4f1a\u5c06\u66f4\u65e9\u7248\u672c\u7684 PostgreSQL \u5806\u5b58\u50a8\u91cd\u65b0\u6807\u4e3a Table AM \u5b9e\u73b0\u3002", "\u5806\u53ef\u89c1\u6027\u9075\u5faa PostgreSQL \u5feb\u7167\u3002WAL \u548c\u5d29\u6e83\u6062\u590d\u884c\u4e3a\u53d6\u51b3\u4e8e\u5173\u7cfb\u7684\u6301\u4e45\u6027\uff1b\u4e34\u65f6\u8868\u3001\u65e0\u65e5\u5fd7\u8868\u4e0e\u6c38\u4e45\u8868\u4e0d\u540c\u3002\u7d22\u5f15\u8bbf\u95ee\u65b9\u6cd5\u4e0e\u8868\u5b58\u50a8\u63a5\u53e3\u5206\u5f00\u3002"]}, {"code": "{\n\t.type = T_TableAmRoutine,\n\n\t.slot_callbacks = heapam_slot_callbacks,\n\n\t.scan_begin = heap_beginscan,\n\t.scan_end = heap_endscan,\n\t.scan_rescan = heap_rescan,\n\t.scan_getnextslot = heap_getnextslot,\n\n\t.scan_set_tidrange = heap_set_tidrange,\n\t.scan_getnextslot_tidrange = heap_getnextslot_tidrange,\n\n\t.parallelscan_estimate = table_block_parallelscan_estimate,\n\t.parallelscan_initialize = table_block_parallelscan_initialize,\n\t.parallelscan_reinitialize = table_block_parallelscan_reinitialize,\n\n\t.index_scan_begin = heapam_index_scan_begin,\n\t.index_scan_reset = heapam_index_scan_reset,\n\t.index_scan_end = heapam_index_scan_end,\n\n\t.tuple_insert = heapam_tuple_insert,\n\t.tuple_insert_speculative = heapam_tuple_insert_speculative,\n\t.tuple_complete_speculative = heapam_tuple_complete_speculative,\n\t.multi_insert = heap_multi_insert,\n\t.tuple_delete = heapam_tuple_delete,\n\t.tuple_update = heapam_tuple_update,\n\t.tuple_lock = heapam_tuple_lock,\n\n\t.fetch_tid = heapam_fetch_tid,\n\t.tuple_fetch_row_version = heapam_fetch_row_version,\n\t.tuple_get_latest_tid = heap_get_latest_tid,\n\t.tuple_tid_valid = heapam_tuple_tid_valid,\n\t.tuple_satisfies_snapshot = heapam_tuple_satisfies_snapshot,\n\t.index_delete_tuples = heap_index_delete_tuples,\n\n\t.relation_set_new_filelocator = heapam_relation_set_new_filelocator,\n\t.relation_nontransactional_truncate = heapam_relation_nontransactional_truncate,\n\t.relation_copy_data = heapam_relation_copy_data,\n\t.relation_copy_for_cluster = heapam_relation_copy_for_cluster,\n\t.relation_vacuum = heap_vacuum_rel,\n\t.scan_analyze_next_block = heapam_scan_analyze_next_block,\n\t.scan_analyze_next_tuple = heapam_scan_analyze_next_tuple,\n\t.index_build_range_scan = heapam_index_build_range_scan,\n\t.index_validate_scan = heapam_index_validate_scan,\n\n\t.relation_size = table_block_relation_size,\n\t.relation_needs_toast_table = heapam_relation_needs_toast_table,\n\t.relation_toast_am = heapam_relation_toast_am,\n\t.relation_fetch_toast_slice = heap_fetch_toast_slice,\n\n\t.relation_estimate_size = heapam_estimate_rel_size,\n\n\t.scan_bitmap_next_tuple = heapam_scan_bitmap_next_tuple,\n\t.scan_sample_next_block = heapam_scan_sample_next_block,\n\t.scan_sample_next_tuple = heapam_scan_sample_next_tuple\n}", "title": "\u6838\u5fc3\u6e90\u7801\u4e2d\u6ce8\u518c\u7684\u5b9e\u73b0"}], "callbacks": {"scan_end": "heap_endscan", "fetch_tid": "heapam_fetch_tid", "scan_begin": "heap_beginscan", "tuple_lock": "heapam_tuple_lock", "scan_rescan": "heap_rescan", "multi_insert": "heap_multi_insert", "tuple_delete": "heapam_tuple_delete", "tuple_insert": "heapam_tuple_insert", "tuple_update": "heapam_tuple_update", "relation_size": "table_block_relation_size", "index_scan_end": "heapam_index_scan_end", "slot_callbacks": "heapam_slot_callbacks", "relation_vacuum": "heap_vacuum_rel", "tuple_tid_valid": "heapam_tuple_tid_valid", "index_scan_begin": "heapam_index_scan_begin", "index_scan_reset": "heapam_index_scan_reset", "scan_getnextslot": "heap_getnextslot", "relation_toast_am": "heapam_relation_toast_am", "scan_set_tidrange": "heap_set_tidrange", "relation_copy_data": "heapam_relation_copy_data", "index_delete_tuples": "heap_index_delete_tuples", "index_validate_scan": "heapam_index_validate_scan", "tuple_get_latest_tid": "heap_get_latest_tid", "parallelscan_estimate": "table_block_parallelscan_estimate", "index_build_range_scan": "heapam_index_build_range_scan", "relation_estimate_size": "heapam_estimate_rel_size", "scan_bitmap_next_tuple": "heapam_scan_bitmap_next_tuple", "scan_sample_next_block": "heapam_scan_sample_next_block", "scan_sample_next_tuple": "heapam_scan_sample_next_tuple", "parallelscan_initialize": "table_block_parallelscan_initialize", "scan_analyze_next_block": "heapam_scan_analyze_next_block", "scan_analyze_next_tuple": "heapam_scan_analyze_next_tuple", "tuple_fetch_row_version": "heapam_fetch_row_version", "tuple_insert_speculative": "heapam_tuple_insert_speculative", "tuple_satisfies_snapshot": "heapam_tuple_satisfies_snapshot", "parallelscan_reinitialize": "table_block_parallelscan_reinitialize", "relation_copy_for_cluster": "heapam_relation_copy_for_cluster", "scan_getnextslot_tidrange": "heap_getnextslot_tidrange", "relation_fetch_toast_slice": "heap_fetch_toast_slice", "relation_needs_toast_table": "heapam_relation_needs_toast_table", "tuple_complete_speculative": "heapam_tuple_complete_speculative", "relation_set_new_filelocator": "heapam_relation_set_new_filelocator", "relation_nontransactional_truncate": "heapam_relation_nontransactional_truncate"}, "description": ["\u5185\u7f6e heap \u8868\u8bbf\u95ee\u65b9\u6cd5\u5c06\u5143\u7ec4\u5b58\u50a8\u3001\u53ef\u89c1\u6027\u3001\u626b\u63cf\u3001\u7d22\u5f15\u83b7\u53d6\u548c\u7ef4\u62a4\u64cd\u4f5c\u96c6\u6210\u5230 PostgreSQL \u4e2d\u3002"], "manual_html": "<div class=\"chapter\" id=\"TABLEAM\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h2 class=\"title\" lang=\"zh\">\u7b2c 62 \u7ae0. Table Access Method Interface Definition</h2>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u672c\u7ae0\u8bf4\u660e <span class=\"productname\">PostgreSQL</span> \u6838\u5fc3\u7cfb\u7edf\u4e0e\u7ba1\u7406\u8868\u5b58\u50a8\u7684<em class=\"firstterm\">\u8868\u8bbf\u95ee\u65b9\u6cd5</em>\u4e4b\u95f4\u7684\u63a5\u53e3\u3002\u9664\u8fd9\u91cc\u89c4\u5b9a\u7684\u5185\u5bb9\u4e4b\u5916\uff0c\u6838\u5fc3\u7cfb\u7edf\u5bf9\u8fd9\u4e9b\u8bbf\u95ee\u65b9\u6cd5\u77e5\u4e4b\u751a\u5c11\uff0c\u56e0\u6b64\u53ef\u4ee5\u901a\u8fc7\u7f16\u5199\u9644\u52a0\u4ee3\u7801\u6765\u5f00\u53d1\u5168\u65b0\u7684\u8bbf\u95ee\u65b9\u6cd5\u7c7b\u578b\u3002</p>\n<p lang=\"zh\">\u6bcf\u4e2a\u8868\u8bbf\u95ee\u65b9\u6cd5\u90fd\u7531\u7cfb\u7edf\u76ee\u5f55 <a class=\"link\" href=\"/docs/devel/catalog-pg-am.html\" title=\"52.3.\u00a0pg_am\"><code class=\"structname\">pg_am</code></a> \u4e2d\u7684\u4e00\u884c\u63cf\u8ff0\u3002<code class=\"structname\">pg_am</code> \u6761\u76ee\u6307\u5b9a\u4e86\u8be5\u8868\u8bbf\u95ee\u65b9\u6cd5\u7684\u540d\u79f0\u4ee5\u53ca\u4e00\u4e2a<em class=\"firstterm\">\u5904\u7406\u5668\u51fd\u6570</em>\u3002\u8fd9\u4e9b\u6761\u76ee\u53ef\u4ee5\u901a\u8fc7<a class=\"xref\" href=\"/docs/devel/sql-create-access-method.html\" title=\"CREATE ACCESS METHOD\"><span class=\"refentrytitle\">CREATE ACCESS METHOD</span></a>\u548c<a class=\"xref\" href=\"/docs/devel/sql-drop-access-method.html\" title=\"DROP ACCESS METHOD\"><span class=\"refentrytitle\">DROP ACCESS METHOD</span></a> SQL \u547d\u4ee4\u521b\u5efa\u548c\u5220\u9664\u3002</p>\n<p lang=\"zh\">\u8868\u8bbf\u95ee\u65b9\u6cd5\u7684\u5904\u7406\u5668\u51fd\u6570\u5fc5\u987b\u58f0\u660e\u4e3a\u63a5\u53d7\u4e00\u4e2a <code class=\"type\">internal</code> \u7c7b\u578b\u7684\u53c2\u6570\uff0c\u5e76\u8fd4\u56de\u4f2a\u7c7b\u578b <code class=\"type\">table_am_handler</code>\u3002\u8fd9\u4e2a\u53c2\u6570\u53ea\u662f\u4e00\u4e2a\u5360\u4f4d\u503c\uff0c\u7528\u6765\u9632\u6b62\u5904\u7406\u5668\u51fd\u6570\u88ab SQL \u547d\u4ee4\u76f4\u63a5\u8c03\u7528\u3002</p>\n<p lang=\"zh\">\u4e0b\u9762\u5c55\u793a\u6269\u5c55 SQL \u811a\u672c\u6587\u4ef6\u5982\u4f55\u521b\u5efa\u8868\u8bbf\u95ee\u65b9\u6cd5\u5904\u7406\u5668\uff1a</p>\n<pre class=\"programlisting\">CREATE OR REPLACE FUNCTION my_tableam_handler(internal)\n  RETURNS table_am_handler AS 'my_extension', 'my_tableam_handler'\n  LANGUAGE C STRICT;\n\nCREATE ACCESS METHOD myam TYPE TABLE HANDLER my_tableam_handler;\n</pre>\n<p lang=\"zh\">\u8be5\u51fd\u6570\u7684\u7ed3\u679c\u5fc5\u987b\u662f\u4e00\u4e2a\u6307\u5411 <code class=\"structname\">TableAmRoutine</code> \u7ed3\u6784\u4f53\u7684\u6307\u9488\uff0c\u5176\u4e2d\u5305\u542b\u6838\u5fc3\u4ee3\u7801\u4f7f\u7528\u8be5\u8868\u8bbf\u95ee\u65b9\u6cd5\u6240\u9700\u7684\u5168\u90e8\u4fe1\u606f\u3002\u8fd4\u56de\u503c\u9700\u8981\u5177\u6709\u670d\u52a1\u5668\u751f\u547d\u5468\u671f\uff0c\u8fd9\u901a\u5e38\u901a\u8fc7\u5c06\u5176\u5b9a\u4e49\u4e3a\u5168\u5c40\u4f5c\u7528\u57df\u4e2d\u7684 <code class=\"literal\">static const</code> \u53d8\u91cf\u6765\u5b9e\u73b0\u3002</p>\n<p lang=\"zh\">\u4e0b\u9762\u662f\u4e00\u4e2a\u5305\u542b\u8868\u8bbf\u95ee\u65b9\u6cd5\u5904\u7406\u5668\u7684\u6e90\u6587\u4ef6\u793a\u4f8b\uff1a</p>\n<pre class=\"programlisting\">#include \"postgres.h\"\n\n#include \"access/tableam.h\"\n#include \"fmgr.h\"\n\nPG_MODULE_MAGIC;\n\nstatic const TableAmRoutine my_tableam_methods = {\n    .type = T_TableAmRoutine,\n\n    /* Methods of TableAmRoutine omitted from example, add them here. */\n};\n\nPG_FUNCTION_INFO_V1(my_tableam_handler);\n\nDatum\nmy_tableam_handler(PG_FUNCTION_ARGS)\n{\n    PG_RETURN_POINTER(&amp;my_tableam_methods);\n}\n\n</pre>\n<p lang=\"zh\"><code class=\"structname\">TableAmRoutine</code> \u7ed3\u6784\u4f53\u4e5f\u79f0\u4e3a\u8be5\u8bbf\u95ee\u65b9\u6cd5\u7684<em class=\"firstterm\">API \u7ed3\u6784\u4f53</em>\uff0c\u5b83\u901a\u8fc7\u56de\u8c03\u6765\u5b9a\u4e49\u8bbf\u95ee\u65b9\u6cd5\u7684\u884c\u4e3a\u3002\u8fd9\u4e9b\u56de\u8c03\u662f\u666e\u901a C \u51fd\u6570\u7684\u6307\u9488\uff0c\u5728 SQL \u5c42\u65e2\u4e0d\u53ef\u89c1\u4e5f\u4e0d\u53ef\u8c03\u7528\u3002\u6240\u6709\u56de\u8c03\u53ca\u5176\u884c\u4e3a\u90fd\u5b9a\u4e49\u5728 <code class=\"structname\">TableAmRoutine</code> \u7ed3\u6784\u4f53\u4e2d\uff08\u7ed3\u6784\u4f53\u5185\u7684\u6ce8\u91ca\u8bf4\u660e\u4e86\u5bf9\u56de\u8c03\u7684\u8981\u6c42\uff09\u3002\u5927\u591a\u6570\u56de\u8c03\u90fd\u6709\u5305\u88c5\u51fd\u6570\uff0c\u5176\u6587\u6863\u662f\u4ece\u8868\u8bbf\u95ee\u65b9\u6cd5\u4f7f\u7528\u8005\u800c\u975e\u5b9e\u73b0\u8005\u7684\u89d2\u5ea6\u7f16\u5199\u7684\u3002\u8be6\u60c5\u8bf7\u53c2\u9605 <a class=\"ulink\" href=\"https://git.postgresql.org/gitweb/?p=postgresql.git;a=blob;f=src/include/access/tableam.h;hb=HEAD\" target=\"_top\"><code class=\"filename\">src/include/access/tableam.h</code></a> \u6587\u4ef6\u3002</p>\n<p lang=\"zh\">\u5b9e\u73b0\u8bbf\u95ee\u65b9\u6cd5\u65f6\uff0c\u901a\u5e38\u9700\u8981\u5b9e\u73b0\u4e13\u7528\u7684\u5143\u7ec4\u8868\u69fd\u4f4d\u7c7b\u578b\uff08\u53c2\u89c1 src/include/executor/tuptable.h\uff09\uff0c\u4f7f\u8bbf\u95ee\u65b9\u6cd5\u4e4b\u5916\u7684\u4ee3\u7801\u53ef\u4ee5\u6301\u6709\u8be5\u65b9\u6cd5\u7684\u5143\u7ec4\u5f15\u7528\uff0c\u5e76\u8bbf\u95ee\u5143\u7ec4\u5404\u5217\u3002</p>\n<p lang=\"zh\">\u76ee\u524d\uff0cAM \u5b9e\u9645\u5b58\u50a8\u6570\u636e\u7684\u65b9\u5f0f\u6240\u53d7\u9650\u5236\u76f8\u5f53\u5c11\u3002\u4f8b\u5982\uff0c\u53ef\u4ee5\u4f7f\u7528 postgres \u7684\u5171\u4eab\u7f13\u51b2\u533a\u7f13\u5b58\uff0c\u4f46\u8fd9\u5e76\u975e\u5fc5\u9700\u3002\u5982\u679c\u4f7f\u7528\u5b83\uff0c\u90a3\u4e48\u91c7\u7528 <span class=\"productname\">PostgreSQL</span> \u5728<a class=\"xref\" href=\"/docs/devel/storage-page-layout.html\" title=\"66.6.\u00a0\u6570\u636e\u5e93\u9875\u9762\u5e03\u5c40\">\u7b2c\u00a066.6\u00a0\u8282</a>\u4e2d\u63cf\u8ff0\u7684\u6807\u51c6\u9875\u9762\u5e03\u5c40\u901a\u5e38\u662f\u6709\u610f\u4e49\u7684\u3002</p>\n<p lang=\"zh\">\u8868\u8bbf\u95ee\u65b9\u6cd5 API \u76ee\u524d\u7684\u4e00\u9879\u8f83\u5927\u9650\u5236\u662f\uff1a\u82e5\u8bbf\u95ee\u65b9\u6cd5\u5e0c\u671b\u652f\u6301\u4fee\u6539\u64cd\u4f5c\u548c/\u6216\u7d22\u5f15\uff0c\u6bcf\u4e2a\u5143\u7ec4\u5fc5\u987b\u6709\u4e00\u4e2a\u7531\u5757\u53f7\u548c\u9879\u53f7\u7ec4\u6210\u7684\u5143\u7ec4\u6807\u8bc6\u7b26 TID\uff08\u53e6\u89c1\u7b2c 66.6 \u8282\uff09\u3002TID \u5404\u90e8\u5206\u4e0d\u5fc5\u5177\u6709\u4e0e heap \u4e2d\u5b8c\u5168\u76f8\u540c\u7684\u542b\u4e49\uff1b\u4f46\u5982\u679c\u8981\u652f\u6301\u53ef\u9009\u7684\u4f4d\u56fe\u626b\u63cf\uff0c\u5757\u53f7\u5c31\u9700\u8981\u63d0\u4f9b\u5c40\u90e8\u6027\u3002</p>\n<p lang=\"zh\">\u4e3a\u4fdd\u8bc1\u5d29\u6e83\u5b89\u5168\uff0cAM \u53ef\u4ee5\u4f7f\u7528 postgres \u7684<a class=\"link\" href=\"/docs/devel/wal.html\" title=\"\u7b2c\u00a028\u00a0\u7ae0\u00a0\u53ef\u9760\u6027\u4e0e\u9884\u5199\u5f0f\u65e5\u5fd7\"><acronym class=\"acronym\">WAL</acronym></a>\uff0c\u4e5f\u53ef\u4ee5\u4f7f\u7528\u81ea\u5b9a\u4e49\u5b9e\u73b0\u3002\u5982\u679c\u9009\u62e9\u4e86 <acronym class=\"acronym\">WAL</acronym>\uff0c\u53ef\u4ee5\u4f7f\u7528<a class=\"link\" href=\"/docs/devel/generic-wal.html\" title=\"64.1.\u00a0\u901a\u7528 WAL \u8bb0\u5f55\">\u901a\u7528 WAL \u8bb0\u5f55</a>\uff0c\u4e5f\u53ef\u4ee5\u5b9e\u73b0\u4e00\u4e2a<a class=\"link\" href=\"/docs/devel/custom-rmgr.html\" title=\"64.2.\u00a0\u81ea\u5b9a\u4e49 WAL \u8d44\u6e90\u7ba1\u7406\u5668\">\u81ea\u5b9a\u4e49 WAL \u8d44\u6e90\u7ba1\u7406\u5668</a>\u3002</p>\n<p lang=\"zh\">\u8981\u4ee5\u5141\u8bb8\u5728\u5355\u4e2a\u4e8b\u52a1\u4e2d\u8bbf\u95ee\u4e0d\u540c\u8868\u8bbf\u95ee\u65b9\u6cd5\u7684\u65b9\u5f0f\u5b9e\u73b0\u4e8b\u52a1\u652f\u6301\uff0c\u5f88\u53ef\u80fd\u9700\u8981\u4e0e <code class=\"filename\">src/backend/access/transam/xlog.c</code> \u4e2d\u7684\u673a\u5236\u7d27\u5bc6\u96c6\u6210\u3002</p>\n<p lang=\"zh\">\u5f00\u53d1\u65b0\u7684\u8868\u8bbf\u95ee\u65b9\u6cd5\u65f6\uff0c\u53ef\u4ee5\u53c2\u7167 src/backend/access/heap/heapam_handler.c \u4e2d\u73b0\u6709\u7684\u5806\u5b9e\u73b0\uff0c\u4e86\u89e3\u5b9e\u73b0\u7ec6\u8282\u3002</p>\n</div>", "manual_path": "/docs/devel/tableam.html", "localization": {"status": "complete", "sources": [{"url": "/docs/devel/tableam.html", "method": "same-major semantic node", "sha256": "9a8d65b3ad58687f074f2f6307971ef7aa9443bd56a99be289ea41806362435c", "language": "zh", "matched_nodes": ["#TABLEAM/p[11]", "#TABLEAM/p[13]", "#TABLEAM/p[15]", "#TABLEAM/p[16]", "#TABLEAM/p[3]", "#TABLEAM/p[4]", "#TABLEAM/p[5]", "#TABLEAM/p[6]", "#TABLEAM/p[8]", "#TABLEAM/p[9]"]}], "language": "zh", "original_text": {"/summary": "The built-in heap table access method integrates tuple storage, visibility, scans, index fetches and maintenance with PostgreSQL.", "/category": "Core table AM", "/versions/20/description/0": "The built-in heap table access method integrates tuple storage, visibility, scans, index fetches and maintenance with PostgreSQL.", "/versions/20/facts/0/label": "Interface family", "/versions/20/facts/0/value": "Table access method", "/versions/20/facts/1/label": "Handler or routine", "/versions/20/facts/2/label": "Recorded callbacks", "/versions/20/tables/0/title": "Registered interface handlers", "/versions/20/related/0/label": "System catalog pg_am", "/versions/20/related/2/label": "Index AM", "/versions/20/sections/0/title": "Interface and capability boundaries", "/versions/20/sections/1/title": "Heap storage, visibility and WAL", "/versions/20/sections/2/title": "Registered implementation in core source", "/versions/20/tables/0/rows/0/state": "Handler registered; conditions apply", "/versions/20/tables/0/rows/1/state": "Handler registered; conditions apply", "/versions/20/tables/0/rows/2/state": "Handler registered; conditions apply", "/versions/20/tables/0/rows/3/state": "Handler registered; conditions apply", "/versions/20/tables/0/rows/4/state": "Handler registered; conditions apply", "/versions/20/tables/0/rows/5/state": "Handler registered; conditions apply", "/versions/20/tables/0/rows/6/state": "Handler registered; conditions apply", "/versions/20/tables/0/rows/7/state": "Handler registered; conditions apply", "/versions/20/tables/0/rows/8/state": "Handler registered; conditions apply", "/versions/20/tables/0/rows/9/state": "Handler registered; conditions apply", "/versions/20/tables/0/rows/10/state": "Handler registered; conditions apply", "/versions/20/sections/0/paragraphs/0": "The matrix records callbacks actually registered in this source build. Registration identifies an implemented interface hook; options, query shape, privileges and provider rules determine whether an operation is allowed.", "/versions/20/sections/0/paragraphs/1": "The complete same-version manual below retains configuration, constraints and examples. No runtime capability test is claimed.", "/versions/20/sections/1/paragraphs/0": "This inventory starts with the Table AM interface in PostgreSQL 12. Earlier PostgreSQL heap storage is not relabeled as a Table AM implementation.", "/versions/20/sections/1/paragraphs/1": "Heap visibility follows PostgreSQL snapshots. WAL and crash-recovery behavior depend on relation persistence; temporary and unlogged tables differ from permanent tables. Index access methods remain separate from the table storage interface.", "/versions/20/tables/0/rows/0/feature": "Tuple slot", "/versions/20/tables/0/rows/1/feature": "Begin scan", "/versions/20/tables/0/rows/2/feature": "Parallel scan initialization", "/versions/20/tables/0/rows/3/feature": "Begin index lookup", "/versions/20/tables/0/rows/4/feature": "Fetch identified tuple", "/versions/20/tables/0/rows/5/feature": "Insert tuple", "/versions/20/tables/0/rows/6/feature": "Update tuple", "/versions/20/tables/0/rows/7/feature": "Delete tuple", "/versions/20/tables/0/rows/8/feature": "Vacuum relation", "/versions/20/tables/0/rows/9/feature": "Analyze block", "/versions/20/tables/0/columns/0/label": "Interface operation", "/versions/20/tables/0/columns/1/label": "Source observation", "/versions/20/tables/0/columns/2/label": "Callback", "/versions/20/tables/0/columns/3/label": "Implementation", "/versions/20/tables/0/rows/10/feature": "TOAST decision", "/versions/20/collection_tables/0/title": "Table AM candidates", "/versions/20/collection_tables/1/title": "Primary-source capability observations", "/versions/20/collection_tables/0/caption": "Current catalogue observation 2026-09-29 from pgext.universe. Extension versions, source metadata dates and declared PostgreSQL compatibility are independent of the selected core version. Catalogue classification does not establish capabilities or maintenance support.", "/versions/20/collection_tables/1/caption": "Each statement applies to its named extension version and immutable source revision. Unlisted capabilities remain unknown. These are documentation observations, not runtime tests or current maintenance guarantees.", "/versions/20/collection_tables/0/rows/0/scope": "Catalogue candidate; interface unverified", "/versions/20/collection_tables/0/rows/1/scope": "Catalogue candidate; interface unverified", "/versions/20/collection_tables/0/rows/2/scope": "Catalogue candidate; interface unverified", "/versions/20/collection_tables/0/rows/3/scope": "Catalogue candidate; interface unverified", "/versions/20/collection_tables/0/rows/4/scope": "Catalogue candidate; interface unverified", "/versions/20/collection_tables/0/rows/5/scope": "Catalogue candidate; interface unverified", "/versions/20/collection_tables/0/rows/6/scope": "Catalogue candidate; interface unverified", "/versions/20/collection_tables/0/rows/7/scope": "Catalogue candidate; interface unverified", "/versions/20/collection_tables/0/rows/8/scope": "Catalogue candidate; interface unverified", "/versions/20/collection_tables/0/rows/9/scope": "Catalogue candidate; interface unverified", "/versions/20/collection_tables/1/rows/0/state": "Verified in documentation", "/versions/20/collection_tables/1/rows/1/state": "Conditional", "/versions/20/collection_tables/1/rows/2/state": "Conditional", "/versions/20/collection_tables/1/rows/3/state": "Verified limitation", "/versions/20/collection_tables/1/rows/4/state": "Unknown", "/versions/20/collection_tables/0/rows/10/scope": "Catalogue candidate; interface unverified", "/versions/20/collection_tables/0/rows/11/scope": "Catalogue candidate; interface unverified", "/versions/20/collection_tables/0/rows/12/scope": "Catalogue candidate; interface unverified", "/versions/20/collection_tables/0/rows/13/scope": "Catalogue candidate; interface unverified", "/versions/20/collection_tables/0/rows/14/scope": "Catalogue candidate; interface unverified", "/versions/20/collection_tables/0/rows/15/scope": "Catalogue candidate; interface unverified", "/versions/20/collection_tables/0/rows/16/scope": "Catalogue candidate; interface unverified", "/versions/20/collection_tables/0/rows/17/scope": "Catalogue candidate; interface unverified", "/versions/20/collection_tables/0/rows/18/scope": "Catalogue candidate; interface unverified", "/versions/20/collection_tables/0/rows/19/scope": "Catalogue candidate; interface unverified", "/versions/20/collection_tables/0/rows/20/scope": "Catalogue candidate; interface unverified", "/versions/20/collection_tables/0/rows/21/scope": "Primary documentation reviewed separately below", "/versions/20/collection_tables/0/rows/22/scope": "Catalogue candidate; interface unverified", "/versions/20/collection_tables/1/rows/0/detail": "Native columnar Table AM. This reviewed version is an alpha release.", "/versions/20/collection_tables/1/rows/1/detail": "The planner can create parallel columnar scans; cost and worker settings determine plan selection.", "/versions/20/collection_tables/1/rows/2/detail": "Its own vacuum performs no parallel work. CLUSTER, VACUUM FULL and REPACK are rejected; extension compaction functions provide alternatives.", "/versions/20/collection_tables/1/rows/3/detail": "Sampling a columnar table raises an unsupported-operation error.", "/versions/20/collection_tables/1/rows/4/detail": "No distributed transaction guarantee was established by this review.", "/versions/20/collection_tables/0/columns/0/label": "Existing extension", "/versions/20/collection_tables/0/columns/1/label": "Catalogued version", "/versions/20/collection_tables/0/columns/2/label": "Declared PG majors", "/versions/20/collection_tables/0/columns/3/label": "Metadata checked", "/versions/20/collection_tables/0/columns/4/label": "Evidence scope", "/versions/20/collection_tables/0/columns/5/label": "Catalogued purpose", "/versions/20/collection_tables/0/rows/5/postgres": "Unknown", "/versions/20/collection_tables/0/rows/7/postgres": "Unknown", "/versions/20/collection_tables/1/columns/0/label": "Extension", "/versions/20/collection_tables/1/columns/1/label": "Reviewed version", "/versions/20/collection_tables/1/columns/2/label": "Capability", "/versions/20/collection_tables/1/columns/3/label": "Evidence state", "/versions/20/collection_tables/1/columns/4/label": "Conditions", "/versions/20/collection_tables/1/columns/5/label": "Evidence date and source", "/versions/20/collection_tables/0/rows/11/postgres": "Unknown", "/versions/20/collection_tables/0/rows/12/postgres": "Unknown", "/versions/20/collection_tables/0/rows/13/postgres": "Unknown", "/versions/20/collection_tables/0/rows/14/postgres": "Unknown", "/versions/20/collection_tables/0/rows/15/postgres": "Unknown", "/versions/20/collection_tables/0/rows/16/postgres": "Unknown", "/versions/20/collection_tables/0/rows/18/postgres": "Unknown", "/versions/20/collection_tables/0/rows/22/postgres": "Unknown", "/versions/20/collection_tables/1/rows/0/capability": "Table AM identity", "/versions/20/collection_tables/1/rows/1/capability": "Parallel scans", "/versions/20/collection_tables/1/rows/4/capability": "Distributed transaction guarantees", "/versions/20/collection_tables/0/rows/0/description": "Citus columnar storage engine", "/versions/20/collection_tables/0/rows/1/description": "Hydra Columnar extension", "/versions/20/collection_tables/0/rows/2/description": "Columnstore Table in Postgres", "/versions/20/collection_tables/0/rows/3/description": "colcompress and rowcompress Table Access Methods with vectorized execution", "/versions/20/collection_tables/0/rows/4/description": "Experimental append-only compressed table access method for PostgreSQL 12 and later.", "/versions/20/collection_tables/0/rows/5/description": "UNDO storage table access method with in-place updates", "/versions/20/collection_tables/0/rows/6/description": "Experimental table access method for transparent AES-256-CBC encryption of selected column types.", "/versions/20/collection_tables/0/rows/7/description": "PostgreSQL table access method that avoids fragmentation of variable-length append-only data.", "/versions/20/collection_tables/0/rows/8/description": "Experimental PostgreSQL table access method backed by Redis storage.", "/versions/20/collection_tables/0/rows/9/description": "Generates random test data through a PostgreSQL FDW, with an experimental table access method.", "/versions/20/collection_tables/0/rows/10/description": "Columnar PostgreSQL table access method powered by DuckDB and Parquet storage.", "/versions/20/collection_tables/0/rows/11/description": "CSV table access method for PostgreSQL that stores table tuples in CSV-formatted relation files.", "/versions/20/collection_tables/0/rows/12/description": "Experimental in-memory PostgreSQL table access method implemented as a C extension.", "/versions/20/collection_tables/0/rows/13/description": "GFS copy-on-read storage: a Table Access Method whose missing rows are fetched from the source on read and written through locally", "/versions/20/collection_tables/0/rows/14/description": "Delta table access method skeleton", "/versions/20/collection_tables/0/rows/15/description": "Simple table access method that just prints out what functions in the access methods and related functions that are called.", "/versions/20/collection_tables/0/rows/16/description": "TreeDB table access method (Phase 0 prototype)", "/versions/20/collection_tables/0/rows/17/description": "Transparent data encryption for upstream PostgreSQL using the tde_heap access method, including tables, indexes, TOAST, WAL, and temporary files.", "/versions/20/collection_tables/0/rows/18/description": "EDB table access method that preserves clustering locality during inserts.", "/versions/20/collection_tables/0/rows/19/description": "Append-only compressed table access method for time-series workloads.", "/versions/20/collection_tables/0/rows/20/description": "Experimental table access method for compact, cache-friendly row storage.", "/versions/20/collection_tables/0/rows/21/description": "Native column-oriented table access method with compression, vectorized scans, and Parquet workflows.", "/versions/20/collection_tables/0/rows/22/description": "EDB table access method for frequently read, rarely changed reference data."}, "fallback_fields": [], "source_language": "en", "extension_sources": [{"method": "existing extension catalogue", "sha256": "20335bd9693c9f63c07a3e73dbc12db922d36159c0443ecd8918f93e48e9e285", "extension": "citus_columnar"}, {"method": "existing extension catalogue", "sha256": "6c84267c58539dda1d2f99fe2df63fa02fc78f246f382384dc85644bd862816a", "extension": "columnar"}, {"method": "existing extension catalogue", "sha256": "581469ddc7c1660c4c035b66e3728aa821908d19c47a78bb7a474bf1760808f4", "extension": "pg_mooncake"}, {"method": "existing extension catalogue", "sha256": "979a31fb5bf0c2572a5dd40881dc9c5fe402ab445ecc455b44d12208ce28b88f", "extension": "storage_engine"}, {"method": "existing extension catalogue", "sha256": "8143ef25f860518865fb520abfcd92204773911c22d8eea76db8e248ebab53be", "extension": "pg_cryogen"}, {"method": "existing extension catalogue", "sha256": "47025c18c040a44f307e1d084ecb8835596a68a0ca660bf300cd5cbe90296139", "extension": "undam"}, {"method": "existing extension catalogue", "sha256": "2619e6b72919c7671c2213b137de80859852cf0fb58ba2cb14d396feaab94864", "extension": "tcle"}, {"method": "existing extension catalogue", "sha256": "ba3b4738492858bc424c38c9aadd75281849ef5e14ec61f8c44c70271fc23eea", "extension": "append_only_heap"}, {"method": "existing extension catalogue", "sha256": "3118358ef7aff737530d418a1220be85ce1a438f1a34c2ced63a452e4cb6277a", "extension": "redis_backed_storage"}, {"method": "existing extension catalogue", "sha256": "58e087a0fc13c45beb89a6637b8c63f1f8d2e39b896f4a9276f512d078b78c5f", "extension": "pgrand"}, {"method": "existing extension catalogue", "sha256": "e703e2075dbaf03e9f6790370cad43191e2edef6136b59e2fdf3ceee0ced13f7", "extension": "pg_elephantduck"}, {"method": "existing extension catalogue", "sha256": "79c940558dad3acad37515f894fb860803640c828f4f78a61a098c9d0bb5fc0a", "extension": "csv_tam"}, {"method": "existing extension catalogue", "sha256": "fff0b076b794d2c6555bc05cc415df67e2afd770e845f9337224aa6a6a7e058d", "extension": "pgtam"}, {"method": "existing extension catalogue", "sha256": "3c043ec47221c89c6ce9a0e0cdfc0e2c183392e37c1f10055240002e0e46c3e5", "extension": "gfs"}, {"method": "existing extension catalogue", "sha256": "4ea167029ea771f5c5b91286f6007888df24ec9a7276fa3d7632d14de505011e", "extension": "pg_delta_am"}, {"method": "existing extension catalogue", "sha256": "61162bb2c19ead381967af3c48ffcfa9cc4bc5c6330e67b0330c77703e84ccab", "extension": "traceam"}, {"method": "existing extension catalogue", "sha256": "413fddf6b3506cffe728b03e0575107b989c9b3c91bdf4831185921aa106a279", "extension": "treedb_pgext"}, {"method": "existing extension catalogue", "sha256": "2e123f76446f7fafd09f4c8a6b3e3dad53a70408daefdcbba00c91bb509ac08a", "extension": "open_pg_tde"}, {"method": "existing extension catalogue", "sha256": "9e9f691b45951b98a306ac162ed9b68ca68832b3470189d681a79f004d2808a4", "extension": "autocluster"}, {"method": "existing extension catalogue", "sha256": "928c51203a4254e39c27b755e2936417d1cb5a717360f88769d611a9e8f37efd", "extension": "bluefin"}, {"method": "existing extension catalogue", "sha256": "c6eb1dcdef8335570b5868de9c873d350322f7a9fc0c1f857cc4b69644a1a376", "extension": "optimized_row_format"}, {"method": "existing extension catalogue", "sha256": "1b574424a40c8a9bc7cd3b63143a83bb752f480a6ec8fdccc5efe9f65d4f384f", "extension": "pgcolumnar"}, {"method": "existing extension catalogue", "sha256": "55db1a48b302678a400c712f709391a950caef5b4c0b982a3143d8eb891be8b1", "extension": "refdata"}], "original_snapshot_sha256": "449d9d6df40faa2a20b43e6496989046459689d0bb50c2eced13bba6082134c5"}, "evidence_kind": "source and documentation", "comparison_data": {"options": [], "callbacks": {"scan_end": "heap_endscan", "fetch_tid": "heapam_fetch_tid", "scan_begin": "heap_beginscan", "tuple_lock": "heapam_tuple_lock", "scan_rescan": "heap_rescan", "multi_insert": "heap_multi_insert", "tuple_delete": "heapam_tuple_delete", "tuple_insert": "heapam_tuple_insert", "tuple_update": "heapam_tuple_update", "relation_size": "table_block_relation_size", "index_scan_end": "heapam_index_scan_end", "slot_callbacks": "heapam_slot_callbacks", "relation_vacuum": "heap_vacuum_rel", "tuple_tid_valid": "heapam_tuple_tid_valid", "index_scan_begin": "heapam_index_scan_begin", "index_scan_reset": "heapam_index_scan_reset", "scan_getnextslot": "heap_getnextslot", "relation_toast_am": "heapam_relation_toast_am", "scan_set_tidrange": "heap_set_tidrange", "relation_copy_data": "heapam_relation_copy_data", "index_delete_tuples": "heap_index_delete_tuples", "index_validate_scan": "heapam_index_validate_scan", "tuple_get_latest_tid": "heap_get_latest_tid", "parallelscan_estimate": "table_block_parallelscan_estimate", "index_build_range_scan": "heapam_index_build_range_scan", "relation_estimate_size": "heapam_estimate_rel_size", "scan_bitmap_next_tuple": "heapam_scan_bitmap_next_tuple", "scan_sample_next_block": "heapam_scan_sample_next_block", "scan_sample_next_tuple": "heapam_scan_sample_next_tuple", "parallelscan_initialize": "table_block_parallelscan_initialize", "scan_analyze_next_block": "heapam_scan_analyze_next_block", "scan_analyze_next_tuple": "heapam_scan_analyze_next_tuple", "tuple_fetch_row_version": "heapam_fetch_row_version", "tuple_insert_speculative": "heapam_tuple_insert_speculative", "tuple_satisfies_snapshot": "heapam_tuple_satisfies_snapshot", "parallelscan_reinitialize": "table_block_parallelscan_reinitialize", "relation_copy_for_cluster": "heapam_relation_copy_for_cluster", "scan_getnextslot_tidrange": "heap_getnextslot_tidrange", "relation_fetch_toast_slice": "heap_fetch_toast_slice", "relation_needs_toast_table": "heapam_relation_needs_toast_table", "tuple_complete_speculative": "heapam_tuple_complete_speculative", "relation_set_new_filelocator": "heapam_relation_set_new_filelocator", "relation_nontransactional_truncate": "heapam_relation_nontransactional_truncate"}, "source_options": [], "protocol_versions": {}}, "comparison_hash": "6d11ecc470cf242732e93216296530e2737359721fd9832ecfc769e7062f62d7", "manual_language": "zh", "runtime_verified": false, "collection_tables": [{"key": "tableam-catalogue", "rows": [{"scope": "\u76ee\u5f55\u5019\u9009\u9879\uff1b\u63a5\u53e3\u5c1a\u672a\u6838\u9a8c", "checked": "2026-08-30", "version": "14.2.0", "postgres": "16, 17, 18", "extension": {"url": "/e/citus_columnar/", "text": "citus_columnar"}, "description": "Citus \u5217\u5f0f\u5b58\u50a8\u5f15\u64ce"}, {"scope": "\u76ee\u5f55\u5019\u9009\u9879\uff1b\u63a5\u53e3\u5c1a\u672a\u6838\u9a8c", "checked": "2026-08-30", "version": "1.1.2", "postgres": "14, 15, 16", "extension": {"url": "/e/columnar/", "text": "columnar"}, "description": "\u5f00\u6e90\u5217\u5f0f\u5b58\u50a8\u6269\u5c55"}, {"scope": "\u76ee\u5f55\u5019\u9009\u9879\uff1b\u63a5\u53e3\u5c1a\u672a\u6838\u9a8c", "checked": "2026-08-30", "version": "0.2.0", "postgres": "14, 15, 16, 17, 18", "extension": {"url": "/e/pg_mooncake/", "text": "pg_mooncake"}, "description": "PostgreSQL\u5217\u5f0f\u5b58\u50a8\u8868"}, {"scope": "\u76ee\u5f55\u5019\u9009\u9879\uff1b\u63a5\u53e3\u5c1a\u672a\u6838\u9a8c", "checked": "2026-08-30", "version": "2.4.0", "postgres": "15, 16, 17, 18", "extension": {"url": "/e/storage_engine/", "text": "storage_engine"}, "description": "\u5e26\u5411\u91cf\u5316\u6267\u884c\u7684 colcompress \u4e0e rowcompress \u8868\u8bbf\u95ee\u65b9\u6cd5"}, {"scope": "\u76ee\u5f55\u5019\u9009\u9879\uff1b\u63a5\u53e3\u5c1a\u672a\u6838\u9a8c", "checked": "2026-08-30", "version": "0.1", "postgres": "12, 13, 14, 15, 16, 17, 18", "extension": {"url": "/e/pg_cryogen/", "text": "pg_cryogen"}, "description": "\u9762\u5411 PostgreSQL 12 \u53ca\u66f4\u9ad8\u7248\u672c\u7684\u5b9e\u9a8c\u6027\u53ea\u8ffd\u52a0\u538b\u7f29\u8868\u8bbf\u95ee\u65b9\u6cd5\u3002"}, {"scope": "\u76ee\u5f55\u5019\u9009\u9879\uff1b\u63a5\u53e3\u5c1a\u672a\u6838\u9a8c", "checked": "2026-08-30", "version": "0.1", "postgres": "\u672a\u77e5", "extension": {"url": "/e/undam/", "text": "undam"}, "description": "\u57fa\u4e8e\u64a4\u9500\u94fe\u548c\u539f\u5730\u66f4\u65b0\u7684 PostgreSQL \u8868\u8bbf\u95ee\u65b9\u6cd5\u3002"}, {"scope": "\u76ee\u5f55\u5019\u9009\u9879\uff1b\u63a5\u53e3\u5c1a\u672a\u6838\u9a8c", "checked": "2026-08-30", "version": "1.0", "postgres": "12, 13", "extension": {"url": "/e/tcle/", "text": "tcle"}, "description": "\u901a\u8fc7\u8868\u8bbf\u95ee\u65b9\u6cd5\u900f\u660e\u52a0\u5bc6\u6307\u5b9a\u5217\u7c7b\u578b\u7684\u5b9e\u9a8c\u6027 AES-256-CBC \u6269\u5c55\u3002"}, {"scope": "\u76ee\u5f55\u5019\u9009\u9879\uff1b\u63a5\u53e3\u5c1a\u672a\u6838\u9a8c", "checked": "2026-08-30", "version": "1.0", "postgres": "\u672a\u77e5", "extension": {"url": "/e/append_only_heap/", "text": "append_only_heap"}, "description": "\u4e00\u79cd PostgreSQL \u8868\u8bbf\u95ee\u65b9\u6cd5\uff0c\u901a\u8fc7\u53ea\u8ffd\u52a0\u5199\u5165\u53ef\u53d8\u957f\u5ea6\u6570\u636e\u6765\u51cf\u5c11\u788e\u7247\u3002"}, {"scope": "\u76ee\u5f55\u5019\u9009\u9879\uff1b\u63a5\u53e3\u5c1a\u672a\u6838\u9a8c", "checked": "2026-08-30", "version": "0.0.0", "postgres": "11, 12, 13, 14, 15, 16", "extension": {"url": "/e/redis_backed_storage/", "text": "redis_backed_storage"}, "description": "\u4e00\u4e2a\u5b9e\u9a8c\u6027\u7684 PostgreSQL \u8868\u8bbf\u95ee\u65b9\u6cd5\u6269\u5c55\uff0c\u4f7f\u7528 Redis \u4f5c\u4e3a\u540e\u7aef\u5b58\u50a8\u3002"}, {"scope": "\u76ee\u5f55\u5019\u9009\u9879\uff1b\u63a5\u53e3\u5c1a\u672a\u6838\u9a8c", "checked": "2026-08-30", "version": "0.1.0", "postgres": "15, 16", "extension": {"url": "/e/pgrand/", "text": "pgrand"}, "description": "\u901a\u8fc7 PostgreSQL FDW \u751f\u6210\u968f\u673a\u6d4b\u8bd5\u6570\u636e\uff0c\u5e76\u5305\u542b\u5b9e\u9a8c\u6027\u7684\u8868\u8bbf\u95ee\u65b9\u6cd5\u3002"}, {"scope": "\u76ee\u5f55\u5019\u9009\u9879\uff1b\u63a5\u53e3\u5c1a\u672a\u6838\u9a8c", "checked": "2026-08-30", "version": "0.0.0", "postgres": "16, 17", "extension": {"url": "/e/pg_elephantduck/", "text": "pg_elephantduck"}, "description": "\u57fa\u4e8e DuckDB \u4e0e Parquet \u5b58\u50a8\u7684 PostgreSQL \u5217\u5f0f\u8868\u8bbf\u95ee\u65b9\u6cd5\u3002"}, {"scope": "\u76ee\u5f55\u5019\u9009\u9879\uff1b\u63a5\u53e3\u5c1a\u672a\u6838\u9a8c", "checked": "2026-08-30", "version": "0.0.1", "postgres": "\u672a\u77e5", "extension": {"url": "/e/csv_tam/", "text": "csv_tam"}, "description": "PostgreSQL \u7684 CSV \u8868\u8bbf\u95ee\u65b9\u6cd5\uff0c\u5c06\u8868\u5143\u7ec4\u4ee5 CSV \u683c\u5f0f\u5b58\u5165\u5173\u7cfb\u6587\u4ef6\u3002"}, {"scope": "\u76ee\u5f55\u5019\u9009\u9879\uff1b\u63a5\u53e3\u5c1a\u672a\u6838\u9a8c", "checked": "2026-08-30", "version": "0.0.1", "postgres": "\u672a\u77e5", "extension": {"url": "/e/pgtam/", "text": "pgtam"}, "description": "pgtam \u662f\u4e00\u4e2a\u4ee5 C \u6269\u5c55\u5b9e\u73b0\u7684\u5b9e\u9a8c\u6027 PostgreSQL \u5185\u5b58\u8868\u8bbf\u95ee\u65b9\u6cd5\u3002"}, {"scope": "\u76ee\u5f55\u5019\u9009\u9879\uff1b\u63a5\u53e3\u5c1a\u672a\u6838\u9a8c", "checked": "2026-08-30", "version": "0.0.1", "postgres": "\u672a\u77e5", "extension": {"url": "/e/gfs/", "text": "gfs"}, "description": "\u57fa\u4e8e\u6309\u9700\u8bfb\u53d6\u590d\u5236\u7684GFS\u5b58\u50a8\uff1a\u4e00\u79cd\u8868\u8bbf\u95ee\u65b9\u6cd5\uff0c\u7f3a\u5931\u884c\u5728\u8bfb\u53d6\u65f6\u4ece\u6e90\u83b7\u53d6\u5e76\u5728\u672c\u5730\u5199\u5165"}, {"scope": "\u76ee\u5f55\u5019\u9009\u9879\uff1b\u63a5\u53e3\u5c1a\u672a\u6838\u9a8c", "checked": "2026-08-30", "version": "0.1.0", "postgres": "\u672a\u77e5", "extension": {"url": "/e/pg_delta_am/", "text": "pg_delta_am"}, "description": "Delta \u8868\u8bbf\u95ee\u65b9\u6cd5\u9aa8\u67b6\u3002"}, {"scope": "\u76ee\u5f55\u5019\u9009\u9879\uff1b\u63a5\u53e3\u5c1a\u672a\u6838\u9a8c", "checked": "2026-08-30", "version": "0.1", "postgres": "\u672a\u77e5", "extension": {"url": "/e/traceam/", "text": "traceam"}, "description": "\u7b80\u5355\u8868\u8bbf\u95ee\u65b9\u6cd5\uff0c\u4ec5\u6253\u5370\u8c03\u7528\u7684\u8bbf\u95ee\u65b9\u6cd5\u53ca\u76f8\u5173\u51fd\u6570"}, {"scope": "\u76ee\u5f55\u5019\u9009\u9879\uff1b\u63a5\u53e3\u5c1a\u672a\u6838\u9a8c", "checked": "2026-08-30", "version": "1.0", "postgres": "\u672a\u77e5", "extension": {"url": "/e/treedb_pgext/", "text": "treedb_pgext"}, "description": "TreeDB\u8868\u8bbf\u95ee\u65b9\u6cd5\uff08\u7b2c\u4e00\u9636\u6bb5\u539f\u578b\uff09"}, {"scope": "\u76ee\u5f55\u5019\u9009\u9879\uff1b\u63a5\u53e3\u5c1a\u672a\u6838\u9a8c", "checked": "2026-08-30", "version": "2.4.0", "postgres": "16, 17, 18", "extension": {"url": "/e/open_pg_tde/", "text": "open_pg_tde"}, "description": "\u9762\u5411\u4e0a\u6e38 PostgreSQL \u7684\u900f\u660e\u6570\u636e\u52a0\u5bc6\u6269\u5c55\uff0c\u4f7f\u7528 tde_heap \u8bbf\u95ee\u65b9\u6cd5\u52a0\u5bc6\u8868\u3001\u7d22\u5f15\u3001TOAST\u3001WAL \u4e0e\u4e34\u65f6\u6587\u4ef6\u3002"}, {"scope": "\u76ee\u5f55\u5019\u9009\u9879\uff1b\u63a5\u53e3\u5c1a\u672a\u6838\u9a8c", "checked": "2026-08-31", "version": "1.7.0", "postgres": "\u672a\u77e5", "extension": {"url": "/e/autocluster/", "text": "autocluster"}, "description": "\u5728\u63d2\u5165\u65f6\u4fdd\u6301\u805a\u7c07\u5c40\u90e8\u6027\u7684 EDB \u8868\u8bbf\u95ee\u65b9\u6cd5\u3002"}, {"scope": "\u76ee\u5f55\u5019\u9009\u9879\uff1b\u63a5\u53e3\u5c1a\u672a\u6838\u9a8c", "checked": "2026-08-31", "version": "1.7.0", "postgres": "15, 16, 17, 18", "extension": {"url": "/e/bluefin/", "text": "bluefin"}, "description": "\u9762\u5411\u65f6\u5e8f\u5de5\u4f5c\u8d1f\u8f7d\u7684\u4ec5\u8ffd\u52a0\u538b\u7f29\u8868\u8bbf\u95ee\u65b9\u6cd5\u3002"}, {"scope": "\u76ee\u5f55\u5019\u9009\u9879\uff1b\u63a5\u53e3\u5c1a\u672a\u6838\u9a8c", "checked": "2026-08-31", "version": "1.0", "postgres": "17", "extension": {"url": "/e/optimized_row_format/", "text": "optimized_row_format"}, "description": "\u9762\u5411\u7d27\u51d1\u4e14\u7f13\u5b58\u53cb\u597d\u884c\u5b58\u50a8\u7684\u5b9e\u9a8c\u6027\u8868\u8bbf\u95ee\u65b9\u6cd5\u3002"}, {"scope": "\u4e0b\u65b9\u5355\u72ec\u6838\u9a8c\u4e00\u624b\u6587\u6863", "checked": "2026-09-19", "version": "1.0-alpha4", "postgres": "15, 16, 17, 18, 19", "extension": {"url": "/e/pgcolumnar/", "text": "pgcolumnar"}, "description": "\u539f\u751f\u5217\u5f0f\u8868\u8bbf\u95ee\u65b9\u6cd5\uff0c\u652f\u6301\u538b\u7f29\u3001\u5411\u91cf\u5316\u626b\u63cf\u4e0e Parquet \u5de5\u4f5c\u6d41\u3002"}, {"scope": "\u76ee\u5f55\u5019\u9009\u9879\uff1b\u63a5\u53e3\u5c1a\u672a\u6838\u9a8c", "checked": "2026-08-31", "version": "1.7.0", "postgres": "\u672a\u77e5", "extension": {"url": "/e/refdata/", "text": "refdata"}, "description": "\u9762\u5411\u9ad8\u9891\u8bfb\u53d6\u3001\u4f4e\u9891\u53d8\u66f4\u53c2\u8003\u6570\u636e\u7684 EDB \u8868\u8bbf\u95ee\u65b9\u6cd5\u3002"}], "title": "\u8868\u8bbf\u95ee\u65b9\u6cd5\u5019\u9009", "caption": "\u6765\u81ea pgext.universe \u7684\u76ee\u5f55\u89c2\u5bdf\uff0c\u65e5\u671f\u4e3a 2026-09-29\u3002\u6269\u5c55\u7248\u672c\u3001\u6765\u6e90\u5143\u6570\u636e\u65e5\u671f\u548c\u58f0\u660e\u7684 PostgreSQL \u517c\u5bb9\u8303\u56f4\u5747\u72ec\u7acb\u4e8e\u6240\u9009\u6838\u5fc3\u7248\u672c\u3002\u76ee\u5f55\u5206\u7c7b\u4e0d\u80fd\u8bc1\u660e\u5177\u4f53\u80fd\u529b\u6216\u7ef4\u62a4\u652f\u6301\u3002", "columns": [{"key": "extension", "label": "\u73b0\u6709\u6269\u5c55"}, {"key": "version", "label": "\u76ee\u5f55\u8bb0\u8f7d\u7684\u7248\u672c"}, {"key": "postgres", "label": "\u58f0\u660e\u517c\u5bb9\u7684 PG \u5927\u7248\u672c"}, {"key": "checked", "label": "\u5143\u6570\u636e\u6838\u9a8c\u65f6\u95f4"}, {"key": "scope", "label": "\u8bc1\u636e\u8303\u56f4"}, {"key": "description", "label": "\u76ee\u5f55\u8bb0\u8f7d\u7684\u7528\u9014"}]}, {"key": "tableam-reviewed-capabilities", "rows": [{"state": "\u6587\u6863\u5df2\u8bc1\u5b9e", "detail": "\u539f\u751f\u5217\u5f0f Table AM\u3002\u672c\u6b21\u6838\u9a8c\u7684\u7248\u672c\u662f alpha \u9884\u53d1\u5e03\u7248\u3002", "version": "1.0-alpha4", "evidence": {"url": "https://github.com/commandprompt/pgcolumnar/blob/0d3100dd4fa76d1b915826be742e9286f621bc29/README.md", "text": "2026-09-29 \u00b7 0d3100dd4fa7 \u00b7 README.md"}, "extension": {"url": "/e/pgcolumnar/", "text": "pgcolumnar"}, "capability": "Table AM \u8eab\u4efd"}, {"state": "\u6709\u6761\u4ef6", "detail": "\u89c4\u5212\u5668\u53ef\u4ee5\u751f\u6210\u5e76\u884c\u5217\u5f0f\u626b\u63cf\uff1b\u662f\u5426\u9009\u7528\u53d6\u51b3\u4e8e\u6210\u672c\u548c\u5de5\u4f5c\u8fdb\u7a0b\u8bbe\u7f6e\u3002", "version": "1.0-alpha4", "evidence": {"url": "https://github.com/commandprompt/pgcolumnar/blob/0d3100dd4fa76d1b915826be742e9286f621bc29/docs/limitations.md", "text": "2026-09-29 \u00b7 0d3100dd4fa7 \u00b7 docs/limitations.md"}, "extension": {"url": "/e/pgcolumnar/", "text": "pgcolumnar"}, "capability": "\u5e76\u884c\u626b\u63cf"}, {"state": "\u6709\u6761\u4ef6", "detail": "\u81ea\u8eab\u7684 vacuum \u4e0d\u6267\u884c\u5e76\u884c\u5de5\u4f5c\u3002\u62d2\u7edd CLUSTER\u3001VACUUM FULL \u548c REPACK\uff1b\u6269\u5c55\u63d0\u4f9b\u538b\u7f29\u6574\u7406\u51fd\u6570\u4f5c\u4e3a\u66ff\u4ee3\u3002", "version": "1.0-alpha4", "evidence": {"url": "https://github.com/commandprompt/pgcolumnar/blob/0d3100dd4fa76d1b915826be742e9286f621bc29/docs/limitations.md", "text": "2026-09-29 \u00b7 0d3100dd4fa7 \u00b7 docs/limitations.md"}, "extension": {"url": "/e/pgcolumnar/", "text": "pgcolumnar"}, "capability": "Maintenance"}, {"state": "\u5df2\u6838\u9a8c\u7684\u9650\u5236", "detail": "\u5bf9\u5217\u5f0f\u8868\u8fdb\u884c\u91c7\u6837\u4f1a\u62a5\u64cd\u4f5c\u4e0d\u652f\u6301\u9519\u8bef\u3002", "version": "1.0-alpha4", "evidence": {"url": "https://github.com/commandprompt/pgcolumnar/blob/0d3100dd4fa76d1b915826be742e9286f621bc29/docs/limitations.md", "text": "2026-09-29 \u00b7 0d3100dd4fa7 \u00b7 docs/limitations.md"}, "extension": {"url": "/e/pgcolumnar/", "text": "pgcolumnar"}, "capability": "TABLESAMPLE"}, {"state": "\u672a\u77e5", "detail": "\u672c\u6b21\u6838\u9a8c\u672a\u786e\u8ba4\u5206\u5e03\u5f0f\u4e8b\u52a1\u4fdd\u8bc1\u3002", "version": "1.0-alpha4", "evidence": {"url": "https://github.com/commandprompt/pgcolumnar/blob/0d3100dd4fa76d1b915826be742e9286f621bc29/README.md", "text": "2026-09-29 \u00b7 0d3100dd4fa7 \u00b7 README.md"}, "extension": {"url": "/e/pgcolumnar/", "text": "pgcolumnar"}, "capability": "\u5206\u5e03\u5f0f\u4e8b\u52a1\u4fdd\u8bc1"}], "title": "\u4e00\u624b\u6765\u6e90\u8bb0\u8f7d\u7684\u80fd\u529b", "caption": "\u6bcf\u9879\u58f0\u660e\u4ec5\u9002\u7528\u4e8e\u5176\u4e2d\u6307\u660e\u7684\u6269\u5c55\u7248\u672c\u548c\u56fa\u5b9a\u6765\u6e90\u4fee\u8ba2\u3002\u672a\u5217\u51fa\u7684\u80fd\u529b\u4ecd\u4e3a\u672a\u77e5\u3002\u8fd9\u4e9b\u662f\u6587\u6863\u89c2\u5bdf\uff0c\u4e0d\u662f\u8fd0\u884c\u65f6\u6d4b\u8bd5\u6216\u5f53\u524d\u7ef4\u62a4\u4fdd\u8bc1\u3002", "columns": [{"key": "extension", "label": "\u6269\u5c55"}, {"key": "version", "label": "\u5df2\u6838\u9a8c\u7248\u672c"}, {"key": "capability", "label": "\u80fd\u529b"}, {"key": "state", "label": "\u8bc1\u636e\u72b6\u6001"}, {"key": "detail", "label": "\u9002\u7528\u6761\u4ef6"}, {"key": "evidence", "label": "\u8bc1\u636e\u65e5\u671f\u4e0e\u6765\u6e90"}]}], "extension_reviews": [{"kind": "tableam", "name": "pgcolumnar", "claims": [{"text": "Native columnar Table AM. This reviewed version is an alpha release.", "label": "Table AM identity", "state": "Verified in documentation"}, {"text": "The planner can create parallel columnar scans; cost and worker settings determine plan selection.", "label": "Parallel scans", "state": "Conditional", "source": 1}, {"text": "Its own vacuum performs no parallel work. CLUSTER, VACUUM FULL and REPACK are rejected; extension compaction functions provide alternatives.", "label": "Maintenance", "state": "Conditional", "source": 1}, {"text": "Sampling a columnar table raises an unsupported-operation error.", "label": "TABLESAMPLE", "state": "Verified limitation", "source": 1}, {"text": "No distributed transaction guarantee was established by this review.", "label": "Distributed transaction guarantees", "state": "Unknown"}], "sources": [{"url": "https://github.com/commandprompt/pgcolumnar/blob/0d3100dd4fa76d1b915826be742e9286f621bc29/README.md", "path": "README.md", "sha256": "dd3196db0ded36ff24d23bf5feb4e2163af784f3b7c0adc9cfc478497a1d5594", "local_name": "pgcolumnar-readme.txt"}, {"url": "https://github.com/commandprompt/pgcolumnar/blob/0d3100dd4fa76d1b915826be742e9286f621bc29/docs/limitations.md", "path": "docs/limitations.md", "sha256": "0133a61c17deba51ffd8e935785614c8e456bb52afe78de465d76f9524c6f521", "local_name": "pgcolumnar-limitations.txt"}], "version": "1.0-alpha4", "revision": "0d3100dd4fa76d1b915826be742e9286f621bc29", "checked_at": "2026-09-29"}], "catalog_observation": {"sha256": "a8f35f83709025575037ce50331f20fc27727e478464e35b48bb501e687cc121", "source": "data.pgext.universe", "identities": [{"id": 2401, "name": "citus_columnar"}, {"id": 2410, "name": "columnar"}, {"id": 2440, "name": "pg_mooncake"}, {"id": 2450, "name": "storage_engine"}, {"id": 100054, "name": "pg_cryogen"}, {"id": 100158, "name": "undam"}, {"id": 100199, "name": "tcle"}, {"id": 100517, "name": "append_only_heap"}, {"id": 100860, "name": "redis_backed_storage"}, {"id": 100918, "name": "pgrand"}, {"id": 100934, "name": "pg_elephantduck"}, {"id": 100973, "name": "csv_tam"}, {"id": 101123, "name": "pgtam"}, {"id": 101375, "name": "gfs"}, {"id": 101534, "name": "pg_delta_am"}, {"id": 101816, "name": "traceam"}, {"id": 101817, "name": "treedb_pgext"}, {"id": 101845, "name": "open_pg_tde"}, {"id": 101866, "name": "autocluster"}, {"id": 101868, "name": "bluefin"}, {"id": 101896, "name": "optimized_row_format"}, {"id": 101942, "name": "pgcolumnar"}, {"id": 101954, "name": "refdata"}], "observed_at": "2026-09-29T15:02:21.407129+00:00", "catalogue_rows": 2452, "candidate_count": 23}}}}, "snapshot": {"facts": [{"label": "\u63a5\u53e3\u7c7b\u522b", "value": "\u8868\u8bbf\u95ee\u65b9\u6cd5"}, {"label": "\u5904\u7406\u51fd\u6570\u6216\u4f8b\u7a0b", "value": "heapam_methods"}, {"label": "\u8bb0\u5f55\u7684\u56de\u8c03", "value": "43"}], "tables": [{"key": "callbacks", "rows": [{"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u5143\u7ec4\u69fd", "callback": "slot_callbacks", "implementation": "heapam_slot_callbacks"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u5f00\u59cb\u626b\u63cf", "callback": "scan_begin", "implementation": "heap_beginscan"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u521d\u59cb\u5316\u5e76\u884c\u626b\u63cf", "callback": "parallelscan_initialize", "implementation": "table_block_parallelscan_initialize"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u5f00\u59cb\u7d22\u5f15\u67e5\u627e", "callback": "index_fetch_begin", "implementation": "heapam_index_fetch_begin"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u83b7\u53d6\u6307\u5b9a\u5143\u7ec4", "callback": "index_fetch_tuple", "implementation": "heapam_index_fetch_tuple"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u63d2\u5165\u5143\u7ec4", "callback": "tuple_insert", "implementation": "heapam_tuple_insert"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u66f4\u65b0\u5143\u7ec4", "callback": "tuple_update", "implementation": "heapam_tuple_update"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u5220\u9664\u5143\u7ec4", "callback": "tuple_delete", "implementation": "heapam_tuple_delete"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u5bf9\u5173\u7cfb\u6267\u884c VACUUM", "callback": "relation_vacuum", "implementation": "heap_vacuum_rel"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u5206\u6790\u6570\u636e\u5757", "callback": "scan_analyze_next_block", "implementation": "heapam_scan_analyze_next_block"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "TOAST \u5224\u5b9a", "callback": "relation_needs_toast_table", "implementation": "heapam_relation_needs_toast_table"}], "title": "\u6ce8\u518c\u7684\u63a5\u53e3\u5904\u7406\u51fd\u6570", "columns": [{"key": "feature", "label": "\u63a5\u53e3\u64cd\u4f5c"}, {"key": "state", "label": "\u6e90\u7801\u89c2\u5bdf"}, {"key": "callback", "label": "\u56de\u8c03"}, {"key": "implementation", "label": "\u5b9e\u73b0"}]}], "related": [{"url": "/wiki/catalog/pg_am/?v=18", "label": "\u7cfb\u7edf\u76ee\u5f55 pg_am"}, {"url": "/wiki/guc/default_table_access_method/?v=18", "label": "default_table_access_method"}, {"url": "/wiki/indexam/?v=18", "label": "\u7d22\u5f15\u8bbf\u95ee\u65b9\u6cd5"}], "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://pg.center/docs/18/tableam.html", "path": "tableam.html", "label": "PostgreSQL 18 English manual", "sha256": "e659dece936c960dfea9e801720deb3d76abf2c3696abb3f58d32ac17d0f22aa", "language": "en", "original_url": "/docs/18/tableam.html"}, {"url": "https://ftp.postgresql.org/pub/source/v18.6/postgresql-18.6.tar.bz2", "line": 2616, "path": "src/backend/access/heap/heapam_handler.c", "label": "src/backend/access/heap/heapam_handler.c:2616", "sha256": "fd60a1f8d5530ce5c33fda6b74123c3c22e8c3b9ca6455a0e5d47aa392797a1e", "archive_sha256": "555610c24d53e4316da5b7d3fc25c279d96856d5e0e23ee308c328c5fa881d9f"}, {"url": "https://pg.center/docs/18/mvcc-intro.html", "path": "mvcc-intro.html", "label": "PostgreSQL 18 English manual", "sha256": "456469051ccd15ec2cfa1f2e656901a3bb63414db367003215ff810d638593e1", "language": "en", "original_url": "/docs/18/mvcc-intro.html"}, {"url": "https://pg.center/docs/18/sql-createtable.html", "path": "sql-createtable.html", "label": "PostgreSQL 18 English manual", "sha256": "b4d703391fe1102d0e02bd6769bef928513eb7a5542f38f7448fc77fe69e0d5b", "language": "en", "original_url": "/docs/18/sql-createtable.html"}, {"url": "https://pg.center/docs/18/routine-vacuuming.html", "path": "routine-vacuuming.html", "label": "PostgreSQL 18 English manual", "sha256": "ede8964df385f5bc69ae991369e6eaf99ae58aa2d6210e8bf868f090bb95b002", "language": "en", "original_url": "/docs/18/routine-vacuuming.html"}, {"url": "https://pg.center/docs/18/catalog-pg-am.html", "path": "catalog-pg-am.html", "label": "PostgreSQL 18 English manual", "sha256": "579364179365a51945e2edb6481df5d198916c2c725e506f166824dedf08994c", "language": "en", "original_url": "/docs/18/catalog-pg-am.html"}], "sections": [{"title": "\u63a5\u53e3\u4e0e\u80fd\u529b\u8fb9\u754c", "paragraphs": ["\u77e9\u9635\u8bb0\u5f55\u6b64\u6e90\u7801\u6784\u5efa\u5b9e\u9645\u6ce8\u518c\u7684\u56de\u8c03\u3002\u6ce8\u518c\u8868\u660e\u5b9e\u73b0\u4e86\u76f8\u5e94\u63a5\u53e3\u94a9\u5b50\uff1b\u64cd\u4f5c\u662f\u5426\u5141\u8bb8\u8fd8\u53d6\u51b3\u4e8e\u9009\u9879\u3001\u67e5\u8be2\u5f62\u5f0f\u3001\u6743\u9650\u548c\u63d0\u4f9b\u65b9\u89c4\u5219\u3002", "\u4e0b\u65b9\u4fdd\u7559\u540c\u7248\u672c\u5b8c\u6574\u624b\u518c\uff0c\u5305\u62ec\u914d\u7f6e\u3001\u7ea6\u675f\u548c\u793a\u4f8b\u3002\u4e0d\u58f0\u79f0\u5df2\u8fdb\u884c\u8fd0\u884c\u65f6\u80fd\u529b\u6d4b\u8bd5\u3002"]}, {"title": "\u5806\u5b58\u50a8\u3001\u53ef\u89c1\u6027\u4e0e WAL", "paragraphs": ["\u6b64\u6e05\u5355\u4ece PostgreSQL 12 \u5f15\u5165\u7684 Table AM \u63a5\u53e3\u5f00\u59cb\u3002\u4e0d\u4f1a\u5c06\u66f4\u65e9\u7248\u672c\u7684 PostgreSQL \u5806\u5b58\u50a8\u91cd\u65b0\u6807\u4e3a Table AM \u5b9e\u73b0\u3002", "\u5806\u53ef\u89c1\u6027\u9075\u5faa PostgreSQL \u5feb\u7167\u3002WAL \u548c\u5d29\u6e83\u6062\u590d\u884c\u4e3a\u53d6\u51b3\u4e8e\u5173\u7cfb\u7684\u6301\u4e45\u6027\uff1b\u4e34\u65f6\u8868\u3001\u65e0\u65e5\u5fd7\u8868\u4e0e\u6c38\u4e45\u8868\u4e0d\u540c\u3002\u7d22\u5f15\u8bbf\u95ee\u65b9\u6cd5\u4e0e\u8868\u5b58\u50a8\u63a5\u53e3\u5206\u5f00\u3002"]}, {"code": "{\n\t.type = T_TableAmRoutine,\n\n\t.slot_callbacks = heapam_slot_callbacks,\n\n\t.scan_begin = heap_beginscan,\n\t.scan_end = heap_endscan,\n\t.scan_rescan = heap_rescan,\n\t.scan_getnextslot = heap_getnextslot,\n\n\t.scan_set_tidrange = heap_set_tidrange,\n\t.scan_getnextslot_tidrange = heap_getnextslot_tidrange,\n\n\t.parallelscan_estimate = table_block_parallelscan_estimate,\n\t.parallelscan_initialize = table_block_parallelscan_initialize,\n\t.parallelscan_reinitialize = table_block_parallelscan_reinitialize,\n\n\t.index_fetch_begin = heapam_index_fetch_begin,\n\t.index_fetch_reset = heapam_index_fetch_reset,\n\t.index_fetch_end = heapam_index_fetch_end,\n\t.index_fetch_tuple = heapam_index_fetch_tuple,\n\n\t.tuple_insert = heapam_tuple_insert,\n\t.tuple_insert_speculative = heapam_tuple_insert_speculative,\n\t.tuple_complete_speculative = heapam_tuple_complete_speculative,\n\t.multi_insert = heap_multi_insert,\n\t.tuple_delete = heapam_tuple_delete,\n\t.tuple_update = heapam_tuple_update,\n\t.tuple_lock = heapam_tuple_lock,\n\n\t.tuple_fetch_row_version = heapam_fetch_row_version,\n\t.tuple_get_latest_tid = heap_get_latest_tid,\n\t.tuple_tid_valid = heapam_tuple_tid_valid,\n\t.tuple_satisfies_snapshot = heapam_tuple_satisfies_snapshot,\n\t.index_delete_tuples = heap_index_delete_tuples,\n\n\t.relation_set_new_filelocator = heapam_relation_set_new_filelocator,\n\t.relation_nontransactional_truncate = heapam_relation_nontransactional_truncate,\n\t.relation_copy_data = heapam_relation_copy_data,\n\t.relation_copy_for_cluster = heapam_relation_copy_for_cluster,\n\t.relation_vacuum = heap_vacuum_rel,\n\t.scan_analyze_next_block = heapam_scan_analyze_next_block,\n\t.scan_analyze_next_tuple = heapam_scan_analyze_next_tuple,\n\t.index_build_range_scan = heapam_index_build_range_scan,\n\t.index_validate_scan = heapam_index_validate_scan,\n\n\t.relation_size = table_block_relation_size,\n\t.relation_needs_toast_table = heapam_relation_needs_toast_table,\n\t.relation_toast_am = heapam_relation_toast_am,\n\t.relation_fetch_toast_slice = heap_fetch_toast_slice,\n\n\t.relation_estimate_size = heapam_estimate_rel_size,\n\n\t.scan_bitmap_next_tuple = heapam_scan_bitmap_next_tuple,\n\t.scan_sample_next_block = heapam_scan_sample_next_block,\n\t.scan_sample_next_tuple = heapam_scan_sample_next_tuple\n}", "title": "\u6838\u5fc3\u6e90\u7801\u4e2d\u6ce8\u518c\u7684\u5b9e\u73b0"}], "callbacks": {"scan_end": "heap_endscan", "scan_begin": "heap_beginscan", "tuple_lock": "heapam_tuple_lock", "scan_rescan": "heap_rescan", "multi_insert": "heap_multi_insert", "tuple_delete": "heapam_tuple_delete", "tuple_insert": "heapam_tuple_insert", "tuple_update": "heapam_tuple_update", "relation_size": "table_block_relation_size", "slot_callbacks": "heapam_slot_callbacks", "index_fetch_end": "heapam_index_fetch_end", "relation_vacuum": "heap_vacuum_rel", "tuple_tid_valid": "heapam_tuple_tid_valid", "scan_getnextslot": "heap_getnextslot", "index_fetch_begin": "heapam_index_fetch_begin", "index_fetch_reset": "heapam_index_fetch_reset", "index_fetch_tuple": "heapam_index_fetch_tuple", "relation_toast_am": "heapam_relation_toast_am", "scan_set_tidrange": "heap_set_tidrange", "relation_copy_data": "heapam_relation_copy_data", "index_delete_tuples": "heap_index_delete_tuples", "index_validate_scan": "heapam_index_validate_scan", "tuple_get_latest_tid": "heap_get_latest_tid", "parallelscan_estimate": "table_block_parallelscan_estimate", "index_build_range_scan": "heapam_index_build_range_scan", "relation_estimate_size": "heapam_estimate_rel_size", "scan_bitmap_next_tuple": "heapam_scan_bitmap_next_tuple", "scan_sample_next_block": "heapam_scan_sample_next_block", "scan_sample_next_tuple": "heapam_scan_sample_next_tuple", "parallelscan_initialize": "table_block_parallelscan_initialize", "scan_analyze_next_block": "heapam_scan_analyze_next_block", "scan_analyze_next_tuple": "heapam_scan_analyze_next_tuple", "tuple_fetch_row_version": "heapam_fetch_row_version", "tuple_insert_speculative": "heapam_tuple_insert_speculative", "tuple_satisfies_snapshot": "heapam_tuple_satisfies_snapshot", "parallelscan_reinitialize": "table_block_parallelscan_reinitialize", "relation_copy_for_cluster": "heapam_relation_copy_for_cluster", "scan_getnextslot_tidrange": "heap_getnextslot_tidrange", "relation_fetch_toast_slice": "heap_fetch_toast_slice", "relation_needs_toast_table": "heapam_relation_needs_toast_table", "tuple_complete_speculative": "heapam_tuple_complete_speculative", "relation_set_new_filelocator": "heapam_relation_set_new_filelocator", "relation_nontransactional_truncate": "heapam_relation_nontransactional_truncate"}, "description": ["\u5185\u7f6e heap \u8868\u8bbf\u95ee\u65b9\u6cd5\u5c06\u5143\u7ec4\u5b58\u50a8\u3001\u53ef\u89c1\u6027\u3001\u626b\u63cf\u3001\u7d22\u5f15\u83b7\u53d6\u548c\u7ef4\u62a4\u64cd\u4f5c\u96c6\u6210\u5230 PostgreSQL \u4e2d\u3002"], "manual_html": "<div class=\"chapter\" id=\"TABLEAM\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h2 class=\"title\" lang=\"zh\">\u7b2c 62 \u7ae0. Table Access Method Interface Definition</h2>\n</div>\n</div>\n</div>\n<p lang=\"zh\">\u672c\u7ae0\u8bf4\u660e <span class=\"productname\">PostgreSQL</span> \u6838\u5fc3\u7cfb\u7edf\u4e0e\u7ba1\u7406\u8868\u5b58\u50a8\u7684<em class=\"firstterm\">\u8868\u8bbf\u95ee\u65b9\u6cd5</em>\u4e4b\u95f4\u7684\u63a5\u53e3\u3002\u9664\u8fd9\u91cc\u89c4\u5b9a\u7684\u5185\u5bb9\u4e4b\u5916\uff0c\u6838\u5fc3\u7cfb\u7edf\u5bf9\u8fd9\u4e9b\u8bbf\u95ee\u65b9\u6cd5\u77e5\u4e4b\u751a\u5c11\uff0c\u56e0\u6b64\u53ef\u4ee5\u901a\u8fc7\u7f16\u5199\u9644\u52a0\u4ee3\u7801\u6765\u5f00\u53d1\u5168\u65b0\u7684\u8bbf\u95ee\u65b9\u6cd5\u7c7b\u578b\u3002</p>\n<p lang=\"zh\">\u6bcf\u4e2a\u8868\u8bbf\u95ee\u65b9\u6cd5\u90fd\u7531\u7cfb\u7edf\u76ee\u5f55 <a class=\"link\" href=\"/docs/18/catalog-pg-am.html\" title=\"52.3.\u00a0pg_am\"><code class=\"structname\">pg_am</code></a> \u4e2d\u7684\u4e00\u884c\u63cf\u8ff0\u3002<code class=\"structname\">pg_am</code> \u6761\u76ee\u6307\u5b9a\u4e86\u8be5\u8868\u8bbf\u95ee\u65b9\u6cd5\u7684\u540d\u79f0\u4ee5\u53ca\u4e00\u4e2a<em class=\"firstterm\">\u5904\u7406\u5668\u51fd\u6570</em>\u3002\u8fd9\u4e9b\u6761\u76ee\u53ef\u4ee5\u901a\u8fc7<a class=\"xref\" href=\"/docs/18/sql-create-access-method.html\" title=\"CREATE ACCESS METHOD\"><span class=\"refentrytitle\">CREATE ACCESS METHOD</span></a>\u548c<a class=\"xref\" href=\"/docs/18/sql-drop-access-method.html\" title=\"DROP ACCESS METHOD\"><span class=\"refentrytitle\">DROP ACCESS METHOD</span></a> SQL \u547d\u4ee4\u521b\u5efa\u548c\u5220\u9664\u3002</p>\n<p lang=\"zh\">\u8868\u8bbf\u95ee\u65b9\u6cd5\u7684\u5904\u7406\u5668\u51fd\u6570\u5fc5\u987b\u58f0\u660e\u4e3a\u63a5\u53d7\u4e00\u4e2a <code class=\"type\">internal</code> \u7c7b\u578b\u7684\u53c2\u6570\uff0c\u5e76\u8fd4\u56de\u4f2a\u7c7b\u578b <code class=\"type\">table_am_handler</code>\u3002\u8fd9\u4e2a\u53c2\u6570\u53ea\u662f\u4e00\u4e2a\u5360\u4f4d\u503c\uff0c\u7528\u6765\u9632\u6b62\u5904\u7406\u5668\u51fd\u6570\u88ab SQL \u547d\u4ee4\u76f4\u63a5\u8c03\u7528\u3002</p>\n<p lang=\"zh\">\u4e0b\u9762\u5c55\u793a\u6269\u5c55 SQL \u811a\u672c\u6587\u4ef6\u5982\u4f55\u521b\u5efa\u8868\u8bbf\u95ee\u65b9\u6cd5\u5904\u7406\u5668\uff1a</p>\n<pre class=\"programlisting\">CREATE OR REPLACE FUNCTION my_tableam_handler(internal)\n  RETURNS table_am_handler AS 'my_extension', 'my_tableam_handler'\n  LANGUAGE C STRICT;\n\nCREATE ACCESS METHOD myam TYPE TABLE HANDLER my_tableam_handler;\n</pre>\n<p lang=\"zh\">\u8be5\u51fd\u6570\u7684\u7ed3\u679c\u5fc5\u987b\u662f\u4e00\u4e2a\u6307\u5411 <code class=\"structname\">TableAmRoutine</code> \u7ed3\u6784\u4f53\u7684\u6307\u9488\uff0c\u5176\u4e2d\u5305\u542b\u6838\u5fc3\u4ee3\u7801\u4f7f\u7528\u8be5\u8868\u8bbf\u95ee\u65b9\u6cd5\u6240\u9700\u7684\u5168\u90e8\u4fe1\u606f\u3002\u8fd4\u56de\u503c\u9700\u8981\u5177\u6709\u670d\u52a1\u5668\u751f\u547d\u5468\u671f\uff0c\u8fd9\u901a\u5e38\u901a\u8fc7\u5c06\u5176\u5b9a\u4e49\u4e3a\u5168\u5c40\u4f5c\u7528\u57df\u4e2d\u7684 <code class=\"literal\">static const</code> \u53d8\u91cf\u6765\u5b9e\u73b0\u3002</p>\n<p lang=\"zh\">\u4e0b\u9762\u662f\u4e00\u4e2a\u5305\u542b\u8868\u8bbf\u95ee\u65b9\u6cd5\u5904\u7406\u5668\u7684\u6e90\u6587\u4ef6\u793a\u4f8b\uff1a</p>\n<pre class=\"programlisting\">#include \"postgres.h\"\n\n#include \"access/tableam.h\"\n#include \"fmgr.h\"\n\nPG_MODULE_MAGIC;\n\nstatic const TableAmRoutine my_tableam_methods = {\n    .type = T_TableAmRoutine,\n\n    /* Methods of TableAmRoutine omitted from example, add them here. */\n};\n\nPG_FUNCTION_INFO_V1(my_tableam_handler);\n\nDatum\nmy_tableam_handler(PG_FUNCTION_ARGS)\n{\n    PG_RETURN_POINTER(&amp;my_tableam_methods);\n}\n\n</pre>\n<p lang=\"zh\"><code class=\"structname\">TableAmRoutine</code> \u7ed3\u6784\u4f53\u4e5f\u79f0\u4e3a\u8be5\u8bbf\u95ee\u65b9\u6cd5\u7684<em class=\"firstterm\">API \u7ed3\u6784\u4f53</em>\uff0c\u5b83\u901a\u8fc7\u56de\u8c03\u6765\u5b9a\u4e49\u8bbf\u95ee\u65b9\u6cd5\u7684\u884c\u4e3a\u3002\u8fd9\u4e9b\u56de\u8c03\u662f\u666e\u901a C \u51fd\u6570\u7684\u6307\u9488\uff0c\u5728 SQL \u5c42\u65e2\u4e0d\u53ef\u89c1\u4e5f\u4e0d\u53ef\u8c03\u7528\u3002\u6240\u6709\u56de\u8c03\u53ca\u5176\u884c\u4e3a\u90fd\u5b9a\u4e49\u5728 <code class=\"structname\">TableAmRoutine</code> \u7ed3\u6784\u4f53\u4e2d\uff08\u7ed3\u6784\u4f53\u5185\u7684\u6ce8\u91ca\u8bf4\u660e\u4e86\u5bf9\u56de\u8c03\u7684\u8981\u6c42\uff09\u3002\u5927\u591a\u6570\u56de\u8c03\u90fd\u6709\u5305\u88c5\u51fd\u6570\uff0c\u5176\u6587\u6863\u662f\u4ece\u8868\u8bbf\u95ee\u65b9\u6cd5\u4f7f\u7528\u8005\u800c\u975e\u5b9e\u73b0\u8005\u7684\u89d2\u5ea6\u7f16\u5199\u7684\u3002\u8be6\u60c5\u8bf7\u53c2\u9605 <a class=\"ulink\" href=\"https://git.postgresql.org/gitweb/?p=postgresql.git;a=blob;f=src/include/access/tableam.h;hb=HEAD\" target=\"_top\"><code class=\"filename\">src/include/access/tableam.h</code></a> \u6587\u4ef6\u3002</p>\n<p lang=\"zh\">\u5b9e\u73b0\u8bbf\u95ee\u65b9\u6cd5\u65f6\uff0c\u901a\u5e38\u9700\u8981\u5b9e\u73b0\u4e13\u7528\u7684\u5143\u7ec4\u8868\u69fd\u4f4d\u7c7b\u578b\uff08\u53c2\u89c1 src/include/executor/tuptable.h\uff09\uff0c\u4f7f\u8bbf\u95ee\u65b9\u6cd5\u4e4b\u5916\u7684\u4ee3\u7801\u53ef\u4ee5\u6301\u6709\u8be5\u65b9\u6cd5\u7684\u5143\u7ec4\u5f15\u7528\uff0c\u5e76\u8bbf\u95ee\u5143\u7ec4\u5404\u5217\u3002</p>\n<p lang=\"zh\">\u76ee\u524d\uff0cAM \u5b9e\u9645\u5b58\u50a8\u6570\u636e\u7684\u65b9\u5f0f\u6240\u53d7\u9650\u5236\u76f8\u5f53\u5c11\u3002\u4f8b\u5982\uff0c\u53ef\u4ee5\u4f7f\u7528 postgres \u7684\u5171\u4eab\u7f13\u51b2\u533a\u7f13\u5b58\uff0c\u4f46\u8fd9\u5e76\u975e\u5fc5\u9700\u3002\u5982\u679c\u4f7f\u7528\u5b83\uff0c\u90a3\u4e48\u91c7\u7528 <span class=\"productname\">PostgreSQL</span> \u5728<a class=\"xref\" href=\"/docs/18/storage-page-layout.html\" title=\"66.6.\u00a0\u6570\u636e\u5e93\u9875\u9762\u5e03\u5c40\">\u7b2c\u00a066.6\u00a0\u8282</a>\u4e2d\u63cf\u8ff0\u7684\u6807\u51c6\u9875\u9762\u5e03\u5c40\u901a\u5e38\u662f\u6709\u610f\u4e49\u7684\u3002</p>\n<p lang=\"zh\">\u8868\u8bbf\u95ee\u65b9\u6cd5 API \u76ee\u524d\u7684\u4e00\u9879\u8f83\u5927\u9650\u5236\u662f\uff1a\u82e5\u8bbf\u95ee\u65b9\u6cd5\u5e0c\u671b\u652f\u6301\u4fee\u6539\u64cd\u4f5c\u548c/\u6216\u7d22\u5f15\uff0c\u6bcf\u4e2a\u5143\u7ec4\u5fc5\u987b\u6709\u4e00\u4e2a\u7531\u5757\u53f7\u548c\u9879\u53f7\u7ec4\u6210\u7684\u5143\u7ec4\u6807\u8bc6\u7b26 TID\uff08\u53e6\u89c1\u7b2c 66.6 \u8282\uff09\u3002TID \u5404\u90e8\u5206\u4e0d\u5fc5\u5177\u6709\u4e0e heap \u4e2d\u5b8c\u5168\u76f8\u540c\u7684\u542b\u4e49\uff1b\u4f46\u5982\u679c\u8981\u652f\u6301\u53ef\u9009\u7684\u4f4d\u56fe\u626b\u63cf\uff0c\u5757\u53f7\u5c31\u9700\u8981\u63d0\u4f9b\u5c40\u90e8\u6027\u3002</p>\n<p lang=\"zh\">\u4e3a\u4fdd\u8bc1\u5d29\u6e83\u5b89\u5168\uff0cAM \u53ef\u4ee5\u4f7f\u7528 postgres \u7684<a class=\"link\" href=\"/docs/18/wal.html\" title=\"\u7b2c\u00a028\u00a0\u7ae0\u00a0\u53ef\u9760\u6027\u4e0e\u9884\u5199\u5f0f\u65e5\u5fd7\"><acronym class=\"acronym\">WAL</acronym></a>\uff0c\u4e5f\u53ef\u4ee5\u4f7f\u7528\u81ea\u5b9a\u4e49\u5b9e\u73b0\u3002\u5982\u679c\u9009\u62e9\u4e86 <acronym class=\"acronym\">WAL</acronym>\uff0c\u53ef\u4ee5\u4f7f\u7528<a class=\"link\" href=\"/docs/18/generic-wal.html\" title=\"64.1.\u00a0\u901a\u7528 WAL \u8bb0\u5f55\">\u901a\u7528 WAL \u8bb0\u5f55</a>\uff0c\u4e5f\u53ef\u4ee5\u5b9e\u73b0\u4e00\u4e2a<a class=\"link\" href=\"/docs/18/custom-rmgr.html\" title=\"64.2.\u00a0\u81ea\u5b9a\u4e49 WAL \u8d44\u6e90\u7ba1\u7406\u5668\">\u81ea\u5b9a\u4e49 WAL \u8d44\u6e90\u7ba1\u7406\u5668</a>\u3002</p>\n<p lang=\"zh\">\u8981\u4ee5\u5141\u8bb8\u5728\u5355\u4e2a\u4e8b\u52a1\u4e2d\u8bbf\u95ee\u4e0d\u540c\u8868\u8bbf\u95ee\u65b9\u6cd5\u7684\u65b9\u5f0f\u5b9e\u73b0\u4e8b\u52a1\u652f\u6301\uff0c\u5f88\u53ef\u80fd\u9700\u8981\u4e0e <code class=\"filename\">src/backend/access/transam/xlog.c</code> \u4e2d\u7684\u673a\u5236\u7d27\u5bc6\u96c6\u6210\u3002</p>\n<p lang=\"zh\">\u5f00\u53d1\u65b0\u7684\u8868\u8bbf\u95ee\u65b9\u6cd5\u65f6\uff0c\u53ef\u4ee5\u53c2\u7167 src/backend/access/heap/heapam_handler.c \u4e2d\u73b0\u6709\u7684\u5806\u5b9e\u73b0\uff0c\u4e86\u89e3\u5b9e\u73b0\u7ec6\u8282\u3002</p>\n</div>", "manual_path": "/docs/18/tableam.html", "localization": {"status": "complete", "sources": [{"url": "/docs/18/tableam.html", "method": "same-major semantic node", "sha256": "29a69a32b5b468f79af513ef4e398bccc182443109d9f3da23f374e018b981e6", "language": "zh", "matched_nodes": ["#TABLEAM/p[11]", "#TABLEAM/p[13]", "#TABLEAM/p[15]", "#TABLEAM/p[16]", "#TABLEAM/p[3]", "#TABLEAM/p[4]", "#TABLEAM/p[5]", "#TABLEAM/p[6]", "#TABLEAM/p[8]", "#TABLEAM/p[9]"]}], "language": "zh", "original_text": {"/versions/18/description/0": "The built-in heap table access method integrates tuple storage, visibility, scans, index fetches and maintenance with PostgreSQL.", "/versions/18/facts/0/label": "Interface family", "/versions/18/facts/0/value": "Table access method", "/versions/18/facts/1/label": "Handler or routine", "/versions/18/facts/2/label": "Recorded callbacks", "/versions/18/tables/0/title": "Registered interface handlers", "/versions/18/related/0/label": "System catalog pg_am", "/versions/18/related/2/label": "Index AM", "/versions/18/sections/0/title": "Interface and capability boundaries", "/versions/18/sections/1/title": "Heap storage, visibility and WAL", "/versions/18/sections/2/title": "Registered implementation in core source", "/versions/18/tables/0/rows/0/state": "Handler registered; conditions apply", "/versions/18/tables/0/rows/1/state": "Handler registered; conditions apply", "/versions/18/tables/0/rows/2/state": "Handler registered; conditions apply", "/versions/18/tables/0/rows/3/state": "Handler registered; conditions apply", "/versions/18/tables/0/rows/4/state": "Handler registered; conditions apply", "/versions/18/tables/0/rows/5/state": "Handler registered; conditions apply", "/versions/18/tables/0/rows/6/state": "Handler registered; conditions apply", "/versions/18/tables/0/rows/7/state": "Handler registered; conditions apply", "/versions/18/tables/0/rows/8/state": "Handler registered; conditions apply", "/versions/18/tables/0/rows/9/state": "Handler registered; conditions apply", "/versions/18/tables/0/rows/10/state": "Handler registered; conditions apply", "/versions/18/sections/0/paragraphs/0": "The matrix records callbacks actually registered in this source build. Registration identifies an implemented interface hook; options, query shape, privileges and provider rules determine whether an operation is allowed.", "/versions/18/sections/0/paragraphs/1": "The complete same-version manual below retains configuration, constraints and examples. No runtime capability test is claimed.", "/versions/18/sections/1/paragraphs/0": "This inventory starts with the Table AM interface in PostgreSQL 12. Earlier PostgreSQL heap storage is not relabeled as a Table AM implementation.", "/versions/18/sections/1/paragraphs/1": "Heap visibility follows PostgreSQL snapshots. WAL and crash-recovery behavior depend on relation persistence; temporary and unlogged tables differ from permanent tables. Index access methods remain separate from the table storage interface.", "/versions/18/tables/0/rows/0/feature": "Tuple slot", "/versions/18/tables/0/rows/1/feature": "Begin scan", "/versions/18/tables/0/rows/2/feature": "Parallel scan initialization", "/versions/18/tables/0/rows/3/feature": "Begin index lookup", "/versions/18/tables/0/rows/4/feature": "Fetch identified tuple", "/versions/18/tables/0/rows/5/feature": "Insert tuple", "/versions/18/tables/0/rows/6/feature": "Update tuple", "/versions/18/tables/0/rows/7/feature": "Delete tuple", "/versions/18/tables/0/rows/8/feature": "Vacuum relation", "/versions/18/tables/0/rows/9/feature": "Analyze block", "/versions/18/tables/0/columns/0/label": "Interface operation", "/versions/18/tables/0/columns/1/label": "Source observation", "/versions/18/tables/0/columns/2/label": "Callback", "/versions/18/tables/0/columns/3/label": "Implementation", "/versions/18/tables/0/rows/10/feature": "TOAST decision"}, "fallback_fields": [], "source_language": "en", "original_snapshot_sha256": "6c7bd2e2f6691cce57c835d991feefc5864df47eda2ec7884768f0c2efa48406"}, "evidence_kind": "source and documentation", "comparison_data": {"options": [], "callbacks": {"scan_end": "heap_endscan", "scan_begin": "heap_beginscan", "tuple_lock": "heapam_tuple_lock", "scan_rescan": "heap_rescan", "multi_insert": "heap_multi_insert", "tuple_delete": "heapam_tuple_delete", "tuple_insert": "heapam_tuple_insert", "tuple_update": "heapam_tuple_update", "relation_size": "table_block_relation_size", "slot_callbacks": "heapam_slot_callbacks", "index_fetch_end": "heapam_index_fetch_end", "relation_vacuum": "heap_vacuum_rel", "tuple_tid_valid": "heapam_tuple_tid_valid", "scan_getnextslot": "heap_getnextslot", "index_fetch_begin": "heapam_index_fetch_begin", "index_fetch_reset": "heapam_index_fetch_reset", "index_fetch_tuple": "heapam_index_fetch_tuple", "relation_toast_am": "heapam_relation_toast_am", "scan_set_tidrange": "heap_set_tidrange", "relation_copy_data": "heapam_relation_copy_data", "index_delete_tuples": "heap_index_delete_tuples", "index_validate_scan": "heapam_index_validate_scan", "tuple_get_latest_tid": "heap_get_latest_tid", "parallelscan_estimate": "table_block_parallelscan_estimate", "index_build_range_scan": "heapam_index_build_range_scan", "relation_estimate_size": "heapam_estimate_rel_size", "scan_bitmap_next_tuple": "heapam_scan_bitmap_next_tuple", "scan_sample_next_block": "heapam_scan_sample_next_block", "scan_sample_next_tuple": "heapam_scan_sample_next_tuple", "parallelscan_initialize": "table_block_parallelscan_initialize", "scan_analyze_next_block": "heapam_scan_analyze_next_block", "scan_analyze_next_tuple": "heapam_scan_analyze_next_tuple", "tuple_fetch_row_version": "heapam_fetch_row_version", "tuple_insert_speculative": "heapam_tuple_insert_speculative", "tuple_satisfies_snapshot": "heapam_tuple_satisfies_snapshot", "parallelscan_reinitialize": "table_block_parallelscan_reinitialize", "relation_copy_for_cluster": "heapam_relation_copy_for_cluster", "scan_getnextslot_tidrange": "heap_getnextslot_tidrange", "relation_fetch_toast_slice": "heap_fetch_toast_slice", "relation_needs_toast_table": "heapam_relation_needs_toast_table", "tuple_complete_speculative": "heapam_tuple_complete_speculative", "relation_set_new_filelocator": "heapam_relation_set_new_filelocator", "relation_nontransactional_truncate": "heapam_relation_nontransactional_truncate"}, "source_options": [], "protocol_versions": {}}, "comparison_hash": "1238506f6e6c6648382f3362465d376e28e55ca6108f975b44f413d320769112", "manual_language": "zh", "runtime_verified": false}, "comparison": {"left": "17", "right": "18", "status": "changed", "diff": "--- PostgreSQL 17\n+++ PostgreSQL 18\n@@ -24,7 +24,6 @@\n     \"scan_analyze_next_block\": \"heapam_scan_analyze_next_block\",\n     \"scan_analyze_next_tuple\": \"heapam_scan_analyze_next_tuple\",\n     \"scan_begin\": \"heap_beginscan\",\n-    \"scan_bitmap_next_block\": \"heapam_scan_bitmap_next_block\",\n     \"scan_bitmap_next_tuple\": \"heapam_scan_bitmap_next_tuple\",\n     \"scan_end\": \"heap_endscan\",\n     \"scan_getnextslot\": \"heap_getnextslot\","}}