{"kind": "plan", "major": "18", "item": {"slug": "sort", "name": "Sort", "name_zh": "Sort", "category": "\u6392\u5e8f", "summary": "\u6309\u8ba1\u5212\u6392\u5e8f\u952e\u5bf9\u5b50\u8ba1\u5212\u8f93\u51fa\u7684\u884c\u6392\u5e8f\u3002", "aliases": ["Sort", "T_Sort"], "content_hash": "d745ce201b28cbd2c21801851d930625f7c4acc5494aac5ca7d7d918749bc9a8", "versions": {"10": {"facts": [{"label": "\u6838\u5fc3\u8282\u70b9\u6807\u7b7e", "value": "T_Sort"}, {"label": "\u7ed3\u6784\u5316 EXPLAIN \u8282\u70b9\u7c7b\u578b", "value": "Sort"}, {"label": "\u8f93\u5165", "value": "\u4e00\u4e2a\u5b50\u8ba1\u5212"}, {"label": "\u8f93\u51fa", "value": "\u5df2\u6392\u5e8f\u7684\u5143\u7ec4"}, {"label": "\u6267\u884c\u5668\u521d\u59cb\u5316\u51fd\u6570", "value": "ExecInitSort"}, {"label": "\u5185\u5b58\u673a\u5236", "value": "tuplesort"}], "memory": {"evidence": [{"url": "https://ftp.postgresql.org/pub/source/v10.23/postgresql-10.23.tar.bz2", "path": "src/backend/executor/nodeSort.c", "label": "src/backend/executor/nodeSort.c", "sha256": "7a925538a3ee0106362e266c94ada02b3851fe59d0bb0c9c1a5469e625aee94b", "archive_sha256": "94a4b2528372458e5662c18d406629266667c437198160a18cdfd2c4a4d6eee9"}, {"url": "https://ftp.postgresql.org/pub/source/v10.23/postgresql-10.23.tar.bz2", "path": "src/backend/utils/sort/tuplesort.c", "label": "src/backend/utils/sort/tuplesort.c", "sha256": "2caba56cfc5b0f67b49aba244d54efd12cdae0a7647c16dfe2008cf125f253fe", "archive_sha256": "94a4b2528372458e5662c18d406629266667c437198160a18cdfd2c4a4d6eee9"}], "mechanism": "tuplesort", "description": "\u6b64\u8282\u70b9\u5c06 work_mem \u4f20\u7ed9 tuplesort\u3002\u6392\u5e8f\u53ef\u4f7f\u7528\u5185\u5b58\u6216\u4e34\u65f6\u6587\u4ef6\uff1b\u5b9e\u9645\u65b9\u6cd5\u548c\u7a7a\u95f4\u7528\u91cf\u53d6\u51b3\u4e8e\u8f93\u5165\u53ca\u8ba1\u5212\u3002", "source_notes": ["Sorts tuples from the outer subtree of the node using tuplesort, which saves the results in a temporary file or memory. After the initial call, returns a tuple from the file with each call."]}, "tables": [{"key": "explain-labels", "rows": [{"label": "Sort", "identity": "Sort"}], "title": "\u672c\u6784\u5efa\u4e2d\u7684 EXPLAIN \u6807\u7b7e", "columns": [{"key": "label", "label": "\u6587\u672c\u683c\u5f0f\u6807\u7b7e"}, {"key": "identity", "label": "\u7ed3\u6784\u5316\u8282\u70b9\u6807\u8bc6"}]}], "related": [{"url": "/wiki/sql/explain/?v=10", "label": "EXPLAIN"}, {"url": "/docs/10/using-explain.html", "label": "\u4f7f\u7528 EXPLAIN"}, {"url": "/docs/10/parallel-plans.html", "label": "\u5e76\u884c\u8ba1\u5212"}, {"url": "/wiki/guc/enable_sort/?v=10", "label": "enable_sort"}, {"url": "/wiki/guc/work_mem/?v=10", "label": "work_mem"}], "release": {"ref": "PostgreSQL 10.23 source archive", "label": "10.23", "major": "10", "channel": "historical", "revision": "94a4b2528372458e5662c18d406629266667c437198160a18cdfd2c4a4d6eee9", "source_url": "https://ftp.postgresql.org/pub/source/v10.23/postgresql-10.23.tar.bz2", "source_snapshot_utc": ""}, "sources": [{"url": "https://ftp.postgresql.org/pub/source/v10.23/postgresql-10.23.tar.bz2", "line": 1016, "path": "src/backend/commands/explain.c", "label": "src/backend/commands/explain.c:1016", "sha256": "a785298532047cfeda969e78c3597a343dc1c56d61ba85830b0f16a02a14b5a1", "archive_sha256": "94a4b2528372458e5662c18d406629266667c437198160a18cdfd2c4a4d6eee9"}, {"url": "https://ftp.postgresql.org/pub/source/v10.23/postgresql-10.23.tar.bz2", "line": 313, "path": "src/backend/executor/execProcnode.c", "label": "src/backend/executor/execProcnode.c:313", "sha256": "cea76648bb38ae55f18f989768bee1a4ee025691ceea0f86bccb29dcdc166acc", "archive_sha256": "94a4b2528372458e5662c18d406629266667c437198160a18cdfd2c4a4d6eee9"}, {"url": "https://ftp.postgresql.org/pub/source/v10.23/postgresql-10.23.tar.bz2", "path": "src/backend/executor/nodeSort.c", "label": "src/backend/executor/nodeSort.c", "sha256": "7a925538a3ee0106362e266c94ada02b3851fe59d0bb0c9c1a5469e625aee94b", "archive_sha256": "94a4b2528372458e5662c18d406629266667c437198160a18cdfd2c4a4d6eee9"}, {"url": "https://ftp.postgresql.org/pub/source/v10.23/postgresql-10.23.tar.bz2", "path": "src/include/nodes/plannodes.h", "label": "src/include/nodes/plannodes.h", "sha256": "d562c321108844798cd234303fffb618f13d4ee3f3a5ac79bfd963b077e47c22", "archive_sha256": "94a4b2528372458e5662c18d406629266667c437198160a18cdfd2c4a4d6eee9"}, {"url": "https://ftp.postgresql.org/pub/source/v10.23/postgresql-10.23.tar.bz2", "path": "src/backend/utils/sort/tuplesort.c", "label": "src/backend/utils/sort/tuplesort.c", "sha256": "2caba56cfc5b0f67b49aba244d54efd12cdae0a7647c16dfe2008cf125f253fe", "archive_sha256": "94a4b2528372458e5662c18d406629266667c437198160a18cdfd2c4a4d6eee9"}, {"url": "https://pg.center/docs/10/using-explain.html#USING-EXPLAIN-BASICS", "path": "using-explain.html", "label": "PostgreSQL 10.23 \u00b7 using-explain", "sha256": "a4b4304aedb0a2da0145cc7c35b03b319a5c7ee3df35a8ef84ab6d3a610f98f3", "language": "en", "original_url": "/docs/10/using-explain.html#USING-EXPLAIN-BASICS"}, {"url": "https://pg.center/docs/10/using-explain.html#USING-EXPLAIN-ANALYZE", "path": "using-explain.html", "label": "PostgreSQL 10.23 \u00b7 using-explain", "sha256": "a4b4304aedb0a2da0145cc7c35b03b319a5c7ee3df35a8ef84ab6d3a610f98f3", "language": "en", "original_url": "/docs/10/using-explain.html#USING-EXPLAIN-ANALYZE"}], "node_tag": "T_Sort", "sections": [{"title": "EXPLAIN \u540d\u79f0\u4e0e\u5c5e\u6027", "paragraphs": ["\u7ed3\u6784\u5316\u683c\u5f0f\u4f7f\u7528\u4e0a\u8ff0 Node Type\u3002\u6587\u672c\u683c\u5f0f\u540d\u79f0\u8fd8\u53ef\u80fd\u5305\u542b\u64cd\u4f5c\u3001\u7b56\u7565\u3001\u8fde\u63a5\u7c7b\u578b\u3001\u626b\u63cf\u65b9\u5411\u6216\u805a\u5408\u9636\u6bb5\u5c5e\u6027\u3002", "\u6b64\u6e90\u7801\u8bb0\u5f55\u7684\u6587\u672c\u540d\u79f0\uff1aSort.", "\u5e76\u884c\u611f\u77e5\u4e0e\u5e76\u884c\u5b89\u5168\u662f\u4e0d\u540c\u7684\u8ba1\u5212\u5c5e\u6027\u3002\u5728\u5e76\u884c\u5de5\u4f5c\u8fdb\u7a0b\u5185\u8fd0\u884c\u7684\u8282\u70b9\u4e0d\u4e00\u5b9a\u662f\u5e76\u884c\u611f\u77e5\u8282\u70b9\u3002"]}, {"title": "\u5185\u5b58\u4e0e\u4e34\u65f6\u5b58\u50a8", "paragraphs": ["\u6b64\u8282\u70b9\u5c06 work_mem \u4f20\u7ed9 tuplesort\u3002\u6392\u5e8f\u53ef\u4f7f\u7528\u5185\u5b58\u6216\u4e34\u65f6\u6587\u4ef6\uff1b\u5b9e\u9645\u65b9\u6cd5\u548c\u7a7a\u95f4\u7528\u91cf\u53d6\u51b3\u4e8e\u8f93\u5165\u53ca\u8ba1\u5212\u3002", "\u4f7f\u7528 tuplesort \u5bf9\u8282\u70b9\u5916\u4fa7\u5b50\u6811\u7684\u5143\u7ec4\u6392\u5e8f\uff0c\u5c06\u7ed3\u679c\u4fdd\u5b58\u5728\u4e34\u65f6\u6587\u4ef6\u6216\u5185\u5b58\u4e2d\u3002\u9996\u6b21\u8c03\u7528\u4e4b\u540e\uff0c\u6bcf\u6b21\u8c03\u7528\u90fd\u4ece\u6587\u4ef6\u8fd4\u56de\u4e00\u4e2a\u5143\u7ec4\u3002"]}, {"title": "\u5e76\u884c\u6267\u884c\u4e0e\u8fd0\u884c\u4fe1\u606f\u91c7\u96c6", "paragraphs": ["\u4ee5\u4e0b\u6e90\u7801\u56de\u8c03\u53ef\u4ee5\u534f\u8c03\u6267\u884c\u6216\u6536\u96c6\u5de5\u4f5c\u8fdb\u7a0b\u7684\u6d4b\u91cf\u6570\u636e\u3002\u56de\u8c03\u5b58\u5728\u4e0d\u4ee3\u8868\u8be5\u8282\u70b9\u666e\u904d\u652f\u6301\u5171\u4eab\u5e76\u884c\u626b\u63cf\u6216\u5171\u4eab\u72b6\u6001\u3002", "\u6b64\u6784\u5efa\u7684\u56de\u8c03\uff1anone extracted from this node implementation."]}, {"title": "\u540c\u7248\u672c\u624b\u518c\u8bf4\u660e", "paragraphs": ["\u4f30\u8ba1\u542f\u52a8\u4ee3\u4ef7\uff1a\u8f93\u51fa\u9636\u6bb5\u5f00\u59cb\u4e4b\u524d\u6d88\u8017\u7684\u65f6\u95f4\uff0c\u4f8b\u5982\u6392\u5e8f\u8282\u70b9\u6267\u884c\u6392\u5e8f\u6240\u9700\u7684\u65f6\u95f4\u3002", "\u5f52\u5e76\u8fde\u63a5\u8981\u6c42\u8f93\u5165\u6309\u8fde\u63a5\u952e\u6392\u5e8f\u3002\u6b64\u8ba1\u5212\u901a\u8fc7\u7d22\u5f15\u626b\u63cf\u6309\u987a\u5e8f\u8bfb\u53d6 tenk1\uff1b\u5bf9\u4e8e onek\uff0c\u5219\u503e\u5411\u4e8e\u987a\u5e8f\u626b\u63cf\u540e\u6392\u5e8f\uff0c\u56e0\u4e3a\u8be5\u8868\u8981\u8bbf\u95ee\u7684\u884c\u66f4\u591a\u3002\uff08\u5bf9\u5927\u91cf\u884c\u6392\u5e8f\u65f6\uff0c\u987a\u5e8f\u626b\u63cf\u52a0\u6392\u5e8f\u5e38\u5e38\u4f18\u4e8e\u7d22\u5f15\u626b\u63cf\uff0c\u56e0\u4e3a\u540e\u8005\u9700\u8981\u975e\u987a\u5e8f\u78c1\u76d8\u8bbf\u95ee\u3002\uff09", "\u89c2\u5bdf\u5907\u9009\u8ba1\u5212\u7684\u4e00\u79cd\u529e\u6cd5\uff0c\u662f\u4f7f\u7528\u7b2c 19.7.1 \u8282\u7684\u542f\u7528\uff0f\u7981\u7528\u6807\u5fd7\uff0c\u5f3a\u5236\u89c4\u5212\u5668\u5ffd\u7565\u5b83\u8ba4\u4e3a\u4ee3\u4ef7\u6700\u4f4e\u7684\u7b56\u7565\u3002\u8fd9\u79cd\u5de5\u5177\u8f83\u4e3a\u7c97\u7565\uff0c\u4f46\u5f88\u6709\u7528\uff0c\u53e6\u89c1\u7b2c 14.3 \u8282\u3002\u4f8b\u5982\uff0c\u5982\u679c\u4e0d\u786e\u5b9a\u524d\u4f8b\u4e2d\u5bf9 onek \u8868\u91c7\u7528\u987a\u5e8f\u626b\u63cf\u518d\u6392\u5e8f\u662f\u5426\u6700\u4f73\uff0c\u53ef\u4ee5\u5c1d\u8bd5\uff1a", "\u8fd9\u8bf4\u660e\u89c4\u5212\u5668\u8ba4\u4e3a\u901a\u8fc7\u7d22\u5f15\u626b\u63cf\u5bf9 onek \u6392\u5e8f\u7684\u6210\u672c\u6bd4\u987a\u5e8f\u626b\u63cf\u52a0\u6392\u5e8f\u9ad8\u7ea6 12%\u3002\u63a5\u4e0b\u6765\u5f53\u7136\u8981\u786e\u8ba4\u5b83\u5224\u65ad\u662f\u5426\u6b63\u786e\uff1b\u53ef\u4f7f\u7528\u4e0b\u6587\u4ecb\u7ecd\u7684 EXPLAIN ANALYZE \u6765\u9a8c\u8bc1\u3002", "\u5728\u67d0\u4e9b\u60c5\u51b5\u4e0b\uff0cEXPLAIN ANALYZE \u9664\u4e86\u8ba1\u5212\u8282\u70b9\u7684\u6267\u884c\u65f6\u95f4\u548c\u884c\u6570\u4e4b\u5916\uff0c\u8fd8\u4f1a\u663e\u793a\u989d\u5916\u7684\u6267\u884c\u7edf\u8ba1\u4fe1\u606f\u3002\u4f8b\u5982\uff0cSort \u548c Hash \u8282\u70b9\u4f1a\u63d0\u4f9b\u66f4\u591a\u4fe1\u606f\uff1a", "Sort \u8282\u70b9\u663e\u793a\u6392\u5e8f\u65b9\u6cd5\uff08\u5c24\u5176\u662f\u5185\u5b58\u6392\u5e8f\u8fd8\u662f\u78c1\u76d8\u6392\u5e8f\uff09\u53ca\u6240\u9700\u5185\u5b58\u6216\u78c1\u76d8\u7a7a\u95f4\u3002Hash \u8282\u70b9\u663e\u793a\u54c8\u5e0c\u6876\u6570\u3001\u6279\u6b21\u6570\u53ca\u54c8\u5e0c\u8868\u5185\u5b58\u4f7f\u7528\u5cf0\u503c\u3002\uff08\u6279\u6b21\u6570\u8d85\u8fc7\u4e00\u65f6\u4e5f\u4f1a\u4f7f\u7528\u78c1\u76d8\u7a7a\u95f4\uff0c\u4f46\u6b64\u5904\u4e0d\u663e\u793a\u3002\uff09"]}, {"title": "\u672c\u7248\u624b\u518c\u4e2d\u7684\u793a\u4f8b", "blocks": [{"code": "EXPLAIN SELECT *\nFROM tenk1 t1, onek t2\nWHERE t1.unique1 < 100 AND t1.unique2 = t2.unique2;\n\n                                        QUERY PLAN\n------------------------------------------------------------------------------------------\n Merge Join  (cost=198.11..268.19 rows=10 width=488)\n   Merge Cond: (t1.unique2 = t2.unique2)\n   ->  Index Scan using tenk1_unique2 on tenk1 t1  (cost=0.29..656.28 rows=101 width=244)\n         Filter: (unique1 < 100)\n   ->  Sort  (cost=197.83..200.33 rows=1000 width=244)\n         Sort Key: t2.unique2\n         ->  Seq Scan on onek t2  (cost=0.00..148.00 rows=1000 width=244)", "source": {"url": "/docs/10/using-explain.html#USING-EXPLAIN-BASICS", "path": "using-explain.html", "label": "PostgreSQL 10.23 \u00b7 using-explain", "sha256": "a4b4304aedb0a2da0145cc7c35b03b319a5c7ee3df35a8ef84ab6d3a610f98f3"}, "paragraphs": ["\u793a\u4f8b\u6458\u81ea PostgreSQL 10.23 \u624b\u518c\uff1b\u672c\u767e\u79d1\u672a\u5b9e\u9645\u6267\u884c\u6b64\u793a\u4f8b\u3002", "\u53e6\u4e00\u79cd\u53ef\u80fd\u7684\u8fde\u63a5\u65b9\u5f0f\u662f\u5f52\u5e76\u8fde\u63a5\uff0c\u5982\u4e0b\u6240\u793a\uff1a"]}, {"code": "SET enable_sort = off;\n\nEXPLAIN SELECT *\nFROM tenk1 t1, onek t2\nWHERE t1.unique1 < 100 AND t1.unique2 = t2.unique2;\n\n                                        QUERY PLAN\n------------------------------------------------------------------------------------------\n Merge Join  (cost=0.56..292.65 rows=10 width=488)\n   Merge Cond: (t1.unique2 = t2.unique2)\n   ->  Index Scan using tenk1_unique2 on tenk1 t1  (cost=0.29..656.28 rows=101 width=244)\n         Filter: (unique1 < 100)\n   ->  Index Scan using onek_unique2 on onek t2  (cost=0.28..224.79 rows=1000 width=244)", "source": {"url": "/docs/10/using-explain.html#USING-EXPLAIN-BASICS", "path": "using-explain.html", "label": "PostgreSQL 10.23 \u00b7 using-explain", "sha256": "a4b4304aedb0a2da0145cc7c35b03b319a5c7ee3df35a8ef84ab6d3a610f98f3"}, "paragraphs": ["\u793a\u4f8b\u6458\u81ea PostgreSQL 10.23 \u624b\u518c\uff1b\u672c\u767e\u79d1\u672a\u5b9e\u9645\u6267\u884c\u6b64\u793a\u4f8b\u3002", "\u89c2\u5bdf\u5907\u9009\u8ba1\u5212\u7684\u4e00\u79cd\u529e\u6cd5\uff0c\u662f\u4f7f\u7528\u7b2c 19.7.1 \u8282\u7684\u542f\u7528\uff0f\u7981\u7528\u6807\u5fd7\uff0c\u5f3a\u5236\u89c4\u5212\u5668\u5ffd\u7565\u5b83\u8ba4\u4e3a\u4ee3\u4ef7\u6700\u4f4e\u7684\u7b56\u7565\u3002\u8fd9\u79cd\u5de5\u5177\u8f83\u4e3a\u7c97\u7565\uff0c\u4f46\u5f88\u6709\u7528\uff0c\u53e6\u89c1\u7b2c 14.3 \u8282\u3002\u4f8b\u5982\uff0c\u5982\u679c\u4e0d\u786e\u5b9a\u524d\u4f8b\u4e2d\u5bf9 onek \u8868\u91c7\u7528\u987a\u5e8f\u626b\u63cf\u518d\u6392\u5e8f\u662f\u5426\u6700\u4f73\uff0c\u53ef\u4ee5\u5c1d\u8bd5\uff1a"]}]}, {"title": "\u6267\u884c\u5668\u5b9e\u73b0\u8bf4\u660e", "paragraphs": ["\u4f7f\u7528 tuplesort \u5bf9\u8282\u70b9\u5916\u4fa7\u5b50\u6811\u7684\u5143\u7ec4\u6392\u5e8f\uff0c\u5c06\u7ed3\u679c\u4fdd\u5b58\u5728\u4e34\u65f6\u6587\u4ef6\u6216\u5185\u5b58\u4e2d\u3002\u9996\u6b21\u8c03\u7528\u4e4b\u540e\uff0c\u6bcf\u6b21\u8c03\u7528\u90fd\u4ece\u6587\u4ef6\u8fd4\u56de\u4e00\u4e2a\u5143\u7ec4\u3002", "\u521d\u59cb\u72b6\u6001\uff1a\u5916\u4fa7\u5b50\u8282\u70b9\u5df2\u51c6\u5907\u597d\u8fd4\u56de\u7b2c\u4e00\u4e2a\u5143\u7ec4\u3002", "\u9996\u6b21\u6267\u884c\u65f6\uff0c\u4ece\u5916\u4fa7\u8ba1\u5212\u8bfb\u53d6\u5168\u90e8\u5143\u7ec4\u5e76\u4f20\u7ed9 tuplesort.c\uff1b\u540e\u7eed\u8c03\u7528\u53ea\u9700\u4ece tuplesort \u83b7\u53d6\u5143\u7ec4\u3002", "\u521b\u5efa\u5df2\u6392\u5e8f\u6570\u636e\u65f6\uff0c\u9700\u8981\u6cbf\u6b63\u5411\u626b\u63cf\u5b50\u8ba1\u5212\u3002", "\u4ece tuplesort \u83b7\u53d6\u7b2c\u4e00\u4e2a\u6216\u4e0b\u4e00\u4e2a\u5143\u7ec4\uff1b\u6ca1\u6709\u66f4\u591a\u5143\u7ec4\u65f6\u8fd4\u56de NULL\u3002\u6ce8\u610f\uff0c\u53ea\u4fdd\u8bc1\u69fd\u4e2d\u7684\u5143\u7ec4\u5728\u4e0b\u6b21\u4ece tuplesort \u83b7\u53d6\u5143\u7ec4\u4e4b\u524d\u6709\u6548\u3002"]}, {"code": "case T_Sort:\n\t\t\tpname = sname = \"Sort\";\n\t\t\tbreak;", "title": "\u6838\u5fc3\u6e90\u7801\u4e2d\u7684 EXPLAIN \u6807\u8bc6"}], "strategies": [], "description": ["\u6309\u8ba1\u5212\u6392\u5e8f\u952e\u5bf9\u5b50\u8ba1\u5212\u8f93\u51fa\u7684\u884c\u6392\u5e8f\u3002"], "localization": {"status": "complete", "sources": [], "language": "zh", "original_text": {"/versions/10/description/0": "Sorts rows from its child according to the plan sort keys.", "/versions/10/facts/0/label": "Core node tag", "/versions/10/facts/1/label": "Structured EXPLAIN Node Type", "/versions/10/facts/2/label": "Inputs", "/versions/10/facts/2/value": "One child plan", "/versions/10/facts/3/label": "Output", "/versions/10/facts/3/value": "Sorted tuples", "/versions/10/facts/4/label": "Executor initializer", "/versions/10/facts/5/label": "Memory mechanism", "/versions/10/tables/0/title": "EXPLAIN labels in this source build", "/versions/10/related/1/label": "Using EXPLAIN", "/versions/10/related/2/label": "Parallel plans", "/versions/10/sections/0/title": "EXPLAIN names and attributes", "/versions/10/sections/1/title": "Memory and temporary storage", "/versions/10/sections/2/title": "Parallel execution and instrumentation", "/versions/10/sections/3/title": "Same-version manual discussion", "/versions/10/sections/4/title": "Examples from this manual build", "/versions/10/sections/5/title": "Executor implementation notes", "/versions/10/sections/6/title": "EXPLAIN identity in core source", "/versions/10/memory/description": "The node passes work_mem to tuplesort. Sorting can use memory or temporary files; the actual method and space use depend on the input and plan.", "/versions/10/sections/0/paragraphs/0": "Structured formats use the Node Type above. Text-format spellings can also include operation, strategy, join type, scan direction or aggregation-stage attributes.", "/versions/10/sections/0/paragraphs/1": "Text names recorded by this source: Sort.", "/versions/10/sections/0/paragraphs/2": "Parallel-aware and parallel-safe are different plan properties. A node running inside a parallel worker is not necessarily a parallel-aware node.", "/versions/10/sections/1/paragraphs/0": "The node passes work_mem to tuplesort. Sorting can use memory or temporary files; the actual method and space use depend on the input and plan.", "/versions/10/sections/1/paragraphs/1": "Sorts tuples from the outer subtree of the node using tuplesort, which saves the results in a temporary file or memory. After the initial call, returns a tuple from the file with each call.", "/versions/10/sections/2/paragraphs/0": "The source callbacks below can coordinate execution or collect worker instrumentation. Their presence is not a blanket claim that this node supports a shared parallel scan or shared state.", "/versions/10/sections/2/paragraphs/1": "Callbacks in this build: none extracted from this node implementation.", "/versions/10/sections/3/paragraphs/0": "Estimated start-up cost. This is the time expended before the output phase can begin, e.g., time to do the sorting in a sort node.", "/versions/10/sections/3/paragraphs/1": "Merge join requires its input data to be sorted on the join keys. In this plan the tenk1 data is sorted by using an index scan to visit the rows in the correct order, but a sequential scan and sort is preferred for onek , because there are many more rows to be visited in that table. (Sequential-scan-and-sort frequently beats an index scan for sorting many rows, because of the nonsequential disk access required by the index scan.)", "/versions/10/sections/3/paragraphs/2": "One way to look at variant plans is to force the planner to disregard whatever strategy it thought was the cheapest, using the enable/disable flags described in Section 19.7.1 . (This is a crude tool, but useful. See also Section 14.3 .) For example, if we're unconvinced that sequential-scan-and-sort is the best way to deal with table onek in the previous example, we could try", "/versions/10/sections/3/paragraphs/3": "which shows that the planner thinks that sorting onek by index-scanning is about 12% more expensive than sequential-scan-and-sort. Of course, the next question is whether it's right about that. We can investigate that using EXPLAIN ANALYZE , as discussed below.", "/versions/10/sections/3/paragraphs/4": "In some cases EXPLAIN ANALYZE shows additional execution statistics beyond the plan node execution times and row counts. For example, Sort and Hash nodes provide extra information:", "/versions/10/sections/3/paragraphs/5": "The Sort node shows the sort method used (in particular, whether the sort was in-memory or on-disk) and the amount of memory or disk space needed. The Hash node shows the number of hash buckets and batches as well as the peak amount of memory used for the hash table. (If the number of batches exceeds one, there will also be disk space usage involved, but that is not shown.)", "/versions/10/sections/5/paragraphs/0": "Sorts tuples from the outer subtree of the node using tuplesort, which saves the results in a temporary file or memory. After the initial call, returns a tuple from the file with each call.", "/versions/10/sections/5/paragraphs/1": "Initial States: -- the outer child is prepared to return the first tuple.", "/versions/10/sections/5/paragraphs/2": "If first time through, read all tuples from outer plan and pass them to tuplesort.c. Subsequent calls just fetch tuples from tuplesort.", "/versions/10/sections/5/paragraphs/3": "Want to scan subplan in the forward direction while creating the sorted data.", "/versions/10/sections/5/paragraphs/4": "Get the first or next tuple from tuplesort. Returns NULL if no more tuples. Note that we only rely on slot tuple remaining valid until the next fetch from the tuplesort.", "/versions/10/tables/0/columns/0/label": "Text-format label", "/versions/10/tables/0/columns/1/label": "Structured node identity", "/versions/10/sections/4/blocks/0/paragraphs/0": "Example copied from the PostgreSQL 10.23 manual; it was not executed for this collection.", "/versions/10/sections/4/blocks/0/paragraphs/1": "Another possible type of join is a merge join, illustrated here:", "/versions/10/sections/4/blocks/1/paragraphs/0": "Example copied from the PostgreSQL 10.23 manual; it was not executed for this collection.", "/versions/10/sections/4/blocks/1/paragraphs/1": "One way to look at variant plans is to force the planner to disregard whatever strategy it thought was the cheapest, using the enable/disable flags described in Section 19.7.1 . (This is a crude tool, but useful. See also Section 14.3 .) For example, if we're unconvinced that sequential-scan-and-sort is the best way to deal with table onek in the previous example, we could try"}, "fallback_fields": [], "source_language": "en", "original_snapshot_sha256": "ef1962a7245821cb00aac897634d7d7e03099d0219f7805432d4c0d858ed1027"}, "evidence_kind": "source and documentation", "explain_names": ["Sort"], "partial_modes": [], "comparison_data": {"node_tag": "T_Sort", "strategies": [], "text_names": ["Sort"], "initializer": "ExecInitSort", "partial_modes": [], "memory_mechanism": "tuplesort", "parallel_callbacks": []}, "comparison_hash": "7eb0c019a667ecfcc429eb0fd43abab45d478f0ff7565169f544d2ddb223a1c9", "explain_prefixes": ["Parallel"], "runtime_verified": false, "source_inventory": {"explain": "src/backend/commands/explain.c", "executor": "src/backend/executor/execProcnode.c", "implementation": "src/backend/executor/nodeSort.c"}, "parallel_callbacks": []}, "11": {"facts": [{"label": "\u6838\u5fc3\u8282\u70b9\u6807\u7b7e", "value": "T_Sort"}, {"label": "\u7ed3\u6784\u5316 EXPLAIN \u8282\u70b9\u7c7b\u578b", "value": "Sort"}, {"label": "\u8f93\u5165", "value": "\u4e00\u4e2a\u5b50\u8ba1\u5212"}, {"label": "\u8f93\u51fa", "value": "\u5df2\u6392\u5e8f\u7684\u5143\u7ec4"}, {"label": "\u6267\u884c\u5668\u521d\u59cb\u5316\u51fd\u6570", "value": "ExecInitSort"}, {"label": "\u5185\u5b58\u673a\u5236", "value": "tuplesort"}], "memory": {"evidence": [{"url": "https://ftp.postgresql.org/pub/source/v11.22/postgresql-11.22.tar.bz2", "path": "src/backend/executor/nodeSort.c", "label": "src/backend/executor/nodeSort.c", "sha256": "990ba7400966286069ad3c4200f2513f23d90f90573fa6e72db5c2508775719f", "archive_sha256": "2cb7c97d7a0d7278851bbc9c61f467b69c094c72b81740b751108e7892ebe1f0"}, {"url": "https://ftp.postgresql.org/pub/source/v11.22/postgresql-11.22.tar.bz2", "path": "src/backend/utils/sort/tuplesort.c", "label": "src/backend/utils/sort/tuplesort.c", "sha256": "aa78b9b3a286dd0edd73228f6f95a55506d891c8dabc58c22f1f904386249664", "archive_sha256": "2cb7c97d7a0d7278851bbc9c61f467b69c094c72b81740b751108e7892ebe1f0"}], "mechanism": "tuplesort", "description": "\u6b64\u8282\u70b9\u5c06 work_mem \u4f20\u7ed9 tuplesort\u3002\u6392\u5e8f\u53ef\u4f7f\u7528\u5185\u5b58\u6216\u4e34\u65f6\u6587\u4ef6\uff1b\u5b9e\u9645\u65b9\u6cd5\u548c\u7a7a\u95f4\u7528\u91cf\u53d6\u51b3\u4e8e\u8f93\u5165\u53ca\u8ba1\u5212\u3002", "source_notes": ["Sorts tuples from the outer subtree of the node using tuplesort, which saves the results in a temporary file or memory. After the initial call, returns a tuple from the file with each call."]}, "tables": [{"key": "explain-labels", "rows": [{"label": "Sort", "identity": "Sort"}], "title": "\u672c\u6784\u5efa\u4e2d\u7684 EXPLAIN \u6807\u7b7e", "columns": [{"key": "label", "label": "\u6587\u672c\u683c\u5f0f\u6807\u7b7e"}, {"key": "identity", "label": "\u7ed3\u6784\u5316\u8282\u70b9\u6807\u8bc6"}]}], "related": [{"url": "/wiki/sql/explain/?v=11", "label": "EXPLAIN"}, {"url": "/docs/11/using-explain.html", "label": "\u4f7f\u7528 EXPLAIN"}, {"url": "/docs/11/parallel-plans.html", "label": "\u5e76\u884c\u8ba1\u5212"}, {"url": "/wiki/guc/enable_sort/?v=11", "label": "enable_sort"}, {"url": "/wiki/guc/work_mem/?v=11", "label": "work_mem"}], "release": {"ref": "PostgreSQL 11.22 source archive", "label": "11.22", "major": "11", "channel": "historical", "revision": "2cb7c97d7a0d7278851bbc9c61f467b69c094c72b81740b751108e7892ebe1f0", "source_url": "https://ftp.postgresql.org/pub/source/v11.22/postgresql-11.22.tar.bz2", "source_snapshot_utc": ""}, "sources": [{"url": "https://ftp.postgresql.org/pub/source/v11.22/postgresql-11.22.tar.bz2", "line": 1141, "path": "src/backend/commands/explain.c", "label": "src/backend/commands/explain.c:1141", "sha256": "9df8400c1a4377179572ceb916d6020fca4e2760f74bf416d77ed97476523bbd", "archive_sha256": "2cb7c97d7a0d7278851bbc9c61f467b69c094c72b81740b751108e7892ebe1f0"}, {"url": "https://ftp.postgresql.org/pub/source/v11.22/postgresql-11.22.tar.bz2", "line": 313, "path": "src/backend/executor/execProcnode.c", "label": "src/backend/executor/execProcnode.c:313", "sha256": "95ef4d4a5df4c29f14af9763fae2c530449bdacdf3853d9ff297adf1fed6153b", "archive_sha256": "2cb7c97d7a0d7278851bbc9c61f467b69c094c72b81740b751108e7892ebe1f0"}, {"url": "https://ftp.postgresql.org/pub/source/v11.22/postgresql-11.22.tar.bz2", "path": "src/backend/executor/nodeSort.c", "label": "src/backend/executor/nodeSort.c", "sha256": "990ba7400966286069ad3c4200f2513f23d90f90573fa6e72db5c2508775719f", "archive_sha256": "2cb7c97d7a0d7278851bbc9c61f467b69c094c72b81740b751108e7892ebe1f0"}, {"url": "https://ftp.postgresql.org/pub/source/v11.22/postgresql-11.22.tar.bz2", "path": "src/include/nodes/plannodes.h", "label": "src/include/nodes/plannodes.h", "sha256": "5e0511194183800e8d6eb293fd4b40639c7d3118e2d199c8e7865ba4fa4cf67f", "archive_sha256": "2cb7c97d7a0d7278851bbc9c61f467b69c094c72b81740b751108e7892ebe1f0"}, {"url": "https://ftp.postgresql.org/pub/source/v11.22/postgresql-11.22.tar.bz2", "path": "src/backend/utils/sort/tuplesort.c", "label": "src/backend/utils/sort/tuplesort.c", "sha256": "aa78b9b3a286dd0edd73228f6f95a55506d891c8dabc58c22f1f904386249664", "archive_sha256": "2cb7c97d7a0d7278851bbc9c61f467b69c094c72b81740b751108e7892ebe1f0"}, {"url": "https://pg.center/docs/11/using-explain.html#USING-EXPLAIN-BASICS", "path": "using-explain.html", "label": "PostgreSQL 11.22 \u00b7 using-explain", "sha256": "8411bc78085d4737e32d7cca103d859da6c6539e33ec5e2fba46e74c6f199d8a", "language": "en", "original_url": "/docs/11/using-explain.html#USING-EXPLAIN-BASICS"}, {"url": "https://pg.center/docs/11/using-explain.html#USING-EXPLAIN-ANALYZE", "path": "using-explain.html", "label": "PostgreSQL 11.22 \u00b7 using-explain", "sha256": "8411bc78085d4737e32d7cca103d859da6c6539e33ec5e2fba46e74c6f199d8a", "language": "en", "original_url": "/docs/11/using-explain.html#USING-EXPLAIN-ANALYZE"}], "node_tag": "T_Sort", "sections": [{"title": "EXPLAIN \u540d\u79f0\u4e0e\u5c5e\u6027", "paragraphs": ["\u7ed3\u6784\u5316\u683c\u5f0f\u4f7f\u7528\u4e0a\u8ff0 Node Type\u3002\u6587\u672c\u683c\u5f0f\u540d\u79f0\u8fd8\u53ef\u80fd\u5305\u542b\u64cd\u4f5c\u3001\u7b56\u7565\u3001\u8fde\u63a5\u7c7b\u578b\u3001\u626b\u63cf\u65b9\u5411\u6216\u805a\u5408\u9636\u6bb5\u5c5e\u6027\u3002", "\u6b64\u6e90\u7801\u8bb0\u5f55\u7684\u6587\u672c\u540d\u79f0\uff1aSort.", "\u5e76\u884c\u611f\u77e5\u4e0e\u5e76\u884c\u5b89\u5168\u662f\u4e0d\u540c\u7684\u8ba1\u5212\u5c5e\u6027\u3002\u5728\u5e76\u884c\u5de5\u4f5c\u8fdb\u7a0b\u5185\u8fd0\u884c\u7684\u8282\u70b9\u4e0d\u4e00\u5b9a\u662f\u5e76\u884c\u611f\u77e5\u8282\u70b9\u3002"]}, {"title": "\u5185\u5b58\u4e0e\u4e34\u65f6\u5b58\u50a8", "paragraphs": ["\u6b64\u8282\u70b9\u5c06 work_mem \u4f20\u7ed9 tuplesort\u3002\u6392\u5e8f\u53ef\u4f7f\u7528\u5185\u5b58\u6216\u4e34\u65f6\u6587\u4ef6\uff1b\u5b9e\u9645\u65b9\u6cd5\u548c\u7a7a\u95f4\u7528\u91cf\u53d6\u51b3\u4e8e\u8f93\u5165\u53ca\u8ba1\u5212\u3002", "\u4f7f\u7528 tuplesort \u5bf9\u8282\u70b9\u5916\u4fa7\u5b50\u6811\u7684\u5143\u7ec4\u6392\u5e8f\uff0c\u5c06\u7ed3\u679c\u4fdd\u5b58\u5728\u4e34\u65f6\u6587\u4ef6\u6216\u5185\u5b58\u4e2d\u3002\u9996\u6b21\u8c03\u7528\u4e4b\u540e\uff0c\u6bcf\u6b21\u8c03\u7528\u90fd\u4ece\u6587\u4ef6\u8fd4\u56de\u4e00\u4e2a\u5143\u7ec4\u3002"]}, {"title": "\u5e76\u884c\u6267\u884c\u4e0e\u8fd0\u884c\u4fe1\u606f\u91c7\u96c6", "paragraphs": ["\u4ee5\u4e0b\u6e90\u7801\u56de\u8c03\u53ef\u4ee5\u534f\u8c03\u6267\u884c\u6216\u6536\u96c6\u5de5\u4f5c\u8fdb\u7a0b\u7684\u6d4b\u91cf\u6570\u636e\u3002\u56de\u8c03\u5b58\u5728\u4e0d\u4ee3\u8868\u8be5\u8282\u70b9\u666e\u904d\u652f\u6301\u5171\u4eab\u5e76\u884c\u626b\u63cf\u6216\u5171\u4eab\u72b6\u6001\u3002", "\u6b64\u6784\u5efa\u7684\u56de\u8c03\uff1aExecSortEstimate, ExecSortInitializeDSM, ExecSortInitializeWorker, ExecSortRetrieveInstrumentation."]}, {"title": "\u540c\u7248\u672c\u624b\u518c\u8bf4\u660e", "paragraphs": ["\u4f30\u8ba1\u542f\u52a8\u4ee3\u4ef7\uff1a\u8f93\u51fa\u9636\u6bb5\u5f00\u59cb\u4e4b\u524d\u6d88\u8017\u7684\u65f6\u95f4\uff0c\u4f8b\u5982\u6392\u5e8f\u8282\u70b9\u6267\u884c\u6392\u5e8f\u6240\u9700\u7684\u65f6\u95f4\u3002", "\u5f52\u5e76\u8fde\u63a5\u8981\u6c42\u8f93\u5165\u6309\u8fde\u63a5\u952e\u6392\u5e8f\u3002\u6b64\u8ba1\u5212\u901a\u8fc7\u7d22\u5f15\u626b\u63cf\u6309\u987a\u5e8f\u8bfb\u53d6 tenk1\uff1b\u5bf9\u4e8e onek\uff0c\u5219\u503e\u5411\u4e8e\u987a\u5e8f\u626b\u63cf\u540e\u6392\u5e8f\uff0c\u56e0\u4e3a\u8be5\u8868\u8981\u8bbf\u95ee\u7684\u884c\u66f4\u591a\u3002\uff08\u5bf9\u5927\u91cf\u884c\u6392\u5e8f\u65f6\uff0c\u987a\u5e8f\u626b\u63cf\u52a0\u6392\u5e8f\u5e38\u5e38\u4f18\u4e8e\u7d22\u5f15\u626b\u63cf\uff0c\u56e0\u4e3a\u540e\u8005\u9700\u8981\u975e\u987a\u5e8f\u78c1\u76d8\u8bbf\u95ee\u3002\uff09", "\u89c2\u5bdf\u5907\u9009\u8ba1\u5212\u7684\u4e00\u79cd\u529e\u6cd5\uff0c\u662f\u4f7f\u7528\u7b2c 19.7.1 \u8282\u7684\u542f\u7528\uff0f\u7981\u7528\u6807\u5fd7\uff0c\u5f3a\u5236\u89c4\u5212\u5668\u5ffd\u7565\u5b83\u8ba4\u4e3a\u4ee3\u4ef7\u6700\u4f4e\u7684\u7b56\u7565\u3002\u8fd9\u79cd\u5de5\u5177\u8f83\u4e3a\u7c97\u7565\uff0c\u4f46\u5f88\u6709\u7528\uff0c\u53e6\u89c1\u7b2c 14.3 \u8282\u3002\u4f8b\u5982\uff0c\u5982\u679c\u4e0d\u786e\u5b9a\u524d\u4f8b\u4e2d\u5bf9 onek \u8868\u91c7\u7528\u987a\u5e8f\u626b\u63cf\u518d\u6392\u5e8f\u662f\u5426\u6700\u4f73\uff0c\u53ef\u4ee5\u5c1d\u8bd5\uff1a", "\u8fd9\u8bf4\u660e\u89c4\u5212\u5668\u8ba4\u4e3a\u901a\u8fc7\u7d22\u5f15\u626b\u63cf\u5bf9 onek \u6392\u5e8f\u7684\u6210\u672c\u6bd4\u987a\u5e8f\u626b\u63cf\u52a0\u6392\u5e8f\u9ad8\u7ea6 12%\u3002\u63a5\u4e0b\u6765\u5f53\u7136\u8981\u786e\u8ba4\u5b83\u5224\u65ad\u662f\u5426\u6b63\u786e\uff1b\u53ef\u4f7f\u7528\u4e0b\u6587\u4ecb\u7ecd\u7684 EXPLAIN ANALYZE \u6765\u9a8c\u8bc1\u3002", "\u5728\u67d0\u4e9b\u60c5\u51b5\u4e0b\uff0cEXPLAIN ANALYZE \u9664\u4e86\u8ba1\u5212\u8282\u70b9\u7684\u6267\u884c\u65f6\u95f4\u548c\u884c\u6570\u4e4b\u5916\uff0c\u8fd8\u4f1a\u663e\u793a\u989d\u5916\u7684\u6267\u884c\u7edf\u8ba1\u4fe1\u606f\u3002\u4f8b\u5982\uff0cSort \u548c Hash \u8282\u70b9\u4f1a\u63d0\u4f9b\u66f4\u591a\u4fe1\u606f\uff1a", "Sort \u8282\u70b9\u663e\u793a\u6392\u5e8f\u65b9\u6cd5\uff08\u5c24\u5176\u662f\u5185\u5b58\u6392\u5e8f\u8fd8\u662f\u78c1\u76d8\u6392\u5e8f\uff09\u53ca\u6240\u9700\u5185\u5b58\u6216\u78c1\u76d8\u7a7a\u95f4\u3002Hash \u8282\u70b9\u663e\u793a\u54c8\u5e0c\u6876\u6570\u3001\u6279\u6b21\u6570\u53ca\u54c8\u5e0c\u8868\u5185\u5b58\u4f7f\u7528\u5cf0\u503c\u3002\uff08\u6279\u6b21\u6570\u8d85\u8fc7\u4e00\u65f6\u4e5f\u4f1a\u4f7f\u7528\u78c1\u76d8\u7a7a\u95f4\uff0c\u4f46\u6b64\u5904\u4e0d\u663e\u793a\u3002\uff09"]}, {"title": "\u672c\u7248\u624b\u518c\u4e2d\u7684\u793a\u4f8b", "blocks": [{"code": "EXPLAIN SELECT *\nFROM tenk1 t1, onek t2\nWHERE t1.unique1 < 100 AND t1.unique2 = t2.unique2;\n\n                                        QUERY PLAN\n------------------------------------------------------------------------------------------\n Merge Join  (cost=198.11..268.19 rows=10 width=488)\n   Merge Cond: (t1.unique2 = t2.unique2)\n   ->  Index Scan using tenk1_unique2 on tenk1 t1  (cost=0.29..656.28 rows=101 width=244)\n         Filter: (unique1 < 100)\n   ->  Sort  (cost=197.83..200.33 rows=1000 width=244)\n         Sort Key: t2.unique2\n         ->  Seq Scan on onek t2  (cost=0.00..148.00 rows=1000 width=244)", "source": {"url": "/docs/11/using-explain.html#USING-EXPLAIN-BASICS", "path": "using-explain.html", "label": "PostgreSQL 11.22 \u00b7 using-explain", "sha256": "8411bc78085d4737e32d7cca103d859da6c6539e33ec5e2fba46e74c6f199d8a"}, "paragraphs": ["\u793a\u4f8b\u6458\u81ea PostgreSQL 11.22 \u624b\u518c\uff1b\u672c\u767e\u79d1\u672a\u5b9e\u9645\u6267\u884c\u6b64\u793a\u4f8b\u3002", "\u53e6\u4e00\u79cd\u53ef\u80fd\u7684\u8fde\u63a5\u65b9\u5f0f\u662f\u5f52\u5e76\u8fde\u63a5\uff0c\u5982\u4e0b\u6240\u793a\uff1a"]}, {"code": "SET enable_sort = off;\n\nEXPLAIN SELECT *\nFROM tenk1 t1, onek t2\nWHERE t1.unique1 < 100 AND t1.unique2 = t2.unique2;\n\n                                        QUERY PLAN\n------------------------------------------------------------------------------------------\n Merge Join  (cost=0.56..292.65 rows=10 width=488)\n   Merge Cond: (t1.unique2 = t2.unique2)\n   ->  Index Scan using tenk1_unique2 on tenk1 t1  (cost=0.29..656.28 rows=101 width=244)\n         Filter: (unique1 < 100)\n   ->  Index Scan using onek_unique2 on onek t2  (cost=0.28..224.79 rows=1000 width=244)", "source": {"url": "/docs/11/using-explain.html#USING-EXPLAIN-BASICS", "path": "using-explain.html", "label": "PostgreSQL 11.22 \u00b7 using-explain", "sha256": "8411bc78085d4737e32d7cca103d859da6c6539e33ec5e2fba46e74c6f199d8a"}, "paragraphs": ["\u793a\u4f8b\u6458\u81ea PostgreSQL 11.22 \u624b\u518c\uff1b\u672c\u767e\u79d1\u672a\u5b9e\u9645\u6267\u884c\u6b64\u793a\u4f8b\u3002", "\u89c2\u5bdf\u5907\u9009\u8ba1\u5212\u7684\u4e00\u79cd\u529e\u6cd5\uff0c\u662f\u4f7f\u7528\u7b2c 19.7.1 \u8282\u7684\u542f\u7528\uff0f\u7981\u7528\u6807\u5fd7\uff0c\u5f3a\u5236\u89c4\u5212\u5668\u5ffd\u7565\u5b83\u8ba4\u4e3a\u4ee3\u4ef7\u6700\u4f4e\u7684\u7b56\u7565\u3002\u8fd9\u79cd\u5de5\u5177\u8f83\u4e3a\u7c97\u7565\uff0c\u4f46\u5f88\u6709\u7528\uff0c\u53e6\u89c1\u7b2c 14.3 \u8282\u3002\u4f8b\u5982\uff0c\u5982\u679c\u4e0d\u786e\u5b9a\u524d\u4f8b\u4e2d\u5bf9 onek \u8868\u91c7\u7528\u987a\u5e8f\u626b\u63cf\u518d\u6392\u5e8f\u662f\u5426\u6700\u4f73\uff0c\u53ef\u4ee5\u5c1d\u8bd5\uff1a"]}]}, {"title": "\u6267\u884c\u5668\u5b9e\u73b0\u8bf4\u660e", "paragraphs": ["\u4f7f\u7528 tuplesort \u5bf9\u8282\u70b9\u5916\u4fa7\u5b50\u6811\u7684\u5143\u7ec4\u6392\u5e8f\uff0c\u5c06\u7ed3\u679c\u4fdd\u5b58\u5728\u4e34\u65f6\u6587\u4ef6\u6216\u5185\u5b58\u4e2d\u3002\u9996\u6b21\u8c03\u7528\u4e4b\u540e\uff0c\u6bcf\u6b21\u8c03\u7528\u90fd\u4ece\u6587\u4ef6\u8fd4\u56de\u4e00\u4e2a\u5143\u7ec4\u3002", "\u521d\u59cb\u72b6\u6001\uff1a\u5916\u4fa7\u5b50\u8282\u70b9\u5df2\u51c6\u5907\u597d\u8fd4\u56de\u7b2c\u4e00\u4e2a\u5143\u7ec4\u3002", "\u9996\u6b21\u6267\u884c\u65f6\uff0c\u4ece\u5916\u4fa7\u8ba1\u5212\u8bfb\u53d6\u5168\u90e8\u5143\u7ec4\u5e76\u4f20\u7ed9 tuplesort.c\uff1b\u540e\u7eed\u8c03\u7528\u53ea\u9700\u4ece tuplesort \u83b7\u53d6\u5143\u7ec4\u3002", "\u521b\u5efa\u5df2\u6392\u5e8f\u6570\u636e\u65f6\uff0c\u9700\u8981\u6cbf\u6b63\u5411\u626b\u63cf\u5b50\u8ba1\u5212\u3002", "\u4ece tuplesort \u83b7\u53d6\u7b2c\u4e00\u4e2a\u6216\u4e0b\u4e00\u4e2a\u5143\u7ec4\uff1b\u6ca1\u6709\u66f4\u591a\u5143\u7ec4\u65f6\u8fd4\u56de NULL\u3002\u6ce8\u610f\uff0c\u53ea\u4fdd\u8bc1\u69fd\u4e2d\u7684\u5143\u7ec4\u5728\u4e0b\u6b21\u4ece tuplesort \u83b7\u53d6\u5143\u7ec4\u4e4b\u524d\u6709\u6548\u3002"]}, {"code": "case T_Sort:\n\t\t\tpname = sname = \"Sort\";\n\t\t\tbreak;", "title": "\u6838\u5fc3\u6e90\u7801\u4e2d\u7684 EXPLAIN \u6807\u8bc6"}], "strategies": [], "description": ["\u6309\u8ba1\u5212\u6392\u5e8f\u952e\u5bf9\u5b50\u8ba1\u5212\u8f93\u51fa\u7684\u884c\u6392\u5e8f\u3002"], "localization": {"status": "complete", "sources": [], "language": "zh", "original_text": {"/versions/11/description/0": "Sorts rows from its child according to the plan sort keys.", "/versions/11/facts/0/label": "Core node tag", "/versions/11/facts/1/label": "Structured EXPLAIN Node Type", "/versions/11/facts/2/label": "Inputs", "/versions/11/facts/2/value": "One child plan", "/versions/11/facts/3/label": "Output", "/versions/11/facts/3/value": "Sorted tuples", "/versions/11/facts/4/label": "Executor initializer", "/versions/11/facts/5/label": "Memory mechanism", "/versions/11/tables/0/title": "EXPLAIN labels in this source build", "/versions/11/related/1/label": "Using EXPLAIN", "/versions/11/related/2/label": "Parallel plans", "/versions/11/sections/0/title": "EXPLAIN names and attributes", "/versions/11/sections/1/title": "Memory and temporary storage", "/versions/11/sections/2/title": "Parallel execution and instrumentation", "/versions/11/sections/3/title": "Same-version manual discussion", "/versions/11/sections/4/title": "Examples from this manual build", "/versions/11/sections/5/title": "Executor implementation notes", "/versions/11/sections/6/title": "EXPLAIN identity in core source", "/versions/11/memory/description": "The node passes work_mem to tuplesort. Sorting can use memory or temporary files; the actual method and space use depend on the input and plan.", "/versions/11/sections/0/paragraphs/0": "Structured formats use the Node Type above. Text-format spellings can also include operation, strategy, join type, scan direction or aggregation-stage attributes.", "/versions/11/sections/0/paragraphs/1": "Text names recorded by this source: Sort.", "/versions/11/sections/0/paragraphs/2": "Parallel-aware and parallel-safe are different plan properties. A node running inside a parallel worker is not necessarily a parallel-aware node.", "/versions/11/sections/1/paragraphs/0": "The node passes work_mem to tuplesort. Sorting can use memory or temporary files; the actual method and space use depend on the input and plan.", "/versions/11/sections/1/paragraphs/1": "Sorts tuples from the outer subtree of the node using tuplesort, which saves the results in a temporary file or memory. After the initial call, returns a tuple from the file with each call.", "/versions/11/sections/2/paragraphs/0": "The source callbacks below can coordinate execution or collect worker instrumentation. Their presence is not a blanket claim that this node supports a shared parallel scan or shared state.", "/versions/11/sections/2/paragraphs/1": "Callbacks in this build: ExecSortEstimate, ExecSortInitializeDSM, ExecSortInitializeWorker, ExecSortRetrieveInstrumentation.", "/versions/11/sections/3/paragraphs/0": "Estimated start-up cost. This is the time expended before the output phase can begin, e.g., time to do the sorting in a sort node.", "/versions/11/sections/3/paragraphs/1": "Merge join requires its input data to be sorted on the join keys. In this plan the tenk1 data is sorted by using an index scan to visit the rows in the correct order, but a sequential scan and sort is preferred for onek , because there are many more rows to be visited in that table. (Sequential-scan-and-sort frequently beats an index scan for sorting many rows, because of the nonsequential disk access required by the index scan.)", "/versions/11/sections/3/paragraphs/2": "One way to look at variant plans is to force the planner to disregard whatever strategy it thought was the cheapest, using the enable/disable flags described in Section 19.7.1 . (This is a crude tool, but useful. See also Section 14.3 .) For example, if we're unconvinced that sequential-scan-and-sort is the best way to deal with table onek in the previous example, we could try", "/versions/11/sections/3/paragraphs/3": "which shows that the planner thinks that sorting onek by index-scanning is about 12% more expensive than sequential-scan-and-sort. Of course, the next question is whether it's right about that. We can investigate that using EXPLAIN ANALYZE , as discussed below.", "/versions/11/sections/3/paragraphs/4": "In some cases EXPLAIN ANALYZE shows additional execution statistics beyond the plan node execution times and row counts. For example, Sort and Hash nodes provide extra information:", "/versions/11/sections/3/paragraphs/5": "The Sort node shows the sort method used (in particular, whether the sort was in-memory or on-disk) and the amount of memory or disk space needed. The Hash node shows the number of hash buckets and batches as well as the peak amount of memory used for the hash table. (If the number of batches exceeds one, there will also be disk space usage involved, but that is not shown.)", "/versions/11/sections/5/paragraphs/0": "Sorts tuples from the outer subtree of the node using tuplesort, which saves the results in a temporary file or memory. After the initial call, returns a tuple from the file with each call.", "/versions/11/sections/5/paragraphs/1": "Initial States: -- the outer child is prepared to return the first tuple.", "/versions/11/sections/5/paragraphs/2": "If first time through, read all tuples from outer plan and pass them to tuplesort.c. Subsequent calls just fetch tuples from tuplesort.", "/versions/11/sections/5/paragraphs/3": "Want to scan subplan in the forward direction while creating the sorted data.", "/versions/11/sections/5/paragraphs/4": "Get the first or next tuple from tuplesort. Returns NULL if no more tuples. Note that we only rely on slot tuple remaining valid until the next fetch from the tuplesort.", "/versions/11/tables/0/columns/0/label": "Text-format label", "/versions/11/tables/0/columns/1/label": "Structured node identity", "/versions/11/sections/4/blocks/0/paragraphs/0": "Example copied from the PostgreSQL 11.22 manual; it was not executed for this collection.", "/versions/11/sections/4/blocks/0/paragraphs/1": "Another possible type of join is a merge join, illustrated here:", "/versions/11/sections/4/blocks/1/paragraphs/0": "Example copied from the PostgreSQL 11.22 manual; it was not executed for this collection.", "/versions/11/sections/4/blocks/1/paragraphs/1": "One way to look at variant plans is to force the planner to disregard whatever strategy it thought was the cheapest, using the enable/disable flags described in Section 19.7.1 . (This is a crude tool, but useful. See also Section 14.3 .) For example, if we're unconvinced that sequential-scan-and-sort is the best way to deal with table onek in the previous example, we could try"}, "fallback_fields": [], "source_language": "en", "original_snapshot_sha256": "dbdd8be488248782ab115fbb41828f2943e29fd4b3bcf3996d88face74c09e8b"}, "evidence_kind": "source and documentation", "explain_names": ["Sort"], "partial_modes": [], "comparison_data": {"node_tag": "T_Sort", "strategies": [], "text_names": ["Sort"], "initializer": "ExecInitSort", "partial_modes": [], "memory_mechanism": "tuplesort", "parallel_callbacks": ["ExecSortEstimate", "ExecSortInitializeDSM", "ExecSortInitializeWorker", "ExecSortRetrieveInstrumentation"]}, "comparison_hash": "32a824f93669794b01449d5d8a08ff4edcb6024cb1a897131b35fe5cddc2e4da", "explain_prefixes": ["Parallel"], "runtime_verified": false, "source_inventory": {"explain": "src/backend/commands/explain.c", "executor": "src/backend/executor/execProcnode.c", "implementation": "src/backend/executor/nodeSort.c"}, "parallel_callbacks": ["ExecSortEstimate", "ExecSortInitializeDSM", "ExecSortInitializeWorker", "ExecSortRetrieveInstrumentation"]}, "12": {"facts": [{"label": "\u6838\u5fc3\u8282\u70b9\u6807\u7b7e", "value": "T_Sort"}, {"label": "\u7ed3\u6784\u5316 EXPLAIN \u8282\u70b9\u7c7b\u578b", "value": "Sort"}, {"label": "\u8f93\u5165", "value": "\u4e00\u4e2a\u5b50\u8ba1\u5212"}, {"label": "\u8f93\u51fa", "value": "\u5df2\u6392\u5e8f\u7684\u5143\u7ec4"}, {"label": "\u6267\u884c\u5668\u521d\u59cb\u5316\u51fd\u6570", "value": "ExecInitSort"}, {"label": "\u5185\u5b58\u673a\u5236", "value": "tuplesort"}], "memory": {"evidence": [{"url": "https://ftp.postgresql.org/pub/source/v12.22/postgresql-12.22.tar.bz2", "path": "src/backend/executor/nodeSort.c", "label": "src/backend/executor/nodeSort.c", "sha256": "468afac438340e044264dc72cf01dff47ff31318d5deffd93ef1523287bd2b27", "archive_sha256": "8df3c0474782589d3c6f374b5133b1bd14d168086edbc13c6e72e67dd4527a3b"}, {"url": "https://ftp.postgresql.org/pub/source/v12.22/postgresql-12.22.tar.bz2", "path": "src/backend/utils/sort/tuplesort.c", "label": "src/backend/utils/sort/tuplesort.c", "sha256": "2e715f849c79808a74d021f1bb1b8373c08a463057c9ae64c1130227a4fe68ae", "archive_sha256": "8df3c0474782589d3c6f374b5133b1bd14d168086edbc13c6e72e67dd4527a3b"}], "mechanism": "tuplesort", "description": "\u6b64\u8282\u70b9\u5c06 work_mem \u4f20\u7ed9 tuplesort\u3002\u6392\u5e8f\u53ef\u4f7f\u7528\u5185\u5b58\u6216\u4e34\u65f6\u6587\u4ef6\uff1b\u5b9e\u9645\u65b9\u6cd5\u548c\u7a7a\u95f4\u7528\u91cf\u53d6\u51b3\u4e8e\u8f93\u5165\u53ca\u8ba1\u5212\u3002", "source_notes": ["Sorts tuples from the outer subtree of the node using tuplesort, which saves the results in a temporary file or memory. After the initial call, returns a tuple from the file with each call."]}, "tables": [{"key": "explain-labels", "rows": [{"label": "Sort", "identity": "Sort"}], "title": "\u672c\u6784\u5efa\u4e2d\u7684 EXPLAIN \u6807\u7b7e", "columns": [{"key": "label", "label": "\u6587\u672c\u683c\u5f0f\u6807\u7b7e"}, {"key": "identity", "label": "\u7ed3\u6784\u5316\u8282\u70b9\u6807\u8bc6"}]}], "related": [{"url": "/wiki/sql/explain/?v=12", "label": "EXPLAIN"}, {"url": "/docs/12/using-explain.html", "label": "\u4f7f\u7528 EXPLAIN"}, {"url": "/docs/12/parallel-plans.html", "label": "\u5e76\u884c\u8ba1\u5212"}, {"url": "/wiki/guc/enable_sort/?v=12", "label": "enable_sort"}, {"url": "/wiki/guc/work_mem/?v=12", "label": "work_mem"}], "release": {"ref": "PostgreSQL 12.22 source archive", "label": "12.22", "major": "12", "channel": "historical", "revision": "8df3c0474782589d3c6f374b5133b1bd14d168086edbc13c6e72e67dd4527a3b", "source_url": "https://ftp.postgresql.org/pub/source/v12.22/postgresql-12.22.tar.bz2", "source_snapshot_utc": ""}, "sources": [{"url": "https://ftp.postgresql.org/pub/source/v12.22/postgresql-12.22.tar.bz2", "line": 1212, "path": "src/backend/commands/explain.c", "label": "src/backend/commands/explain.c:1212", "sha256": "d02ea84fdaa201de5d9360645a9f24bfbd2c31f7d45a639e09560ac0e6b6471d", "archive_sha256": "8df3c0474782589d3c6f374b5133b1bd14d168086edbc13c6e72e67dd4527a3b"}, {"url": "https://ftp.postgresql.org/pub/source/v12.22/postgresql-12.22.tar.bz2", "line": 313, "path": "src/backend/executor/execProcnode.c", "label": "src/backend/executor/execProcnode.c:313", "sha256": "311b17379fe54e3f342fe5ad41c43afbdfa1b844978db2bb2eb22b82520d3256", "archive_sha256": "8df3c0474782589d3c6f374b5133b1bd14d168086edbc13c6e72e67dd4527a3b"}, {"url": "https://ftp.postgresql.org/pub/source/v12.22/postgresql-12.22.tar.bz2", "path": "src/backend/executor/nodeSort.c", "label": "src/backend/executor/nodeSort.c", "sha256": "468afac438340e044264dc72cf01dff47ff31318d5deffd93ef1523287bd2b27", "archive_sha256": "8df3c0474782589d3c6f374b5133b1bd14d168086edbc13c6e72e67dd4527a3b"}, {"url": "https://ftp.postgresql.org/pub/source/v12.22/postgresql-12.22.tar.bz2", "path": "src/include/nodes/plannodes.h", "label": "src/include/nodes/plannodes.h", "sha256": "b0c4a0aeb48660ce06e5e700d5529ca9066fd16682bd15783d6e71b5420b07b0", "archive_sha256": "8df3c0474782589d3c6f374b5133b1bd14d168086edbc13c6e72e67dd4527a3b"}, {"url": "https://ftp.postgresql.org/pub/source/v12.22/postgresql-12.22.tar.bz2", "path": "src/backend/utils/sort/tuplesort.c", "label": "src/backend/utils/sort/tuplesort.c", "sha256": "2e715f849c79808a74d021f1bb1b8373c08a463057c9ae64c1130227a4fe68ae", "archive_sha256": "8df3c0474782589d3c6f374b5133b1bd14d168086edbc13c6e72e67dd4527a3b"}, {"url": "https://pg.center/docs/12/using-explain.html#USING-EXPLAIN-BASICS", "path": "using-explain.html", "label": "PostgreSQL 12.22 \u00b7 using-explain", "sha256": "06297525f2180b07e752837a3351be9c871b56559f535bcd0a67dec9baac10c0", "language": "en", "original_url": "/docs/12/using-explain.html#USING-EXPLAIN-BASICS"}, {"url": "https://pg.center/docs/12/using-explain.html#USING-EXPLAIN-ANALYZE", "path": "using-explain.html", "label": "PostgreSQL 12.22 \u00b7 using-explain", "sha256": "06297525f2180b07e752837a3351be9c871b56559f535bcd0a67dec9baac10c0", "language": "en", "original_url": "/docs/12/using-explain.html#USING-EXPLAIN-ANALYZE"}], "node_tag": "T_Sort", "sections": [{"title": "EXPLAIN \u540d\u79f0\u4e0e\u5c5e\u6027", "paragraphs": ["\u7ed3\u6784\u5316\u683c\u5f0f\u4f7f\u7528\u4e0a\u8ff0 Node Type\u3002\u6587\u672c\u683c\u5f0f\u540d\u79f0\u8fd8\u53ef\u80fd\u5305\u542b\u64cd\u4f5c\u3001\u7b56\u7565\u3001\u8fde\u63a5\u7c7b\u578b\u3001\u626b\u63cf\u65b9\u5411\u6216\u805a\u5408\u9636\u6bb5\u5c5e\u6027\u3002", "\u6b64\u6e90\u7801\u8bb0\u5f55\u7684\u6587\u672c\u540d\u79f0\uff1aSort.", "\u5e76\u884c\u611f\u77e5\u4e0e\u5e76\u884c\u5b89\u5168\u662f\u4e0d\u540c\u7684\u8ba1\u5212\u5c5e\u6027\u3002\u5728\u5e76\u884c\u5de5\u4f5c\u8fdb\u7a0b\u5185\u8fd0\u884c\u7684\u8282\u70b9\u4e0d\u4e00\u5b9a\u662f\u5e76\u884c\u611f\u77e5\u8282\u70b9\u3002"]}, {"title": "\u5185\u5b58\u4e0e\u4e34\u65f6\u5b58\u50a8", "paragraphs": ["\u6b64\u8282\u70b9\u5c06 work_mem \u4f20\u7ed9 tuplesort\u3002\u6392\u5e8f\u53ef\u4f7f\u7528\u5185\u5b58\u6216\u4e34\u65f6\u6587\u4ef6\uff1b\u5b9e\u9645\u65b9\u6cd5\u548c\u7a7a\u95f4\u7528\u91cf\u53d6\u51b3\u4e8e\u8f93\u5165\u53ca\u8ba1\u5212\u3002", "\u4f7f\u7528 tuplesort \u5bf9\u8282\u70b9\u5916\u4fa7\u5b50\u6811\u7684\u5143\u7ec4\u6392\u5e8f\uff0c\u5c06\u7ed3\u679c\u4fdd\u5b58\u5728\u4e34\u65f6\u6587\u4ef6\u6216\u5185\u5b58\u4e2d\u3002\u9996\u6b21\u8c03\u7528\u4e4b\u540e\uff0c\u6bcf\u6b21\u8c03\u7528\u90fd\u4ece\u6587\u4ef6\u8fd4\u56de\u4e00\u4e2a\u5143\u7ec4\u3002"]}, {"title": "\u5e76\u884c\u6267\u884c\u4e0e\u8fd0\u884c\u4fe1\u606f\u91c7\u96c6", "paragraphs": ["\u4ee5\u4e0b\u6e90\u7801\u56de\u8c03\u53ef\u4ee5\u534f\u8c03\u6267\u884c\u6216\u6536\u96c6\u5de5\u4f5c\u8fdb\u7a0b\u7684\u6d4b\u91cf\u6570\u636e\u3002\u56de\u8c03\u5b58\u5728\u4e0d\u4ee3\u8868\u8be5\u8282\u70b9\u666e\u904d\u652f\u6301\u5171\u4eab\u5e76\u884c\u626b\u63cf\u6216\u5171\u4eab\u72b6\u6001\u3002", "\u6b64\u6784\u5efa\u7684\u56de\u8c03\uff1aExecSortEstimate, ExecSortInitializeDSM, ExecSortInitializeWorker, ExecSortRetrieveInstrumentation."]}, {"title": "\u540c\u7248\u672c\u624b\u518c\u8bf4\u660e", "paragraphs": ["\u4f30\u8ba1\u542f\u52a8\u4ee3\u4ef7\uff1a\u8f93\u51fa\u9636\u6bb5\u5f00\u59cb\u4e4b\u524d\u6d88\u8017\u7684\u65f6\u95f4\uff0c\u4f8b\u5982\u6392\u5e8f\u8282\u70b9\u6267\u884c\u6392\u5e8f\u6240\u9700\u7684\u65f6\u95f4\u3002", "\u5f52\u5e76\u8fde\u63a5\u8981\u6c42\u8f93\u5165\u6309\u8fde\u63a5\u952e\u6392\u5e8f\u3002\u6b64\u8ba1\u5212\u901a\u8fc7\u7d22\u5f15\u626b\u63cf\u6309\u987a\u5e8f\u8bfb\u53d6 tenk1\uff1b\u5bf9\u4e8e onek\uff0c\u5219\u503e\u5411\u4e8e\u987a\u5e8f\u626b\u63cf\u540e\u6392\u5e8f\uff0c\u56e0\u4e3a\u8be5\u8868\u8981\u8bbf\u95ee\u7684\u884c\u66f4\u591a\u3002\uff08\u5bf9\u5927\u91cf\u884c\u6392\u5e8f\u65f6\uff0c\u987a\u5e8f\u626b\u63cf\u52a0\u6392\u5e8f\u5e38\u5e38\u4f18\u4e8e\u7d22\u5f15\u626b\u63cf\uff0c\u56e0\u4e3a\u540e\u8005\u9700\u8981\u975e\u987a\u5e8f\u78c1\u76d8\u8bbf\u95ee\u3002\uff09", "\u89c2\u5bdf\u5907\u9009\u8ba1\u5212\u7684\u4e00\u79cd\u529e\u6cd5\uff0c\u662f\u4f7f\u7528\u7b2c 19.7.1 \u8282\u7684\u542f\u7528\uff0f\u7981\u7528\u6807\u5fd7\uff0c\u5f3a\u5236\u89c4\u5212\u5668\u5ffd\u7565\u5b83\u8ba4\u4e3a\u4ee3\u4ef7\u6700\u4f4e\u7684\u7b56\u7565\u3002\u8fd9\u79cd\u5de5\u5177\u8f83\u4e3a\u7c97\u7565\uff0c\u4f46\u5f88\u6709\u7528\uff0c\u53e6\u89c1\u7b2c 14.3 \u8282\u3002\u4f8b\u5982\uff0c\u5982\u679c\u4e0d\u786e\u5b9a\u524d\u4f8b\u4e2d\u5bf9 onek \u8868\u91c7\u7528\u987a\u5e8f\u626b\u63cf\u518d\u6392\u5e8f\u662f\u5426\u6700\u4f73\uff0c\u53ef\u4ee5\u5c1d\u8bd5\uff1a", "\u8fd9\u8bf4\u660e\u89c4\u5212\u5668\u8ba4\u4e3a\u901a\u8fc7\u7d22\u5f15\u626b\u63cf\u5bf9 onek \u6392\u5e8f\u7684\u6210\u672c\u6bd4\u987a\u5e8f\u626b\u63cf\u52a0\u6392\u5e8f\u9ad8\u7ea6 12%\u3002\u63a5\u4e0b\u6765\u5f53\u7136\u8981\u786e\u8ba4\u5b83\u5224\u65ad\u662f\u5426\u6b63\u786e\uff1b\u53ef\u4f7f\u7528\u4e0b\u6587\u4ecb\u7ecd\u7684 EXPLAIN ANALYZE \u6765\u9a8c\u8bc1\u3002", "\u5728\u67d0\u4e9b\u60c5\u51b5\u4e0b\uff0cEXPLAIN ANALYZE \u9664\u4e86\u8ba1\u5212\u8282\u70b9\u7684\u6267\u884c\u65f6\u95f4\u548c\u884c\u6570\u4e4b\u5916\uff0c\u8fd8\u4f1a\u663e\u793a\u989d\u5916\u7684\u6267\u884c\u7edf\u8ba1\u4fe1\u606f\u3002\u4f8b\u5982\uff0cSort \u548c Hash \u8282\u70b9\u4f1a\u63d0\u4f9b\u66f4\u591a\u4fe1\u606f\uff1a", "Sort \u8282\u70b9\u663e\u793a\u6392\u5e8f\u65b9\u6cd5\uff08\u5c24\u5176\u662f\u5185\u5b58\u6392\u5e8f\u8fd8\u662f\u78c1\u76d8\u6392\u5e8f\uff09\u53ca\u6240\u9700\u5185\u5b58\u6216\u78c1\u76d8\u7a7a\u95f4\u3002Hash \u8282\u70b9\u663e\u793a\u54c8\u5e0c\u6876\u6570\u3001\u6279\u6b21\u6570\u53ca\u54c8\u5e0c\u8868\u5185\u5b58\u4f7f\u7528\u5cf0\u503c\u3002\uff08\u6279\u6b21\u6570\u8d85\u8fc7\u4e00\u65f6\u4e5f\u4f1a\u4f7f\u7528\u78c1\u76d8\u7a7a\u95f4\uff0c\u4f46\u6b64\u5904\u4e0d\u663e\u793a\u3002\uff09"]}, {"title": "\u672c\u7248\u624b\u518c\u4e2d\u7684\u793a\u4f8b", "blocks": [{"code": "EXPLAIN SELECT *\nFROM tenk1 t1, onek t2\nWHERE t1.unique1 < 100 AND t1.unique2 = t2.unique2;\n\n                                        QUERY PLAN\n------------------------------------------------------------------------------------------\n Merge Join  (cost=198.11..268.19 rows=10 width=488)\n   Merge Cond: (t1.unique2 = t2.unique2)\n   ->  Index Scan using tenk1_unique2 on tenk1 t1  (cost=0.29..656.28 rows=101 width=244)\n         Filter: (unique1 < 100)\n   ->  Sort  (cost=197.83..200.33 rows=1000 width=244)\n         Sort Key: t2.unique2\n         ->  Seq Scan on onek t2  (cost=0.00..148.00 rows=1000 width=244)", "source": {"url": "/docs/12/using-explain.html#USING-EXPLAIN-BASICS", "path": "using-explain.html", "label": "PostgreSQL 12.22 \u00b7 using-explain", "sha256": "06297525f2180b07e752837a3351be9c871b56559f535bcd0a67dec9baac10c0"}, "paragraphs": ["\u793a\u4f8b\u6458\u81ea PostgreSQL 12.22 \u624b\u518c\uff1b\u672c\u767e\u79d1\u672a\u5b9e\u9645\u6267\u884c\u6b64\u793a\u4f8b\u3002", "\u53e6\u4e00\u79cd\u53ef\u80fd\u7684\u8fde\u63a5\u65b9\u5f0f\u662f\u5f52\u5e76\u8fde\u63a5\uff0c\u5982\u4e0b\u6240\u793a\uff1a"]}, {"code": "SET enable_sort = off;\n\nEXPLAIN SELECT *\nFROM tenk1 t1, onek t2\nWHERE t1.unique1 < 100 AND t1.unique2 = t2.unique2;\n\n                                        QUERY PLAN\n------------------------------------------------------------------------------------------\n Merge Join  (cost=0.56..292.65 rows=10 width=488)\n   Merge Cond: (t1.unique2 = t2.unique2)\n   ->  Index Scan using tenk1_unique2 on tenk1 t1  (cost=0.29..656.28 rows=101 width=244)\n         Filter: (unique1 < 100)\n   ->  Index Scan using onek_unique2 on onek t2  (cost=0.28..224.79 rows=1000 width=244)", "source": {"url": "/docs/12/using-explain.html#USING-EXPLAIN-BASICS", "path": "using-explain.html", "label": "PostgreSQL 12.22 \u00b7 using-explain", "sha256": "06297525f2180b07e752837a3351be9c871b56559f535bcd0a67dec9baac10c0"}, "paragraphs": ["\u793a\u4f8b\u6458\u81ea PostgreSQL 12.22 \u624b\u518c\uff1b\u672c\u767e\u79d1\u672a\u5b9e\u9645\u6267\u884c\u6b64\u793a\u4f8b\u3002", "\u89c2\u5bdf\u5907\u9009\u8ba1\u5212\u7684\u4e00\u79cd\u529e\u6cd5\uff0c\u662f\u4f7f\u7528\u7b2c 19.7.1 \u8282\u7684\u542f\u7528\uff0f\u7981\u7528\u6807\u5fd7\uff0c\u5f3a\u5236\u89c4\u5212\u5668\u5ffd\u7565\u5b83\u8ba4\u4e3a\u4ee3\u4ef7\u6700\u4f4e\u7684\u7b56\u7565\u3002\u8fd9\u79cd\u5de5\u5177\u8f83\u4e3a\u7c97\u7565\uff0c\u4f46\u5f88\u6709\u7528\uff0c\u53e6\u89c1\u7b2c 14.3 \u8282\u3002\u4f8b\u5982\uff0c\u5982\u679c\u4e0d\u786e\u5b9a\u524d\u4f8b\u4e2d\u5bf9 onek \u8868\u91c7\u7528\u987a\u5e8f\u626b\u63cf\u518d\u6392\u5e8f\u662f\u5426\u6700\u4f73\uff0c\u53ef\u4ee5\u5c1d\u8bd5\uff1a"]}]}, {"title": "\u6267\u884c\u5668\u5b9e\u73b0\u8bf4\u660e", "paragraphs": ["\u4f7f\u7528 tuplesort \u5bf9\u8282\u70b9\u5916\u4fa7\u5b50\u6811\u7684\u5143\u7ec4\u6392\u5e8f\uff0c\u5c06\u7ed3\u679c\u4fdd\u5b58\u5728\u4e34\u65f6\u6587\u4ef6\u6216\u5185\u5b58\u4e2d\u3002\u9996\u6b21\u8c03\u7528\u4e4b\u540e\uff0c\u6bcf\u6b21\u8c03\u7528\u90fd\u4ece\u6587\u4ef6\u8fd4\u56de\u4e00\u4e2a\u5143\u7ec4\u3002", "\u521d\u59cb\u72b6\u6001\uff1a\u5916\u4fa7\u5b50\u8282\u70b9\u5df2\u51c6\u5907\u597d\u8fd4\u56de\u7b2c\u4e00\u4e2a\u5143\u7ec4\u3002", "\u9996\u6b21\u6267\u884c\u65f6\uff0c\u4ece\u5916\u4fa7\u8ba1\u5212\u8bfb\u53d6\u5168\u90e8\u5143\u7ec4\u5e76\u4f20\u7ed9 tuplesort.c\uff1b\u540e\u7eed\u8c03\u7528\u53ea\u9700\u4ece tuplesort \u83b7\u53d6\u5143\u7ec4\u3002", "\u521b\u5efa\u5df2\u6392\u5e8f\u6570\u636e\u65f6\uff0c\u9700\u8981\u6cbf\u6b63\u5411\u626b\u63cf\u5b50\u8ba1\u5212\u3002", "\u4ece tuplesort \u83b7\u53d6\u7b2c\u4e00\u4e2a\u6216\u4e0b\u4e00\u4e2a\u5143\u7ec4\uff1b\u6ca1\u6709\u66f4\u591a\u5143\u7ec4\u65f6\u8fd4\u56de NULL\u3002\u6ce8\u610f\uff0c\u53ea\u4fdd\u8bc1\u69fd\u4e2d\u7684\u5143\u7ec4\u5728\u4e0b\u6b21\u4ece tuplesort \u83b7\u53d6\u5143\u7ec4\u4e4b\u524d\u6709\u6548\u3002"]}, {"code": "case T_Sort:\n\t\t\tpname = sname = \"Sort\";\n\t\t\tbreak;", "title": "\u6838\u5fc3\u6e90\u7801\u4e2d\u7684 EXPLAIN \u6807\u8bc6"}], "strategies": [], "description": ["\u6309\u8ba1\u5212\u6392\u5e8f\u952e\u5bf9\u5b50\u8ba1\u5212\u8f93\u51fa\u7684\u884c\u6392\u5e8f\u3002"], "localization": {"status": "complete", "sources": [], "language": "zh", "original_text": {"/versions/12/description/0": "Sorts rows from its child according to the plan sort keys.", "/versions/12/facts/0/label": "Core node tag", "/versions/12/facts/1/label": "Structured EXPLAIN Node Type", "/versions/12/facts/2/label": "Inputs", "/versions/12/facts/2/value": "One child plan", "/versions/12/facts/3/label": "Output", "/versions/12/facts/3/value": "Sorted tuples", "/versions/12/facts/4/label": "Executor initializer", "/versions/12/facts/5/label": "Memory mechanism", "/versions/12/tables/0/title": "EXPLAIN labels in this source build", "/versions/12/related/1/label": "Using EXPLAIN", "/versions/12/related/2/label": "Parallel plans", "/versions/12/sections/0/title": "EXPLAIN names and attributes", "/versions/12/sections/1/title": "Memory and temporary storage", "/versions/12/sections/2/title": "Parallel execution and instrumentation", "/versions/12/sections/3/title": "Same-version manual discussion", "/versions/12/sections/4/title": "Examples from this manual build", "/versions/12/sections/5/title": "Executor implementation notes", "/versions/12/sections/6/title": "EXPLAIN identity in core source", "/versions/12/memory/description": "The node passes work_mem to tuplesort. Sorting can use memory or temporary files; the actual method and space use depend on the input and plan.", "/versions/12/sections/0/paragraphs/0": "Structured formats use the Node Type above. Text-format spellings can also include operation, strategy, join type, scan direction or aggregation-stage attributes.", "/versions/12/sections/0/paragraphs/1": "Text names recorded by this source: Sort.", "/versions/12/sections/0/paragraphs/2": "Parallel-aware and parallel-safe are different plan properties. A node running inside a parallel worker is not necessarily a parallel-aware node.", "/versions/12/sections/1/paragraphs/0": "The node passes work_mem to tuplesort. Sorting can use memory or temporary files; the actual method and space use depend on the input and plan.", "/versions/12/sections/1/paragraphs/1": "Sorts tuples from the outer subtree of the node using tuplesort, which saves the results in a temporary file or memory. After the initial call, returns a tuple from the file with each call.", "/versions/12/sections/2/paragraphs/0": "The source callbacks below can coordinate execution or collect worker instrumentation. Their presence is not a blanket claim that this node supports a shared parallel scan or shared state.", "/versions/12/sections/2/paragraphs/1": "Callbacks in this build: ExecSortEstimate, ExecSortInitializeDSM, ExecSortInitializeWorker, ExecSortRetrieveInstrumentation.", "/versions/12/sections/3/paragraphs/0": "Estimated start-up cost. This is the time expended before the output phase can begin, e.g., time to do the sorting in a sort node.", "/versions/12/sections/3/paragraphs/1": "Merge join requires its input data to be sorted on the join keys. In this plan the tenk1 data is sorted by using an index scan to visit the rows in the correct order, but a sequential scan and sort is preferred for onek , because there are many more rows to be visited in that table. (Sequential-scan-and-sort frequently beats an index scan for sorting many rows, because of the nonsequential disk access required by the index scan.)", "/versions/12/sections/3/paragraphs/2": "One way to look at variant plans is to force the planner to disregard whatever strategy it thought was the cheapest, using the enable/disable flags described in Section 19.7.1 . (This is a crude tool, but useful. See also Section 14.3 .) For example, if we're unconvinced that sequential-scan-and-sort is the best way to deal with table onek in the previous example, we could try", "/versions/12/sections/3/paragraphs/3": "which shows that the planner thinks that sorting onek by index-scanning is about 12% more expensive than sequential-scan-and-sort. Of course, the next question is whether it's right about that. We can investigate that using EXPLAIN ANALYZE , as discussed below.", "/versions/12/sections/3/paragraphs/4": "In some cases EXPLAIN ANALYZE shows additional execution statistics beyond the plan node execution times and row counts. For example, Sort and Hash nodes provide extra information:", "/versions/12/sections/3/paragraphs/5": "The Sort node shows the sort method used (in particular, whether the sort was in-memory or on-disk) and the amount of memory or disk space needed. The Hash node shows the number of hash buckets and batches as well as the peak amount of memory used for the hash table. (If the number of batches exceeds one, there will also be disk space usage involved, but that is not shown.)", "/versions/12/sections/5/paragraphs/0": "Sorts tuples from the outer subtree of the node using tuplesort, which saves the results in a temporary file or memory. After the initial call, returns a tuple from the file with each call.", "/versions/12/sections/5/paragraphs/1": "Initial States: -- the outer child is prepared to return the first tuple.", "/versions/12/sections/5/paragraphs/2": "If first time through, read all tuples from outer plan and pass them to tuplesort.c. Subsequent calls just fetch tuples from tuplesort.", "/versions/12/sections/5/paragraphs/3": "Want to scan subplan in the forward direction while creating the sorted data.", "/versions/12/sections/5/paragraphs/4": "Get the first or next tuple from tuplesort. Returns NULL if no more tuples. Note that we only rely on slot tuple remaining valid until the next fetch from the tuplesort.", "/versions/12/tables/0/columns/0/label": "Text-format label", "/versions/12/tables/0/columns/1/label": "Structured node identity", "/versions/12/sections/4/blocks/0/paragraphs/0": "Example copied from the PostgreSQL 12.22 manual; it was not executed for this collection.", "/versions/12/sections/4/blocks/0/paragraphs/1": "Another possible type of join is a merge join, illustrated here:", "/versions/12/sections/4/blocks/1/paragraphs/0": "Example copied from the PostgreSQL 12.22 manual; it was not executed for this collection.", "/versions/12/sections/4/blocks/1/paragraphs/1": "One way to look at variant plans is to force the planner to disregard whatever strategy it thought was the cheapest, using the enable/disable flags described in Section 19.7.1 . (This is a crude tool, but useful. See also Section 14.3 .) For example, if we're unconvinced that sequential-scan-and-sort is the best way to deal with table onek in the previous example, we could try"}, "fallback_fields": [], "source_language": "en", "original_snapshot_sha256": "0b5473080be63c32f9f68e707c6c2dbddefd9eb15232d2028076deb2392fd0d7"}, "evidence_kind": "source and documentation", "explain_names": ["Sort"], "partial_modes": [], "comparison_data": {"node_tag": "T_Sort", "strategies": [], "text_names": ["Sort"], "initializer": "ExecInitSort", "partial_modes": [], "memory_mechanism": "tuplesort", "parallel_callbacks": ["ExecSortEstimate", "ExecSortInitializeDSM", "ExecSortInitializeWorker", "ExecSortRetrieveInstrumentation"]}, "comparison_hash": "32a824f93669794b01449d5d8a08ff4edcb6024cb1a897131b35fe5cddc2e4da", "explain_prefixes": ["Parallel"], "runtime_verified": false, "source_inventory": {"explain": "src/backend/commands/explain.c", "executor": "src/backend/executor/execProcnode.c", "implementation": "src/backend/executor/nodeSort.c"}, "parallel_callbacks": ["ExecSortEstimate", "ExecSortInitializeDSM", "ExecSortInitializeWorker", "ExecSortRetrieveInstrumentation"]}, "13": {"facts": [{"label": "\u6838\u5fc3\u8282\u70b9\u6807\u7b7e", "value": "T_Sort"}, {"label": "\u7ed3\u6784\u5316 EXPLAIN \u8282\u70b9\u7c7b\u578b", "value": "Sort"}, {"label": "\u8f93\u5165", "value": "\u4e00\u4e2a\u5b50\u8ba1\u5212"}, {"label": "\u8f93\u51fa", "value": "\u5df2\u6392\u5e8f\u7684\u5143\u7ec4"}, {"label": "\u6267\u884c\u5668\u521d\u59cb\u5316\u51fd\u6570", "value": "ExecInitSort"}, {"label": "\u5185\u5b58\u673a\u5236", "value": "tuplesort"}], "memory": {"evidence": [{"url": "https://ftp.postgresql.org/pub/source/v13.23/postgresql-13.23.tar.bz2", "path": "src/backend/executor/nodeSort.c", "label": "src/backend/executor/nodeSort.c", "sha256": "f39d606b704ff6d237b5249ca9f646fbb17a1944e8671b1460fc4925b9cc6eb3", "archive_sha256": "6ec3c82726af92b7dec873fa1cdf881eca92a4219787dfad05acb6b10e041fd6"}, {"url": "https://ftp.postgresql.org/pub/source/v13.23/postgresql-13.23.tar.bz2", "path": "src/backend/utils/sort/tuplesort.c", "label": "src/backend/utils/sort/tuplesort.c", "sha256": "87afe1e79fcca02b36d021c770db27a3990194a4697718fb11c83ea5696aad95", "archive_sha256": "6ec3c82726af92b7dec873fa1cdf881eca92a4219787dfad05acb6b10e041fd6"}], "mechanism": "tuplesort", "description": "\u6b64\u8282\u70b9\u5c06 work_mem \u4f20\u7ed9 tuplesort\u3002\u6392\u5e8f\u53ef\u4f7f\u7528\u5185\u5b58\u6216\u4e34\u65f6\u6587\u4ef6\uff1b\u5b9e\u9645\u65b9\u6cd5\u548c\u7a7a\u95f4\u7528\u91cf\u53d6\u51b3\u4e8e\u8f93\u5165\u53ca\u8ba1\u5212\u3002", "source_notes": ["Sorts tuples from the outer subtree of the node using tuplesort, which saves the results in a temporary file or memory. After the initial call, returns a tuple from the file with each call."]}, "tables": [{"key": "explain-labels", "rows": [{"label": "Sort", "identity": "Sort"}], "title": "\u672c\u6784\u5efa\u4e2d\u7684 EXPLAIN \u6807\u7b7e", "columns": [{"key": "label", "label": "\u6587\u672c\u683c\u5f0f\u6807\u7b7e"}, {"key": "identity", "label": "\u7ed3\u6784\u5316\u8282\u70b9\u6807\u8bc6"}]}], "related": [{"url": "/wiki/sql/explain/?v=13", "label": "EXPLAIN"}, {"url": "/docs/13/using-explain.html", "label": "\u4f7f\u7528 EXPLAIN"}, {"url": "/docs/13/parallel-plans.html", "label": "\u5e76\u884c\u8ba1\u5212"}, {"url": "/wiki/guc/enable_sort/?v=13", "label": "enable_sort"}, {"url": "/wiki/guc/work_mem/?v=13", "label": "work_mem"}], "release": {"ref": "PostgreSQL 13.23 source archive", "label": "13.23", "major": "13", "channel": "historical", "revision": "6ec3c82726af92b7dec873fa1cdf881eca92a4219787dfad05acb6b10e041fd6", "source_url": "https://ftp.postgresql.org/pub/source/v13.23/postgresql-13.23.tar.bz2", "source_snapshot_utc": ""}, "sources": [{"url": "https://ftp.postgresql.org/pub/source/v13.23/postgresql-13.23.tar.bz2", "line": 1270, "path": "src/backend/commands/explain.c", "label": "src/backend/commands/explain.c:1270", "sha256": "541713e0e7f1c9cc352c2b6028964d440c19d2678a4463000094c24a88c1e730", "archive_sha256": "6ec3c82726af92b7dec873fa1cdf881eca92a4219787dfad05acb6b10e041fd6"}, {"url": "https://ftp.postgresql.org/pub/source/v13.23/postgresql-13.23.tar.bz2", "line": 313, "path": "src/backend/executor/execProcnode.c", "label": "src/backend/executor/execProcnode.c:313", "sha256": "d085ee99acfa00587e6ade3a1d9f8108a0566beedbbee3f54a50c9fc0cc2e875", "archive_sha256": "6ec3c82726af92b7dec873fa1cdf881eca92a4219787dfad05acb6b10e041fd6"}, {"url": "https://ftp.postgresql.org/pub/source/v13.23/postgresql-13.23.tar.bz2", "path": "src/backend/executor/nodeSort.c", "label": "src/backend/executor/nodeSort.c", "sha256": "f39d606b704ff6d237b5249ca9f646fbb17a1944e8671b1460fc4925b9cc6eb3", "archive_sha256": "6ec3c82726af92b7dec873fa1cdf881eca92a4219787dfad05acb6b10e041fd6"}, {"url": "https://ftp.postgresql.org/pub/source/v13.23/postgresql-13.23.tar.bz2", "path": "src/include/nodes/plannodes.h", "label": "src/include/nodes/plannodes.h", "sha256": "dcb296833777b02008c4b6bae8e8f7c6423b7ffba21f36702597c9d596d039ab", "archive_sha256": "6ec3c82726af92b7dec873fa1cdf881eca92a4219787dfad05acb6b10e041fd6"}, {"url": "https://ftp.postgresql.org/pub/source/v13.23/postgresql-13.23.tar.bz2", "path": "src/backend/utils/sort/tuplesort.c", "label": "src/backend/utils/sort/tuplesort.c", "sha256": "87afe1e79fcca02b36d021c770db27a3990194a4697718fb11c83ea5696aad95", "archive_sha256": "6ec3c82726af92b7dec873fa1cdf881eca92a4219787dfad05acb6b10e041fd6"}, {"url": "https://pg.center/docs/13/using-explain.html#USING-EXPLAIN-BASICS", "path": "using-explain.html", "label": "PostgreSQL 13.23 \u00b7 using-explain", "sha256": "650fd8629382d5dc8f9f8412c50ec5f32442a9ad2f98ca88e5348a7c2bd0ac7a", "language": "en", "original_url": "/docs/13/using-explain.html#USING-EXPLAIN-BASICS"}], "node_tag": "T_Sort", "sections": [{"title": "EXPLAIN \u540d\u79f0\u4e0e\u5c5e\u6027", "paragraphs": ["\u7ed3\u6784\u5316\u683c\u5f0f\u4f7f\u7528\u4e0a\u8ff0 Node Type\u3002\u6587\u672c\u683c\u5f0f\u540d\u79f0\u8fd8\u53ef\u80fd\u5305\u542b\u64cd\u4f5c\u3001\u7b56\u7565\u3001\u8fde\u63a5\u7c7b\u578b\u3001\u626b\u63cf\u65b9\u5411\u6216\u805a\u5408\u9636\u6bb5\u5c5e\u6027\u3002", "\u6b64\u6e90\u7801\u8bb0\u5f55\u7684\u6587\u672c\u540d\u79f0\uff1aSort.", "\u5e76\u884c\u611f\u77e5\u4e0e\u5e76\u884c\u5b89\u5168\u662f\u4e0d\u540c\u7684\u8ba1\u5212\u5c5e\u6027\u3002\u5728\u5e76\u884c\u5de5\u4f5c\u8fdb\u7a0b\u5185\u8fd0\u884c\u7684\u8282\u70b9\u4e0d\u4e00\u5b9a\u662f\u5e76\u884c\u611f\u77e5\u8282\u70b9\u3002"]}, {"title": "\u5185\u5b58\u4e0e\u4e34\u65f6\u5b58\u50a8", "paragraphs": ["\u6b64\u8282\u70b9\u5c06 work_mem \u4f20\u7ed9 tuplesort\u3002\u6392\u5e8f\u53ef\u4f7f\u7528\u5185\u5b58\u6216\u4e34\u65f6\u6587\u4ef6\uff1b\u5b9e\u9645\u65b9\u6cd5\u548c\u7a7a\u95f4\u7528\u91cf\u53d6\u51b3\u4e8e\u8f93\u5165\u53ca\u8ba1\u5212\u3002", "\u4f7f\u7528 tuplesort \u5bf9\u8282\u70b9\u5916\u4fa7\u5b50\u6811\u7684\u5143\u7ec4\u6392\u5e8f\uff0c\u5c06\u7ed3\u679c\u4fdd\u5b58\u5728\u4e34\u65f6\u6587\u4ef6\u6216\u5185\u5b58\u4e2d\u3002\u9996\u6b21\u8c03\u7528\u4e4b\u540e\uff0c\u6bcf\u6b21\u8c03\u7528\u90fd\u4ece\u6587\u4ef6\u8fd4\u56de\u4e00\u4e2a\u5143\u7ec4\u3002"]}, {"title": "\u5e76\u884c\u6267\u884c\u4e0e\u8fd0\u884c\u4fe1\u606f\u91c7\u96c6", "paragraphs": ["\u4ee5\u4e0b\u6e90\u7801\u56de\u8c03\u53ef\u4ee5\u534f\u8c03\u6267\u884c\u6216\u6536\u96c6\u5de5\u4f5c\u8fdb\u7a0b\u7684\u6d4b\u91cf\u6570\u636e\u3002\u56de\u8c03\u5b58\u5728\u4e0d\u4ee3\u8868\u8be5\u8282\u70b9\u666e\u904d\u652f\u6301\u5171\u4eab\u5e76\u884c\u626b\u63cf\u6216\u5171\u4eab\u72b6\u6001\u3002", "\u6b64\u6784\u5efa\u7684\u56de\u8c03\uff1aExecSortEstimate, ExecSortInitializeDSM, ExecSortInitializeWorker, ExecSortRetrieveInstrumentation."]}, {"title": "\u540c\u7248\u672c\u624b\u518c\u8bf4\u660e", "paragraphs": ["\u4f30\u8ba1\u542f\u52a8\u4ee3\u4ef7\uff1a\u8f93\u51fa\u9636\u6bb5\u5f00\u59cb\u4e4b\u524d\u6d88\u8017\u7684\u65f6\u95f4\uff0c\u4f8b\u5982\u6392\u5e8f\u8282\u70b9\u6267\u884c\u6392\u5e8f\u6240\u9700\u7684\u65f6\u95f4\u3002", "\u89c4\u5212\u5668\u53ef\u7528\u591a\u79cd\u65b9\u5f0f\u5b9e\u73b0 ORDER BY\u3002\u4e0a\u4f8b\u5c55\u793a\u4e86\u9690\u5f0f\u5b9e\u73b0\u6392\u5e8f\u7684\u65b9\u5f0f\uff1b\u89c4\u5212\u5668\u4e5f\u53ef\u4ee5\u6dfb\u52a0\u663e\u5f0f\u6392\u5e8f\u6b65\u9aa4\uff1a", "\u5982\u679c\u8ba1\u5212\u7684\u4e00\u90e8\u5206\u80fd\u4fdd\u8bc1\u8f93\u5165\u5df2\u6309\u6240\u9700\u6392\u5e8f\u952e\u7684\u524d\u7f00\u6392\u5e8f\uff0c\u89c4\u5212\u5668\u53ef\u80fd\u6539\u7528\u589e\u91cf\u6392\u5e8f\u6b65\u9aa4\uff1a", "\u5f52\u5e76\u8fde\u63a5\u8981\u6c42\u8f93\u5165\u6309\u8fde\u63a5\u952e\u6392\u5e8f\u3002\u6b64\u8ba1\u5212\u901a\u8fc7\u7d22\u5f15\u626b\u63cf\u6309\u987a\u5e8f\u8bfb\u53d6 tenk1\uff1b\u5bf9\u4e8e onek\uff0c\u5219\u503e\u5411\u4e8e\u987a\u5e8f\u626b\u63cf\u540e\u6392\u5e8f\uff0c\u56e0\u4e3a\u8be5\u8868\u8981\u8bbf\u95ee\u7684\u884c\u66f4\u591a\u3002\uff08\u5bf9\u5927\u91cf\u884c\u6392\u5e8f\u65f6\uff0c\u987a\u5e8f\u626b\u63cf\u52a0\u6392\u5e8f\u5e38\u5e38\u4f18\u4e8e\u7d22\u5f15\u626b\u63cf\uff0c\u56e0\u4e3a\u540e\u8005\u9700\u8981\u975e\u987a\u5e8f\u78c1\u76d8\u8bbf\u95ee\u3002\uff09", "\u89c2\u5bdf\u5907\u9009\u8ba1\u5212\u7684\u4e00\u79cd\u529e\u6cd5\uff0c\u662f\u4f7f\u7528\u7b2c 19.7.1 \u8282\u7684\u542f\u7528\uff0f\u7981\u7528\u6807\u5fd7\uff0c\u5f3a\u5236\u89c4\u5212\u5668\u5ffd\u7565\u5b83\u8ba4\u4e3a\u4ee3\u4ef7\u6700\u4f4e\u7684\u7b56\u7565\u3002\u8fd9\u79cd\u5de5\u5177\u8f83\u4e3a\u7c97\u7565\uff0c\u4f46\u5f88\u6709\u7528\uff0c\u53e6\u89c1\u7b2c 14.3 \u8282\u3002\u4f8b\u5982\uff0c\u5982\u679c\u4e0d\u786e\u5b9a\u524d\u4f8b\u4e2d\u5bf9 onek \u8868\u91c7\u7528\u987a\u5e8f\u626b\u63cf\u518d\u6392\u5e8f\u662f\u5426\u6700\u4f73\uff0c\u53ef\u4ee5\u5c1d\u8bd5\uff1a", "\u8fd9\u8bf4\u660e\u89c4\u5212\u5668\u8ba4\u4e3a\u901a\u8fc7\u7d22\u5f15\u626b\u63cf\u5bf9 onek \u6392\u5e8f\u7684\u6210\u672c\u6bd4\u987a\u5e8f\u626b\u63cf\u52a0\u6392\u5e8f\u9ad8\u7ea6 12%\u3002\u63a5\u4e0b\u6765\u5f53\u7136\u8981\u786e\u8ba4\u5b83\u5224\u65ad\u662f\u5426\u6b63\u786e\uff1b\u53ef\u4f7f\u7528\u4e0b\u6587\u4ecb\u7ecd\u7684 EXPLAIN ANALYZE \u6765\u9a8c\u8bc1\u3002"]}, {"title": "\u672c\u7248\u624b\u518c\u4e2d\u7684\u793a\u4f8b", "blocks": [{"code": "EXPLAIN SELECT * FROM tenk1 ORDER BY unique1;\n                            QUERY PLAN\n-------------------------------------------------------------------\n Sort  (cost=1109.39..1134.39 rows=10000 width=244)\n   Sort Key: unique1\n   ->  Seq Scan on tenk1  (cost=0.00..445.00 rows=10000 width=244)", "source": {"url": "/docs/13/using-explain.html#USING-EXPLAIN-BASICS", "path": "using-explain.html", "label": "PostgreSQL 13.23 \u00b7 using-explain", "sha256": "650fd8629382d5dc8f9f8412c50ec5f32442a9ad2f98ca88e5348a7c2bd0ac7a"}, "paragraphs": ["\u793a\u4f8b\u6458\u81ea PostgreSQL 13.23 \u624b\u518c\uff1b\u672c\u767e\u79d1\u672a\u5b9e\u9645\u6267\u884c\u6b64\u793a\u4f8b\u3002", "\u89c4\u5212\u5668\u53ef\u7528\u591a\u79cd\u65b9\u5f0f\u5b9e\u73b0 ORDER BY\u3002\u4e0a\u4f8b\u5c55\u793a\u4e86\u9690\u5f0f\u5b9e\u73b0\u6392\u5e8f\u7684\u65b9\u5f0f\uff1b\u89c4\u5212\u5668\u4e5f\u53ef\u4ee5\u6dfb\u52a0\u663e\u5f0f\u6392\u5e8f\u6b65\u9aa4\uff1a"]}, {"code": "EXPLAIN SELECT * FROM tenk1 ORDER BY four, ten LIMIT 100;\n                                              QUERY PLAN\n------------------------------------------------------------------------------------------------------\n Limit  (cost=521.06..538.05 rows=100 width=244)\n   ->  Incremental Sort  (cost=521.06..2220.95 rows=10000 width=244)\n         Sort Key: four, ten\n         Presorted Key: four\n         ->  Index Scan using index_tenk1_on_four on tenk1  (cost=0.29..1510.08 rows=10000 width=244)", "source": {"url": "/docs/13/using-explain.html#USING-EXPLAIN-BASICS", "path": "using-explain.html", "label": "PostgreSQL 13.23 \u00b7 using-explain", "sha256": "650fd8629382d5dc8f9f8412c50ec5f32442a9ad2f98ca88e5348a7c2bd0ac7a"}, "paragraphs": ["\u793a\u4f8b\u6458\u81ea PostgreSQL 13.23 \u624b\u518c\uff1b\u672c\u767e\u79d1\u672a\u5b9e\u9645\u6267\u884c\u6b64\u793a\u4f8b\u3002", "\u5982\u679c\u8ba1\u5212\u7684\u4e00\u90e8\u5206\u80fd\u4fdd\u8bc1\u8f93\u5165\u5df2\u6309\u6240\u9700\u6392\u5e8f\u952e\u7684\u524d\u7f00\u6392\u5e8f\uff0c\u89c4\u5212\u5668\u53ef\u80fd\u6539\u7528\u589e\u91cf\u6392\u5e8f\u6b65\u9aa4\uff1a"]}]}, {"title": "\u6267\u884c\u5668\u5b9e\u73b0\u8bf4\u660e", "paragraphs": ["\u4f7f\u7528 tuplesort \u5bf9\u8282\u70b9\u5916\u4fa7\u5b50\u6811\u7684\u5143\u7ec4\u6392\u5e8f\uff0c\u5c06\u7ed3\u679c\u4fdd\u5b58\u5728\u4e34\u65f6\u6587\u4ef6\u6216\u5185\u5b58\u4e2d\u3002\u9996\u6b21\u8c03\u7528\u4e4b\u540e\uff0c\u6bcf\u6b21\u8c03\u7528\u90fd\u4ece\u6587\u4ef6\u8fd4\u56de\u4e00\u4e2a\u5143\u7ec4\u3002", "\u521d\u59cb\u72b6\u6001\uff1a\u5916\u4fa7\u5b50\u8282\u70b9\u5df2\u51c6\u5907\u597d\u8fd4\u56de\u7b2c\u4e00\u4e2a\u5143\u7ec4\u3002", "\u9996\u6b21\u6267\u884c\u65f6\uff0c\u4ece\u5916\u4fa7\u8ba1\u5212\u8bfb\u53d6\u5168\u90e8\u5143\u7ec4\u5e76\u4f20\u7ed9 tuplesort.c\uff1b\u540e\u7eed\u8c03\u7528\u53ea\u9700\u4ece tuplesort \u83b7\u53d6\u5143\u7ec4\u3002", "\u521b\u5efa\u5df2\u6392\u5e8f\u6570\u636e\u65f6\uff0c\u9700\u8981\u6cbf\u6b63\u5411\u626b\u63cf\u5b50\u8ba1\u5212\u3002", "\u4ece tuplesort \u83b7\u53d6\u7b2c\u4e00\u4e2a\u6216\u4e0b\u4e00\u4e2a\u5143\u7ec4\uff1b\u6ca1\u6709\u66f4\u591a\u5143\u7ec4\u65f6\u8fd4\u56de NULL\u3002\u6ce8\u610f\uff0c\u53ea\u4fdd\u8bc1\u69fd\u4e2d\u7684\u5143\u7ec4\u5728\u4e0b\u6b21\u4ece tuplesort \u83b7\u53d6\u5143\u7ec4\u4e4b\u524d\u6709\u6548\u3002"]}, {"code": "case T_Sort:\n\t\t\tpname = sname = \"Sort\";\n\t\t\tbreak;", "title": "\u6838\u5fc3\u6e90\u7801\u4e2d\u7684 EXPLAIN \u6807\u8bc6"}], "strategies": [], "description": ["\u6309\u8ba1\u5212\u6392\u5e8f\u952e\u5bf9\u5b50\u8ba1\u5212\u8f93\u51fa\u7684\u884c\u6392\u5e8f\u3002"], "localization": {"status": "complete", "sources": [], "language": "zh", "original_text": {"/versions/13/description/0": "Sorts rows from its child according to the plan sort keys.", "/versions/13/facts/0/label": "Core node tag", "/versions/13/facts/1/label": "Structured EXPLAIN Node Type", "/versions/13/facts/2/label": "Inputs", "/versions/13/facts/2/value": "One child plan", "/versions/13/facts/3/label": "Output", "/versions/13/facts/3/value": "Sorted tuples", "/versions/13/facts/4/label": "Executor initializer", "/versions/13/facts/5/label": "Memory mechanism", "/versions/13/tables/0/title": "EXPLAIN labels in this source build", "/versions/13/related/1/label": "Using EXPLAIN", "/versions/13/related/2/label": "Parallel plans", "/versions/13/sections/0/title": "EXPLAIN names and attributes", "/versions/13/sections/1/title": "Memory and temporary storage", "/versions/13/sections/2/title": "Parallel execution and instrumentation", "/versions/13/sections/3/title": "Same-version manual discussion", "/versions/13/sections/4/title": "Examples from this manual build", "/versions/13/sections/5/title": "Executor implementation notes", "/versions/13/sections/6/title": "EXPLAIN identity in core source", "/versions/13/memory/description": "The node passes work_mem to tuplesort. Sorting can use memory or temporary files; the actual method and space use depend on the input and plan.", "/versions/13/sections/0/paragraphs/0": "Structured formats use the Node Type above. Text-format spellings can also include operation, strategy, join type, scan direction or aggregation-stage attributes.", "/versions/13/sections/0/paragraphs/1": "Text names recorded by this source: Sort.", "/versions/13/sections/0/paragraphs/2": "Parallel-aware and parallel-safe are different plan properties. A node running inside a parallel worker is not necessarily a parallel-aware node.", "/versions/13/sections/1/paragraphs/0": "The node passes work_mem to tuplesort. Sorting can use memory or temporary files; the actual method and space use depend on the input and plan.", "/versions/13/sections/1/paragraphs/1": "Sorts tuples from the outer subtree of the node using tuplesort, which saves the results in a temporary file or memory. After the initial call, returns a tuple from the file with each call.", "/versions/13/sections/2/paragraphs/0": "The source callbacks below can coordinate execution or collect worker instrumentation. Their presence is not a blanket claim that this node supports a shared parallel scan or shared state.", "/versions/13/sections/2/paragraphs/1": "Callbacks in this build: ExecSortEstimate, ExecSortInitializeDSM, ExecSortInitializeWorker, ExecSortRetrieveInstrumentation.", "/versions/13/sections/3/paragraphs/0": "Estimated start-up cost. This is the time expended before the output phase can begin, e.g., time to do the sorting in a sort node.", "/versions/13/sections/3/paragraphs/1": "The planner may implement an ORDER BY clause in several ways. The above example shows that such an ordering clause may be implemented implicitly. The planner may also add an explicit sort step:", "/versions/13/sections/3/paragraphs/2": "If a part of the plan guarantees an ordering on a prefix of the required sort keys, then the planner may instead decide to use an incremental sort step:", "/versions/13/sections/3/paragraphs/3": "Merge join requires its input data to be sorted on the join keys. In this plan the tenk1 data is sorted by using an index scan to visit the rows in the correct order, but a sequential scan and sort is preferred for onek , because there are many more rows to be visited in that table. (Sequential-scan-and-sort frequently beats an index scan for sorting many rows, because of the nonsequential disk access required by the index scan.)", "/versions/13/sections/3/paragraphs/4": "One way to look at variant plans is to force the planner to disregard whatever strategy it thought was the cheapest, using the enable/disable flags described in Section 19.7.1 . (This is a crude tool, but useful. See also Section 14.3 .) For example, if we're unconvinced that sequential-scan-and-sort is the best way to deal with table onek in the previous example, we could try", "/versions/13/sections/3/paragraphs/5": "which shows that the planner thinks that sorting onek by index-scanning is about 12% more expensive than sequential-scan-and-sort. Of course, the next question is whether it's right about that. We can investigate that using EXPLAIN ANALYZE , as discussed below.", "/versions/13/sections/5/paragraphs/0": "Sorts tuples from the outer subtree of the node using tuplesort, which saves the results in a temporary file or memory. After the initial call, returns a tuple from the file with each call.", "/versions/13/sections/5/paragraphs/1": "Initial States: -- the outer child is prepared to return the first tuple.", "/versions/13/sections/5/paragraphs/2": "If first time through, read all tuples from outer plan and pass them to tuplesort.c. Subsequent calls just fetch tuples from tuplesort.", "/versions/13/sections/5/paragraphs/3": "Want to scan subplan in the forward direction while creating the sorted data.", "/versions/13/sections/5/paragraphs/4": "Get the first or next tuple from tuplesort. Returns NULL if no more tuples. Note that we only rely on slot tuple remaining valid until the next fetch from the tuplesort.", "/versions/13/tables/0/columns/0/label": "Text-format label", "/versions/13/tables/0/columns/1/label": "Structured node identity", "/versions/13/sections/4/blocks/0/paragraphs/0": "Example copied from the PostgreSQL 13.23 manual; it was not executed for this collection.", "/versions/13/sections/4/blocks/0/paragraphs/1": "The planner may implement an ORDER BY clause in several ways. The above example shows that such an ordering clause may be implemented implicitly. The planner may also add an explicit sort step:", "/versions/13/sections/4/blocks/1/paragraphs/0": "Example copied from the PostgreSQL 13.23 manual; it was not executed for this collection.", "/versions/13/sections/4/blocks/1/paragraphs/1": "If a part of the plan guarantees an ordering on a prefix of the required sort keys, then the planner may instead decide to use an incremental sort step:"}, "fallback_fields": [], "source_language": "en", "original_snapshot_sha256": "3bc83553de0b8a9965e857ebcb97a341711db21771888f706053eeb40e985d07"}, "evidence_kind": "source and documentation", "explain_names": ["Sort"], "partial_modes": [], "comparison_data": {"node_tag": "T_Sort", "strategies": [], "text_names": ["Sort"], "initializer": "ExecInitSort", "partial_modes": [], "memory_mechanism": "tuplesort", "parallel_callbacks": ["ExecSortEstimate", "ExecSortInitializeDSM", "ExecSortInitializeWorker", "ExecSortRetrieveInstrumentation"]}, "comparison_hash": "32a824f93669794b01449d5d8a08ff4edcb6024cb1a897131b35fe5cddc2e4da", "explain_prefixes": ["Parallel"], "runtime_verified": false, "source_inventory": {"explain": "src/backend/commands/explain.c", "executor": "src/backend/executor/execProcnode.c", "implementation": "src/backend/executor/nodeSort.c"}, "parallel_callbacks": ["ExecSortEstimate", "ExecSortInitializeDSM", "ExecSortInitializeWorker", "ExecSortRetrieveInstrumentation"]}, "14": {"facts": [{"label": "\u6838\u5fc3\u8282\u70b9\u6807\u7b7e", "value": "T_Sort"}, {"label": "\u7ed3\u6784\u5316 EXPLAIN \u8282\u70b9\u7c7b\u578b", "value": "Sort"}, {"label": "\u8f93\u5165", "value": "\u4e00\u4e2a\u5b50\u8ba1\u5212"}, {"label": "\u8f93\u51fa", "value": "\u5df2\u6392\u5e8f\u7684\u5143\u7ec4"}, {"label": "\u6267\u884c\u5668\u521d\u59cb\u5316\u51fd\u6570", "value": "ExecInitSort"}, {"label": "\u5185\u5b58\u673a\u5236", "value": "tuplesort"}], "memory": {"evidence": [{"url": "https://ftp.postgresql.org/pub/source/v14.24/postgresql-14.24.tar.bz2", "path": "src/backend/executor/nodeSort.c", "label": "src/backend/executor/nodeSort.c", "sha256": "7149bbdf7740b168958c625076853819ea5ab2ed7da71b190c7dabd7aae30f80", "archive_sha256": "a7fa7ed3d558172355f51406097a7bd4f6b473be80f311ef7cda96bf383d8897"}, {"url": "https://ftp.postgresql.org/pub/source/v14.24/postgresql-14.24.tar.bz2", "path": "src/backend/utils/sort/tuplesort.c", "label": "src/backend/utils/sort/tuplesort.c", "sha256": "2fd22829081aaa010d5026ea7d1cbff1a3b721d6a5210cae58b9a3d5992d9745", "archive_sha256": "a7fa7ed3d558172355f51406097a7bd4f6b473be80f311ef7cda96bf383d8897"}], "mechanism": "tuplesort", "description": "\u6b64\u8282\u70b9\u5c06 work_mem \u4f20\u7ed9 tuplesort\u3002\u6392\u5e8f\u53ef\u4f7f\u7528\u5185\u5b58\u6216\u4e34\u65f6\u6587\u4ef6\uff1b\u5b9e\u9645\u65b9\u6cd5\u548c\u7a7a\u95f4\u7528\u91cf\u53d6\u51b3\u4e8e\u8f93\u5165\u53ca\u8ba1\u5212\u3002", "source_notes": ["Sorts tuples from the outer subtree of the node using tuplesort, which saves the results in a temporary file or memory. After the initial call, returns a tuple from the file with each call."]}, "tables": [{"key": "explain-labels", "rows": [{"label": "Sort", "identity": "Sort"}], "title": "\u672c\u6784\u5efa\u4e2d\u7684 EXPLAIN \u6807\u7b7e", "columns": [{"key": "label", "label": "\u6587\u672c\u683c\u5f0f\u6807\u7b7e"}, {"key": "identity", "label": "\u7ed3\u6784\u5316\u8282\u70b9\u6807\u8bc6"}]}], "related": [{"url": "/wiki/sql/explain/?v=14", "label": "EXPLAIN"}, {"url": "/docs/14/using-explain.html", "label": "\u4f7f\u7528 EXPLAIN"}, {"url": "/docs/14/parallel-plans.html", "label": "\u5e76\u884c\u8ba1\u5212"}, {"url": "/wiki/guc/enable_sort/?v=14", "label": "enable_sort"}, {"url": "/wiki/guc/work_mem/?v=14", "label": "work_mem"}], "release": {"ref": "PostgreSQL 14.24 source archive", "label": "14.24", "major": "14", "channel": "stable", "revision": "a7fa7ed3d558172355f51406097a7bd4f6b473be80f311ef7cda96bf383d8897", "source_url": "https://ftp.postgresql.org/pub/source/v14.24/postgresql-14.24.tar.bz2", "source_snapshot_utc": ""}, "sources": [{"url": "https://ftp.postgresql.org/pub/source/v14.24/postgresql-14.24.tar.bz2", "line": 1312, "path": "src/backend/commands/explain.c", "label": "src/backend/commands/explain.c:1312", "sha256": "e091be4e2a083b8dea39ccd09beedede22c1716ef974da66c214a44f48be8c41", "archive_sha256": "a7fa7ed3d558172355f51406097a7bd4f6b473be80f311ef7cda96bf383d8897"}, {"url": "https://ftp.postgresql.org/pub/source/v14.24/postgresql-14.24.tar.bz2", "line": 320, "path": "src/backend/executor/execProcnode.c", "label": "src/backend/executor/execProcnode.c:320", "sha256": "72da1c5ad457f1d92a39ab73531701794df858419e3b89d6e6cb7079634e68fa", "archive_sha256": "a7fa7ed3d558172355f51406097a7bd4f6b473be80f311ef7cda96bf383d8897"}, {"url": "https://ftp.postgresql.org/pub/source/v14.24/postgresql-14.24.tar.bz2", "path": "src/backend/executor/nodeSort.c", "label": "src/backend/executor/nodeSort.c", "sha256": "7149bbdf7740b168958c625076853819ea5ab2ed7da71b190c7dabd7aae30f80", "archive_sha256": "a7fa7ed3d558172355f51406097a7bd4f6b473be80f311ef7cda96bf383d8897"}, {"url": "https://ftp.postgresql.org/pub/source/v14.24/postgresql-14.24.tar.bz2", "path": "src/include/nodes/plannodes.h", "label": "src/include/nodes/plannodes.h", "sha256": "302f51a16b570dba7ec4e7bc045f7df5800d21630280354d1a24025f3baec75d", "archive_sha256": "a7fa7ed3d558172355f51406097a7bd4f6b473be80f311ef7cda96bf383d8897"}, {"url": "https://ftp.postgresql.org/pub/source/v14.24/postgresql-14.24.tar.bz2", "path": "src/backend/utils/sort/tuplesort.c", "label": "src/backend/utils/sort/tuplesort.c", "sha256": "2fd22829081aaa010d5026ea7d1cbff1a3b721d6a5210cae58b9a3d5992d9745", "archive_sha256": "a7fa7ed3d558172355f51406097a7bd4f6b473be80f311ef7cda96bf383d8897"}, {"url": "https://pg.center/docs/14/using-explain.html#USING-EXPLAIN-BASICS", "path": "using-explain.html", "label": "PostgreSQL 14.24 \u00b7 using-explain", "sha256": "7f5ab59cb21a035ada45ea3426c5d1cca3f781273483677f73fdd76753555206", "language": "en", "original_url": "/docs/14/using-explain.html#USING-EXPLAIN-BASICS"}], "node_tag": "T_Sort", "sections": [{"title": "EXPLAIN \u540d\u79f0\u4e0e\u5c5e\u6027", "paragraphs": ["\u7ed3\u6784\u5316\u683c\u5f0f\u4f7f\u7528\u4e0a\u8ff0 Node Type\u3002\u6587\u672c\u683c\u5f0f\u540d\u79f0\u8fd8\u53ef\u80fd\u5305\u542b\u64cd\u4f5c\u3001\u7b56\u7565\u3001\u8fde\u63a5\u7c7b\u578b\u3001\u626b\u63cf\u65b9\u5411\u6216\u805a\u5408\u9636\u6bb5\u5c5e\u6027\u3002", "\u6b64\u6e90\u7801\u8bb0\u5f55\u7684\u6587\u672c\u540d\u79f0\uff1aSort.", "\u5e76\u884c\u611f\u77e5\u4e0e\u5e76\u884c\u5b89\u5168\u662f\u4e0d\u540c\u7684\u8ba1\u5212\u5c5e\u6027\u3002\u5728\u5e76\u884c\u5de5\u4f5c\u8fdb\u7a0b\u5185\u8fd0\u884c\u7684\u8282\u70b9\u4e0d\u4e00\u5b9a\u662f\u5e76\u884c\u611f\u77e5\u8282\u70b9\u3002"]}, {"title": "\u5185\u5b58\u4e0e\u4e34\u65f6\u5b58\u50a8", "paragraphs": ["\u6b64\u8282\u70b9\u5c06 work_mem \u4f20\u7ed9 tuplesort\u3002\u6392\u5e8f\u53ef\u4f7f\u7528\u5185\u5b58\u6216\u4e34\u65f6\u6587\u4ef6\uff1b\u5b9e\u9645\u65b9\u6cd5\u548c\u7a7a\u95f4\u7528\u91cf\u53d6\u51b3\u4e8e\u8f93\u5165\u53ca\u8ba1\u5212\u3002", "\u4f7f\u7528 tuplesort \u5bf9\u8282\u70b9\u5916\u4fa7\u5b50\u6811\u7684\u5143\u7ec4\u6392\u5e8f\uff0c\u5c06\u7ed3\u679c\u4fdd\u5b58\u5728\u4e34\u65f6\u6587\u4ef6\u6216\u5185\u5b58\u4e2d\u3002\u9996\u6b21\u8c03\u7528\u4e4b\u540e\uff0c\u6bcf\u6b21\u8c03\u7528\u90fd\u4ece\u6587\u4ef6\u8fd4\u56de\u4e00\u4e2a\u5143\u7ec4\u3002"]}, {"title": "\u5e76\u884c\u6267\u884c\u4e0e\u8fd0\u884c\u4fe1\u606f\u91c7\u96c6", "paragraphs": ["\u4ee5\u4e0b\u6e90\u7801\u56de\u8c03\u53ef\u4ee5\u534f\u8c03\u6267\u884c\u6216\u6536\u96c6\u5de5\u4f5c\u8fdb\u7a0b\u7684\u6d4b\u91cf\u6570\u636e\u3002\u56de\u8c03\u5b58\u5728\u4e0d\u4ee3\u8868\u8be5\u8282\u70b9\u666e\u904d\u652f\u6301\u5171\u4eab\u5e76\u884c\u626b\u63cf\u6216\u5171\u4eab\u72b6\u6001\u3002", "\u6b64\u6784\u5efa\u7684\u56de\u8c03\uff1aExecSortEstimate, ExecSortInitializeDSM, ExecSortInitializeWorker, ExecSortRetrieveInstrumentation."]}, {"title": "\u540c\u7248\u672c\u624b\u518c\u8bf4\u660e", "paragraphs": ["\u4f30\u8ba1\u542f\u52a8\u4ee3\u4ef7\uff1a\u8f93\u51fa\u9636\u6bb5\u5f00\u59cb\u4e4b\u524d\u6d88\u8017\u7684\u65f6\u95f4\uff0c\u4f8b\u5982\u6392\u5e8f\u8282\u70b9\u6267\u884c\u6392\u5e8f\u6240\u9700\u7684\u65f6\u95f4\u3002", "\u89c4\u5212\u5668\u53ef\u7528\u591a\u79cd\u65b9\u5f0f\u5b9e\u73b0 ORDER BY\u3002\u4e0a\u4f8b\u5c55\u793a\u4e86\u9690\u5f0f\u5b9e\u73b0\u6392\u5e8f\u7684\u65b9\u5f0f\uff1b\u89c4\u5212\u5668\u4e5f\u53ef\u4ee5\u6dfb\u52a0\u663e\u5f0f\u6392\u5e8f\u6b65\u9aa4\uff1a", "\u5982\u679c\u8ba1\u5212\u7684\u4e00\u90e8\u5206\u80fd\u4fdd\u8bc1\u8f93\u5165\u5df2\u6309\u6240\u9700\u6392\u5e8f\u952e\u7684\u524d\u7f00\u6392\u5e8f\uff0c\u89c4\u5212\u5668\u53ef\u80fd\u6539\u7528\u589e\u91cf\u6392\u5e8f\u6b65\u9aa4\uff1a", "\u5f52\u5e76\u8fde\u63a5\u8981\u6c42\u8f93\u5165\u6309\u8fde\u63a5\u952e\u6392\u5e8f\u3002\u6b64\u8ba1\u5212\u901a\u8fc7\u7d22\u5f15\u626b\u63cf\u6309\u987a\u5e8f\u8bfb\u53d6 tenk1\uff1b\u5bf9\u4e8e onek\uff0c\u5219\u503e\u5411\u4e8e\u987a\u5e8f\u626b\u63cf\u540e\u6392\u5e8f\uff0c\u56e0\u4e3a\u8be5\u8868\u8981\u8bbf\u95ee\u7684\u884c\u66f4\u591a\u3002\uff08\u5bf9\u5927\u91cf\u884c\u6392\u5e8f\u65f6\uff0c\u987a\u5e8f\u626b\u63cf\u52a0\u6392\u5e8f\u5e38\u5e38\u4f18\u4e8e\u7d22\u5f15\u626b\u63cf\uff0c\u56e0\u4e3a\u540e\u8005\u9700\u8981\u975e\u987a\u5e8f\u78c1\u76d8\u8bbf\u95ee\u3002\uff09", "\u8003\u5bdf\u5176\u4ed6\u8ba1\u5212\u7684\u4e00\u79cd\u65b9\u6cd5\uff0c\u662f\u7528\u7b2c 20.7.1 \u8282\u4e2d\u7684\u542f\u7528/\u7981\u7528\u6807\u5fd7\uff0c\u5f3a\u5236\u89c4\u5212\u5668\u5ffd\u7565\u5b83\u539f\u672c\u8ba4\u4e3a\u6210\u672c\u6700\u4f4e\u7684\u7b56\u7565\u3002\uff08\u8fd9\u79cd\u65b9\u6cd5\u6bd4\u8f83\u7c97\u7cd9\uff0c\u4f46\u5f88\u6709\u7528\uff1b\u53e6\u89c1\u7b2c 14.3 \u8282\u3002\uff09\u4f8b\u5982\uff0c\u82e5\u4e0d\u786e\u4fe1\u4e0a\u4f8b\u5904\u7406 onek \u7684\u6700\u4f73\u65b9\u5f0f\u662f\u987a\u5e8f\u626b\u63cf\u52a0\u6392\u5e8f\uff0c\u53ef\u4ee5\u5c1d\u8bd5\uff1a", "\u8fd9\u8bf4\u660e\u89c4\u5212\u5668\u8ba4\u4e3a\u901a\u8fc7\u7d22\u5f15\u626b\u63cf\u5bf9 onek \u6392\u5e8f\u7684\u6210\u672c\u6bd4\u987a\u5e8f\u626b\u63cf\u52a0\u6392\u5e8f\u9ad8\u7ea6 12%\u3002\u63a5\u4e0b\u6765\u5f53\u7136\u8981\u786e\u8ba4\u5b83\u5224\u65ad\u662f\u5426\u6b63\u786e\uff1b\u53ef\u4f7f\u7528\u4e0b\u6587\u4ecb\u7ecd\u7684 EXPLAIN ANALYZE \u6765\u9a8c\u8bc1\u3002"]}, {"title": "\u672c\u7248\u624b\u518c\u4e2d\u7684\u793a\u4f8b", "blocks": [{"code": "EXPLAIN SELECT * FROM tenk1 ORDER BY unique1;\n                            QUERY PLAN\n-------------------------------------------------------------------\n Sort  (cost=1109.39..1134.39 rows=10000 width=244)\n   Sort Key: unique1\n   ->  Seq Scan on tenk1  (cost=0.00..445.00 rows=10000 width=244)", "source": {"url": "/docs/14/using-explain.html#USING-EXPLAIN-BASICS", "path": "using-explain.html", "label": "PostgreSQL 14.24 \u00b7 using-explain", "sha256": "7f5ab59cb21a035ada45ea3426c5d1cca3f781273483677f73fdd76753555206"}, "paragraphs": ["\u793a\u4f8b\u6458\u81ea PostgreSQL 14.24 \u624b\u518c\uff1b\u672c\u767e\u79d1\u672a\u5b9e\u9645\u6267\u884c\u6b64\u793a\u4f8b\u3002", "\u89c4\u5212\u5668\u53ef\u7528\u591a\u79cd\u65b9\u5f0f\u5b9e\u73b0 ORDER BY\u3002\u4e0a\u4f8b\u5c55\u793a\u4e86\u9690\u5f0f\u5b9e\u73b0\u6392\u5e8f\u7684\u65b9\u5f0f\uff1b\u89c4\u5212\u5668\u4e5f\u53ef\u4ee5\u6dfb\u52a0\u663e\u5f0f\u6392\u5e8f\u6b65\u9aa4\uff1a"]}, {"code": "EXPLAIN SELECT * FROM tenk1 ORDER BY four, ten LIMIT 100;\n                                              QUERY PLAN\n------------------------------------------------------------------------------------------------------\n Limit  (cost=521.06..538.05 rows=100 width=244)\n   ->  Incremental Sort  (cost=521.06..2220.95 rows=10000 width=244)\n         Sort Key: four, ten\n         Presorted Key: four\n         ->  Index Scan using index_tenk1_on_four on tenk1  (cost=0.29..1510.08 rows=10000 width=244)", "source": {"url": "/docs/14/using-explain.html#USING-EXPLAIN-BASICS", "path": "using-explain.html", "label": "PostgreSQL 14.24 \u00b7 using-explain", "sha256": "7f5ab59cb21a035ada45ea3426c5d1cca3f781273483677f73fdd76753555206"}, "paragraphs": ["\u793a\u4f8b\u6458\u81ea PostgreSQL 14.24 \u624b\u518c\uff1b\u672c\u767e\u79d1\u672a\u5b9e\u9645\u6267\u884c\u6b64\u793a\u4f8b\u3002", "\u5982\u679c\u8ba1\u5212\u7684\u4e00\u90e8\u5206\u80fd\u4fdd\u8bc1\u8f93\u5165\u5df2\u6309\u6240\u9700\u6392\u5e8f\u952e\u7684\u524d\u7f00\u6392\u5e8f\uff0c\u89c4\u5212\u5668\u53ef\u80fd\u6539\u7528\u589e\u91cf\u6392\u5e8f\u6b65\u9aa4\uff1a"]}]}, {"title": "\u6267\u884c\u5668\u5b9e\u73b0\u8bf4\u660e", "paragraphs": ["\u4f7f\u7528 tuplesort \u5bf9\u8282\u70b9\u5916\u4fa7\u5b50\u6811\u7684\u5143\u7ec4\u6392\u5e8f\uff0c\u5c06\u7ed3\u679c\u4fdd\u5b58\u5728\u4e34\u65f6\u6587\u4ef6\u6216\u5185\u5b58\u4e2d\u3002\u9996\u6b21\u8c03\u7528\u4e4b\u540e\uff0c\u6bcf\u6b21\u8c03\u7528\u90fd\u4ece\u6587\u4ef6\u8fd4\u56de\u4e00\u4e2a\u5143\u7ec4\u3002", "\u521d\u59cb\u72b6\u6001\uff1a\u5916\u4fa7\u5b50\u8282\u70b9\u5df2\u51c6\u5907\u597d\u8fd4\u56de\u7b2c\u4e00\u4e2a\u5143\u7ec4\u3002", "\u9996\u6b21\u6267\u884c\u65f6\uff0c\u4ece\u5916\u4fa7\u8ba1\u5212\u8bfb\u53d6\u5168\u90e8\u5143\u7ec4\u5e76\u4f20\u7ed9 tuplesort.c\uff1b\u540e\u7eed\u8c03\u7528\u53ea\u9700\u4ece tuplesort \u83b7\u53d6\u5143\u7ec4\u3002", "\u521b\u5efa\u5df2\u6392\u5e8f\u6570\u636e\u65f6\uff0c\u9700\u8981\u6cbf\u6b63\u5411\u626b\u63cf\u5b50\u8ba1\u5212\u3002", "\u4ece tuplesort \u83b7\u53d6\u7b2c\u4e00\u4e2a\u6216\u4e0b\u4e00\u4e2a\u5143\u7ec4\uff1b\u6ca1\u6709\u66f4\u591a\u5143\u7ec4\u65f6\u8fd4\u56de NULL\u3002\u6ce8\u610f\uff0c\u53ea\u4fdd\u8bc1\u69fd\u4e2d\u7684\u5143\u7ec4\u5728\u4e0b\u6b21\u4ece tuplesort \u83b7\u53d6\u5143\u7ec4\u4e4b\u524d\u6709\u6548\u3002"]}, {"code": "case T_Sort:\n\t\t\tpname = sname = \"Sort\";\n\t\t\tbreak;", "title": "\u6838\u5fc3\u6e90\u7801\u4e2d\u7684 EXPLAIN \u6807\u8bc6"}], "strategies": [], "description": ["\u6309\u8ba1\u5212\u6392\u5e8f\u952e\u5bf9\u5b50\u8ba1\u5212\u8f93\u51fa\u7684\u884c\u6392\u5e8f\u3002"], "localization": {"status": "complete", "sources": [], "language": "zh", "original_text": {"/versions/14/description/0": "Sorts rows from its child according to the plan sort keys.", "/versions/14/facts/0/label": "Core node tag", "/versions/14/facts/1/label": "Structured EXPLAIN Node Type", "/versions/14/facts/2/label": "Inputs", "/versions/14/facts/2/value": "One child plan", "/versions/14/facts/3/label": "Output", "/versions/14/facts/3/value": "Sorted tuples", "/versions/14/facts/4/label": "Executor initializer", "/versions/14/facts/5/label": "Memory mechanism", "/versions/14/tables/0/title": "EXPLAIN labels in this source build", "/versions/14/related/1/label": "Using EXPLAIN", "/versions/14/related/2/label": "Parallel plans", "/versions/14/sections/0/title": "EXPLAIN names and attributes", "/versions/14/sections/1/title": "Memory and temporary storage", "/versions/14/sections/2/title": "Parallel execution and instrumentation", "/versions/14/sections/3/title": "Same-version manual discussion", "/versions/14/sections/4/title": "Examples from this manual build", "/versions/14/sections/5/title": "Executor implementation notes", "/versions/14/sections/6/title": "EXPLAIN identity in core source", "/versions/14/memory/description": "The node passes work_mem to tuplesort. Sorting can use memory or temporary files; the actual method and space use depend on the input and plan.", "/versions/14/sections/0/paragraphs/0": "Structured formats use the Node Type above. Text-format spellings can also include operation, strategy, join type, scan direction or aggregation-stage attributes.", "/versions/14/sections/0/paragraphs/1": "Text names recorded by this source: Sort.", "/versions/14/sections/0/paragraphs/2": "Parallel-aware and parallel-safe are different plan properties. A node running inside a parallel worker is not necessarily a parallel-aware node.", "/versions/14/sections/1/paragraphs/0": "The node passes work_mem to tuplesort. Sorting can use memory or temporary files; the actual method and space use depend on the input and plan.", "/versions/14/sections/1/paragraphs/1": "Sorts tuples from the outer subtree of the node using tuplesort, which saves the results in a temporary file or memory. After the initial call, returns a tuple from the file with each call.", "/versions/14/sections/2/paragraphs/0": "The source callbacks below can coordinate execution or collect worker instrumentation. Their presence is not a blanket claim that this node supports a shared parallel scan or shared state.", "/versions/14/sections/2/paragraphs/1": "Callbacks in this build: ExecSortEstimate, ExecSortInitializeDSM, ExecSortInitializeWorker, ExecSortRetrieveInstrumentation.", "/versions/14/sections/3/paragraphs/0": "Estimated start-up cost. This is the time expended before the output phase can begin, e.g., time to do the sorting in a sort node.", "/versions/14/sections/3/paragraphs/1": "The planner may implement an ORDER BY clause in several ways. The above example shows that such an ordering clause may be implemented implicitly. The planner may also add an explicit sort step:", "/versions/14/sections/3/paragraphs/2": "If a part of the plan guarantees an ordering on a prefix of the required sort keys, then the planner may instead decide to use an incremental sort step:", "/versions/14/sections/3/paragraphs/3": "Merge join requires its input data to be sorted on the join keys. In this plan the tenk1 data is sorted by using an index scan to visit the rows in the correct order, but a sequential scan and sort is preferred for onek , because there are many more rows to be visited in that table. (Sequential-scan-and-sort frequently beats an index scan for sorting many rows, because of the nonsequential disk access required by the index scan.)", "/versions/14/sections/3/paragraphs/4": "One way to look at variant plans is to force the planner to disregard whatever strategy it thought was the cheapest, using the enable/disable flags described in Section 20.7.1 . (This is a crude tool, but useful. See also Section 14.3 .) For example, if we're unconvinced that sequential-scan-and-sort is the best way to deal with table onek in the previous example, we could try", "/versions/14/sections/3/paragraphs/5": "which shows that the planner thinks that sorting onek by index-scanning is about 12% more expensive than sequential-scan-and-sort. Of course, the next question is whether it's right about that. We can investigate that using EXPLAIN ANALYZE , as discussed below.", "/versions/14/sections/5/paragraphs/0": "Sorts tuples from the outer subtree of the node using tuplesort, which saves the results in a temporary file or memory. After the initial call, returns a tuple from the file with each call.", "/versions/14/sections/5/paragraphs/1": "Initial States: -- the outer child is prepared to return the first tuple.", "/versions/14/sections/5/paragraphs/2": "If first time through, read all tuples from outer plan and pass them to tuplesort.c. Subsequent calls just fetch tuples from tuplesort.", "/versions/14/sections/5/paragraphs/3": "Want to scan subplan in the forward direction while creating the sorted data.", "/versions/14/sections/5/paragraphs/4": "Get the first or next tuple from tuplesort. Returns NULL if no more tuples. Note that we only rely on slot tuple remaining valid until the next fetch from the tuplesort.", "/versions/14/tables/0/columns/0/label": "Text-format label", "/versions/14/tables/0/columns/1/label": "Structured node identity", "/versions/14/sections/4/blocks/0/paragraphs/0": "Example copied from the PostgreSQL 14.24 manual; it was not executed for this collection.", "/versions/14/sections/4/blocks/0/paragraphs/1": "The planner may implement an ORDER BY clause in several ways. The above example shows that such an ordering clause may be implemented implicitly. The planner may also add an explicit sort step:", "/versions/14/sections/4/blocks/1/paragraphs/0": "Example copied from the PostgreSQL 14.24 manual; it was not executed for this collection.", "/versions/14/sections/4/blocks/1/paragraphs/1": "If a part of the plan guarantees an ordering on a prefix of the required sort keys, then the planner may instead decide to use an incremental sort step:"}, "fallback_fields": [], "source_language": "en", "original_snapshot_sha256": "1c7edda952db21843adbf34243868508876ccc9eaf0d76680a634bb3c8484efe"}, "evidence_kind": "source and documentation", "explain_names": ["Sort"], "partial_modes": [], "comparison_data": {"node_tag": "T_Sort", "strategies": [], "text_names": ["Sort"], "initializer": "ExecInitSort", "partial_modes": [], "memory_mechanism": "tuplesort", "parallel_callbacks": ["ExecSortEstimate", "ExecSortInitializeDSM", "ExecSortInitializeWorker", "ExecSortRetrieveInstrumentation"]}, "comparison_hash": "32a824f93669794b01449d5d8a08ff4edcb6024cb1a897131b35fe5cddc2e4da", "explain_prefixes": ["Parallel", "Async"], "runtime_verified": false, "source_inventory": {"explain": "src/backend/commands/explain.c", "executor": "src/backend/executor/execProcnode.c", "implementation": "src/backend/executor/nodeSort.c"}, "parallel_callbacks": ["ExecSortEstimate", "ExecSortInitializeDSM", "ExecSortInitializeWorker", "ExecSortRetrieveInstrumentation"]}, "15": {"facts": [{"label": "\u6838\u5fc3\u8282\u70b9\u6807\u7b7e", "value": "T_Sort"}, {"label": "\u7ed3\u6784\u5316 EXPLAIN \u8282\u70b9\u7c7b\u578b", "value": "Sort"}, {"label": "\u8f93\u5165", "value": "\u4e00\u4e2a\u5b50\u8ba1\u5212"}, {"label": "\u8f93\u51fa", "value": "\u5df2\u6392\u5e8f\u7684\u5143\u7ec4"}, {"label": "\u6267\u884c\u5668\u521d\u59cb\u5316\u51fd\u6570", "value": "ExecInitSort"}, {"label": "\u5185\u5b58\u673a\u5236", "value": "tuplesort"}], "memory": {"evidence": [{"url": "https://ftp.postgresql.org/pub/source/v15.19/postgresql-15.19.tar.bz2", "path": "src/backend/executor/nodeSort.c", "label": "src/backend/executor/nodeSort.c", "sha256": "87da5ee1b1e57137fce2ba3f735f90e3dd4b44eedd0d0d820e7bf81071628d30", "archive_sha256": "e1a64a87a46b825b88c082e4518161a47aab53c45694964f8ba1df28f7859f89"}, {"url": "https://ftp.postgresql.org/pub/source/v15.19/postgresql-15.19.tar.bz2", "path": "src/backend/utils/sort/tuplesort.c", "label": "src/backend/utils/sort/tuplesort.c", "sha256": "f1f95ed6d4bedca773aad26b93573b8b7b0c774b40560a1f4e21bd512d6530e4", "archive_sha256": "e1a64a87a46b825b88c082e4518161a47aab53c45694964f8ba1df28f7859f89"}], "mechanism": "tuplesort", "description": "\u6b64\u8282\u70b9\u5c06 work_mem \u4f20\u7ed9 tuplesort\u3002\u6392\u5e8f\u53ef\u4f7f\u7528\u5185\u5b58\u6216\u4e34\u65f6\u6587\u4ef6\uff1b\u5b9e\u9645\u65b9\u6cd5\u548c\u7a7a\u95f4\u7528\u91cf\u53d6\u51b3\u4e8e\u8f93\u5165\u53ca\u8ba1\u5212\u3002", "source_notes": ["Sorts tuples from the outer subtree of the node using tuplesort, which saves the results in a temporary file or memory. After the initial call, returns a tuple from the file with each call."]}, "tables": [{"key": "explain-labels", "rows": [{"label": "Sort", "identity": "Sort"}], "title": "\u672c\u6784\u5efa\u4e2d\u7684 EXPLAIN \u6807\u7b7e", "columns": [{"key": "label", "label": "\u6587\u672c\u683c\u5f0f\u6807\u7b7e"}, {"key": "identity", "label": "\u7ed3\u6784\u5316\u8282\u70b9\u6807\u8bc6"}]}], "related": [{"url": "/wiki/sql/explain/?v=15", "label": "EXPLAIN"}, {"url": "/docs/15/using-explain.html", "label": "\u4f7f\u7528 EXPLAIN"}, {"url": "/docs/15/parallel-plans.html", "label": "\u5e76\u884c\u8ba1\u5212"}, {"url": "/wiki/guc/enable_sort/?v=15", "label": "enable_sort"}, {"url": "/wiki/guc/work_mem/?v=15", "label": "work_mem"}], "release": {"ref": "PostgreSQL 15.19 source archive", "label": "15.19", "major": "15", "channel": "stable", "revision": "e1a64a87a46b825b88c082e4518161a47aab53c45694964f8ba1df28f7859f89", "source_url": "https://ftp.postgresql.org/pub/source/v15.19/postgresql-15.19.tar.bz2", "source_snapshot_utc": ""}, "sources": [{"url": "https://ftp.postgresql.org/pub/source/v15.19/postgresql-15.19.tar.bz2", "line": 1315, "path": "src/backend/commands/explain.c", "label": "src/backend/commands/explain.c:1315", "sha256": "bb3b442d0f1b098aa8707335250102f027a596cd94117308bd16d1d36b258f5c", "archive_sha256": "e1a64a87a46b825b88c082e4518161a47aab53c45694964f8ba1df28f7859f89"}, {"url": "https://ftp.postgresql.org/pub/source/v15.19/postgresql-15.19.tar.bz2", "line": 320, "path": "src/backend/executor/execProcnode.c", "label": "src/backend/executor/execProcnode.c:320", "sha256": "19836c50a272741a4eac653541e655437c2e00710a541e5348d6a277d0669d7c", "archive_sha256": "e1a64a87a46b825b88c082e4518161a47aab53c45694964f8ba1df28f7859f89"}, {"url": "https://ftp.postgresql.org/pub/source/v15.19/postgresql-15.19.tar.bz2", "path": "src/backend/executor/nodeSort.c", "label": "src/backend/executor/nodeSort.c", "sha256": "87da5ee1b1e57137fce2ba3f735f90e3dd4b44eedd0d0d820e7bf81071628d30", "archive_sha256": "e1a64a87a46b825b88c082e4518161a47aab53c45694964f8ba1df28f7859f89"}, {"url": "https://ftp.postgresql.org/pub/source/v15.19/postgresql-15.19.tar.bz2", "path": "src/include/nodes/plannodes.h", "label": "src/include/nodes/plannodes.h", "sha256": "fb4a4c8165495299131173680bc02a950d88e1ff610231fd97997bc0c9afc1d7", "archive_sha256": "e1a64a87a46b825b88c082e4518161a47aab53c45694964f8ba1df28f7859f89"}, {"url": "https://ftp.postgresql.org/pub/source/v15.19/postgresql-15.19.tar.bz2", "path": "src/backend/utils/sort/tuplesort.c", "label": "src/backend/utils/sort/tuplesort.c", "sha256": "f1f95ed6d4bedca773aad26b93573b8b7b0c774b40560a1f4e21bd512d6530e4", "archive_sha256": "e1a64a87a46b825b88c082e4518161a47aab53c45694964f8ba1df28f7859f89"}, {"url": "https://pg.center/docs/15/using-explain.html#USING-EXPLAIN-BASICS", "path": "using-explain.html", "label": "PostgreSQL 15.19 \u00b7 using-explain", "sha256": "d1f509457c647da453d2575c772d91022a0f115dd84f9a3b20f5ff25a243648f", "language": "en", "original_url": "/docs/15/using-explain.html#USING-EXPLAIN-BASICS"}], "node_tag": "T_Sort", "sections": [{"title": "EXPLAIN \u540d\u79f0\u4e0e\u5c5e\u6027", "paragraphs": ["\u7ed3\u6784\u5316\u683c\u5f0f\u4f7f\u7528\u4e0a\u8ff0 Node Type\u3002\u6587\u672c\u683c\u5f0f\u540d\u79f0\u8fd8\u53ef\u80fd\u5305\u542b\u64cd\u4f5c\u3001\u7b56\u7565\u3001\u8fde\u63a5\u7c7b\u578b\u3001\u626b\u63cf\u65b9\u5411\u6216\u805a\u5408\u9636\u6bb5\u5c5e\u6027\u3002", "\u6b64\u6e90\u7801\u8bb0\u5f55\u7684\u6587\u672c\u540d\u79f0\uff1aSort.", "\u5e76\u884c\u611f\u77e5\u4e0e\u5e76\u884c\u5b89\u5168\u662f\u4e0d\u540c\u7684\u8ba1\u5212\u5c5e\u6027\u3002\u5728\u5e76\u884c\u5de5\u4f5c\u8fdb\u7a0b\u5185\u8fd0\u884c\u7684\u8282\u70b9\u4e0d\u4e00\u5b9a\u662f\u5e76\u884c\u611f\u77e5\u8282\u70b9\u3002"]}, {"title": "\u5185\u5b58\u4e0e\u4e34\u65f6\u5b58\u50a8", "paragraphs": ["\u6b64\u8282\u70b9\u5c06 work_mem \u4f20\u7ed9 tuplesort\u3002\u6392\u5e8f\u53ef\u4f7f\u7528\u5185\u5b58\u6216\u4e34\u65f6\u6587\u4ef6\uff1b\u5b9e\u9645\u65b9\u6cd5\u548c\u7a7a\u95f4\u7528\u91cf\u53d6\u51b3\u4e8e\u8f93\u5165\u53ca\u8ba1\u5212\u3002", "\u4f7f\u7528 tuplesort \u5bf9\u8282\u70b9\u5916\u4fa7\u5b50\u6811\u7684\u5143\u7ec4\u6392\u5e8f\uff0c\u5c06\u7ed3\u679c\u4fdd\u5b58\u5728\u4e34\u65f6\u6587\u4ef6\u6216\u5185\u5b58\u4e2d\u3002\u9996\u6b21\u8c03\u7528\u4e4b\u540e\uff0c\u6bcf\u6b21\u8c03\u7528\u90fd\u4ece\u6587\u4ef6\u8fd4\u56de\u4e00\u4e2a\u5143\u7ec4\u3002"]}, {"title": "\u5e76\u884c\u6267\u884c\u4e0e\u8fd0\u884c\u4fe1\u606f\u91c7\u96c6", "paragraphs": ["\u4ee5\u4e0b\u6e90\u7801\u56de\u8c03\u53ef\u4ee5\u534f\u8c03\u6267\u884c\u6216\u6536\u96c6\u5de5\u4f5c\u8fdb\u7a0b\u7684\u6d4b\u91cf\u6570\u636e\u3002\u56de\u8c03\u5b58\u5728\u4e0d\u4ee3\u8868\u8be5\u8282\u70b9\u666e\u904d\u652f\u6301\u5171\u4eab\u5e76\u884c\u626b\u63cf\u6216\u5171\u4eab\u72b6\u6001\u3002", "\u6b64\u6784\u5efa\u7684\u56de\u8c03\uff1aExecSortEstimate, ExecSortInitializeDSM, ExecSortInitializeWorker, ExecSortRetrieveInstrumentation."]}, {"title": "\u540c\u7248\u672c\u624b\u518c\u8bf4\u660e", "paragraphs": ["\u4f30\u8ba1\u542f\u52a8\u4ee3\u4ef7\uff1a\u8f93\u51fa\u9636\u6bb5\u5f00\u59cb\u4e4b\u524d\u6d88\u8017\u7684\u65f6\u95f4\uff0c\u4f8b\u5982\u6392\u5e8f\u8282\u70b9\u6267\u884c\u6392\u5e8f\u6240\u9700\u7684\u65f6\u95f4\u3002", "\u89c4\u5212\u5668\u53ef\u7528\u591a\u79cd\u65b9\u5f0f\u5b9e\u73b0 ORDER BY\u3002\u4e0a\u4f8b\u5c55\u793a\u4e86\u9690\u5f0f\u5b9e\u73b0\u6392\u5e8f\u7684\u65b9\u5f0f\uff1b\u89c4\u5212\u5668\u4e5f\u53ef\u4ee5\u6dfb\u52a0\u663e\u5f0f\u6392\u5e8f\u6b65\u9aa4\uff1a", "\u5982\u679c\u8ba1\u5212\u7684\u4e00\u90e8\u5206\u80fd\u4fdd\u8bc1\u8f93\u5165\u5df2\u6309\u6240\u9700\u6392\u5e8f\u952e\u7684\u524d\u7f00\u6392\u5e8f\uff0c\u89c4\u5212\u5668\u53ef\u80fd\u6539\u7528\u589e\u91cf\u6392\u5e8f\u6b65\u9aa4\uff1a", "\u5f52\u5e76\u8fde\u63a5\u8981\u6c42\u8f93\u5165\u6309\u8fde\u63a5\u952e\u6392\u5e8f\u3002\u6b64\u8ba1\u5212\u901a\u8fc7\u7d22\u5f15\u626b\u63cf\u6309\u987a\u5e8f\u8bfb\u53d6 tenk1\uff1b\u5bf9\u4e8e onek\uff0c\u5219\u503e\u5411\u4e8e\u987a\u5e8f\u626b\u63cf\u540e\u6392\u5e8f\uff0c\u56e0\u4e3a\u8be5\u8868\u8981\u8bbf\u95ee\u7684\u884c\u66f4\u591a\u3002\uff08\u5bf9\u5927\u91cf\u884c\u6392\u5e8f\u65f6\uff0c\u987a\u5e8f\u626b\u63cf\u52a0\u6392\u5e8f\u5e38\u5e38\u4f18\u4e8e\u7d22\u5f15\u626b\u63cf\uff0c\u56e0\u4e3a\u540e\u8005\u9700\u8981\u975e\u987a\u5e8f\u78c1\u76d8\u8bbf\u95ee\u3002\uff09", "\u8003\u5bdf\u5176\u4ed6\u8ba1\u5212\u7684\u4e00\u79cd\u65b9\u6cd5\uff0c\u662f\u7528\u7b2c 20.7.1 \u8282\u4e2d\u7684\u542f\u7528/\u7981\u7528\u6807\u5fd7\uff0c\u5f3a\u5236\u89c4\u5212\u5668\u5ffd\u7565\u5b83\u539f\u672c\u8ba4\u4e3a\u6210\u672c\u6700\u4f4e\u7684\u7b56\u7565\u3002\uff08\u8fd9\u79cd\u65b9\u6cd5\u6bd4\u8f83\u7c97\u7cd9\uff0c\u4f46\u5f88\u6709\u7528\uff1b\u53e6\u89c1\u7b2c 14.3 \u8282\u3002\uff09\u4f8b\u5982\uff0c\u82e5\u4e0d\u786e\u4fe1\u4e0a\u4f8b\u5904\u7406 onek \u7684\u6700\u4f73\u65b9\u5f0f\u662f\u987a\u5e8f\u626b\u63cf\u52a0\u6392\u5e8f\uff0c\u53ef\u4ee5\u5c1d\u8bd5\uff1a", "\u8fd9\u8bf4\u660e\u89c4\u5212\u5668\u8ba4\u4e3a\u901a\u8fc7\u7d22\u5f15\u626b\u63cf\u5bf9 onek \u6392\u5e8f\u7684\u6210\u672c\u6bd4\u987a\u5e8f\u626b\u63cf\u52a0\u6392\u5e8f\u9ad8\u7ea6 12%\u3002\u63a5\u4e0b\u6765\u5f53\u7136\u8981\u786e\u8ba4\u5b83\u5224\u65ad\u662f\u5426\u6b63\u786e\uff1b\u53ef\u4f7f\u7528\u4e0b\u6587\u4ecb\u7ecd\u7684 EXPLAIN ANALYZE \u6765\u9a8c\u8bc1\u3002"]}, {"title": "\u672c\u7248\u624b\u518c\u4e2d\u7684\u793a\u4f8b", "blocks": [{"code": "EXPLAIN SELECT * FROM tenk1 ORDER BY unique1;\n                            QUERY PLAN\n-------------------------------------------------------------------\n Sort  (cost=1109.39..1134.39 rows=10000 width=244)\n   Sort Key: unique1\n   ->  Seq Scan on tenk1  (cost=0.00..445.00 rows=10000 width=244)", "source": {"url": "/docs/15/using-explain.html#USING-EXPLAIN-BASICS", "path": "using-explain.html", "label": "PostgreSQL 15.19 \u00b7 using-explain", "sha256": "d1f509457c647da453d2575c772d91022a0f115dd84f9a3b20f5ff25a243648f"}, "paragraphs": ["\u793a\u4f8b\u6458\u81ea PostgreSQL 15.19 \u624b\u518c\uff1b\u672c\u767e\u79d1\u672a\u5b9e\u9645\u6267\u884c\u6b64\u793a\u4f8b\u3002", "\u89c4\u5212\u5668\u53ef\u7528\u591a\u79cd\u65b9\u5f0f\u5b9e\u73b0 ORDER BY\u3002\u4e0a\u4f8b\u5c55\u793a\u4e86\u9690\u5f0f\u5b9e\u73b0\u6392\u5e8f\u7684\u65b9\u5f0f\uff1b\u89c4\u5212\u5668\u4e5f\u53ef\u4ee5\u6dfb\u52a0\u663e\u5f0f\u6392\u5e8f\u6b65\u9aa4\uff1a"]}, {"code": "EXPLAIN SELECT * FROM tenk1 ORDER BY four, ten LIMIT 100;\n                                              QUERY PLAN\n------------------------------------------------------------------------------------------------------\n Limit  (cost=521.06..538.05 rows=100 width=244)\n   ->  Incremental Sort  (cost=521.06..2220.95 rows=10000 width=244)\n         Sort Key: four, ten\n         Presorted Key: four\n         ->  Index Scan using index_tenk1_on_four on tenk1  (cost=0.29..1510.08 rows=10000 width=244)", "source": {"url": "/docs/15/using-explain.html#USING-EXPLAIN-BASICS", "path": "using-explain.html", "label": "PostgreSQL 15.19 \u00b7 using-explain", "sha256": "d1f509457c647da453d2575c772d91022a0f115dd84f9a3b20f5ff25a243648f"}, "paragraphs": ["\u793a\u4f8b\u6458\u81ea PostgreSQL 15.19 \u624b\u518c\uff1b\u672c\u767e\u79d1\u672a\u5b9e\u9645\u6267\u884c\u6b64\u793a\u4f8b\u3002", "\u5982\u679c\u8ba1\u5212\u7684\u4e00\u90e8\u5206\u80fd\u4fdd\u8bc1\u8f93\u5165\u5df2\u6309\u6240\u9700\u6392\u5e8f\u952e\u7684\u524d\u7f00\u6392\u5e8f\uff0c\u89c4\u5212\u5668\u53ef\u80fd\u6539\u7528\u589e\u91cf\u6392\u5e8f\u6b65\u9aa4\uff1a"]}]}, {"title": "\u6267\u884c\u5668\u5b9e\u73b0\u8bf4\u660e", "paragraphs": ["\u4f7f\u7528 tuplesort \u5bf9\u8282\u70b9\u5916\u4fa7\u5b50\u6811\u7684\u5143\u7ec4\u6392\u5e8f\uff0c\u5c06\u7ed3\u679c\u4fdd\u5b58\u5728\u4e34\u65f6\u6587\u4ef6\u6216\u5185\u5b58\u4e2d\u3002\u9996\u6b21\u8c03\u7528\u4e4b\u540e\uff0c\u6bcf\u6b21\u8c03\u7528\u90fd\u4ece\u6587\u4ef6\u8fd4\u56de\u4e00\u4e2a\u5143\u7ec4\u3002", "\u6b64\u6392\u5e8f\u53ef\u7528\u4e24\u79cd\u4e0d\u540c\u65b9\u5f0f\u6267\u884c\uff1a", "1\uff09\u7ed3\u679c\u53ea\u6709\u4e00\u5217\u65f6\uff0c\u6267\u884c Datum \u6392\u5e8f\u3002", "2\uff09\u7ed3\u679c\u5305\u542b\u591a\u5217\u65f6\uff0c\u6267\u884c\u5143\u7ec4\u6392\u5e8f\u3002", "\u4e5f\u53ef\u4ee5\u59cb\u7ec8\u6267\u884c\u5143\u7ec4\u6392\u5e8f\uff0c\u4f46\u4ec5\u5bf9 Datum \u6392\u5e8f\u53ef\u80fd\u663e\u8457\u66f4\u5feb\uff0c\u5c24\u5176\u5f53 Datum \u5c5e\u4e8e\u6309\u503c\u4f20\u9012\u7684\u7c7b\u578b\u65f6\u3002"]}, {"code": "case T_Sort:\n\t\t\tpname = sname = \"Sort\";\n\t\t\tbreak;", "title": "\u6838\u5fc3\u6e90\u7801\u4e2d\u7684 EXPLAIN \u6807\u8bc6"}], "strategies": [], "description": ["\u6309\u8ba1\u5212\u6392\u5e8f\u952e\u5bf9\u5b50\u8ba1\u5212\u8f93\u51fa\u7684\u884c\u6392\u5e8f\u3002"], "localization": {"status": "complete", "sources": [], "language": "zh", "original_text": {"/versions/15/description/0": "Sorts rows from its child according to the plan sort keys.", "/versions/15/facts/0/label": "Core node tag", "/versions/15/facts/1/label": "Structured EXPLAIN Node Type", "/versions/15/facts/2/label": "Inputs", "/versions/15/facts/2/value": "One child plan", "/versions/15/facts/3/label": "Output", "/versions/15/facts/3/value": "Sorted tuples", "/versions/15/facts/4/label": "Executor initializer", "/versions/15/facts/5/label": "Memory mechanism", "/versions/15/tables/0/title": "EXPLAIN labels in this source build", "/versions/15/related/1/label": "Using EXPLAIN", "/versions/15/related/2/label": "Parallel plans", "/versions/15/sections/0/title": "EXPLAIN names and attributes", "/versions/15/sections/1/title": "Memory and temporary storage", "/versions/15/sections/2/title": "Parallel execution and instrumentation", "/versions/15/sections/3/title": "Same-version manual discussion", "/versions/15/sections/4/title": "Examples from this manual build", "/versions/15/sections/5/title": "Executor implementation notes", "/versions/15/sections/6/title": "EXPLAIN identity in core source", "/versions/15/memory/description": "The node passes work_mem to tuplesort. Sorting can use memory or temporary files; the actual method and space use depend on the input and plan.", "/versions/15/sections/0/paragraphs/0": "Structured formats use the Node Type above. Text-format spellings can also include operation, strategy, join type, scan direction or aggregation-stage attributes.", "/versions/15/sections/0/paragraphs/1": "Text names recorded by this source: Sort.", "/versions/15/sections/0/paragraphs/2": "Parallel-aware and parallel-safe are different plan properties. A node running inside a parallel worker is not necessarily a parallel-aware node.", "/versions/15/sections/1/paragraphs/0": "The node passes work_mem to tuplesort. Sorting can use memory or temporary files; the actual method and space use depend on the input and plan.", "/versions/15/sections/1/paragraphs/1": "Sorts tuples from the outer subtree of the node using tuplesort, which saves the results in a temporary file or memory. After the initial call, returns a tuple from the file with each call.", "/versions/15/sections/2/paragraphs/0": "The source callbacks below can coordinate execution or collect worker instrumentation. Their presence is not a blanket claim that this node supports a shared parallel scan or shared state.", "/versions/15/sections/2/paragraphs/1": "Callbacks in this build: ExecSortEstimate, ExecSortInitializeDSM, ExecSortInitializeWorker, ExecSortRetrieveInstrumentation.", "/versions/15/sections/3/paragraphs/0": "Estimated start-up cost. This is the time expended before the output phase can begin, e.g., time to do the sorting in a sort node.", "/versions/15/sections/3/paragraphs/1": "The planner may implement an ORDER BY clause in several ways. The above example shows that such an ordering clause may be implemented implicitly. The planner may also add an explicit sort step:", "/versions/15/sections/3/paragraphs/2": "If a part of the plan guarantees an ordering on a prefix of the required sort keys, then the planner may instead decide to use an incremental sort step:", "/versions/15/sections/3/paragraphs/3": "Merge join requires its input data to be sorted on the join keys. In this plan the tenk1 data is sorted by using an index scan to visit the rows in the correct order, but a sequential scan and sort is preferred for onek , because there are many more rows to be visited in that table. (Sequential-scan-and-sort frequently beats an index scan for sorting many rows, because of the nonsequential disk access required by the index scan.)", "/versions/15/sections/3/paragraphs/4": "One way to look at variant plans is to force the planner to disregard whatever strategy it thought was the cheapest, using the enable/disable flags described in Section 20.7.1 . (This is a crude tool, but useful. See also Section 14.3 .) For example, if we're unconvinced that sequential-scan-and-sort is the best way to deal with table onek in the previous example, we could try", "/versions/15/sections/3/paragraphs/5": "which shows that the planner thinks that sorting onek by index-scanning is about 12% more expensive than sequential-scan-and-sort. Of course, the next question is whether it's right about that. We can investigate that using EXPLAIN ANALYZE , as discussed below.", "/versions/15/sections/5/paragraphs/0": "Sorts tuples from the outer subtree of the node using tuplesort, which saves the results in a temporary file or memory. After the initial call, returns a tuple from the file with each call.", "/versions/15/sections/5/paragraphs/1": "There are two distinct ways that this sort can be performed:", "/versions/15/sections/5/paragraphs/2": "1) When the result is a single column we perform a Datum sort.", "/versions/15/sections/5/paragraphs/3": "2) When the result contains multiple columns we perform a tuple sort.", "/versions/15/sections/5/paragraphs/4": "We could do this by always performing a tuple sort, however sorting Datums only can be significantly faster than sorting tuples, especially when the Datums are of a pass-by-value type.", "/versions/15/tables/0/columns/0/label": "Text-format label", "/versions/15/tables/0/columns/1/label": "Structured node identity", "/versions/15/sections/4/blocks/0/paragraphs/0": "Example copied from the PostgreSQL 15.19 manual; it was not executed for this collection.", "/versions/15/sections/4/blocks/0/paragraphs/1": "The planner may implement an ORDER BY clause in several ways. The above example shows that such an ordering clause may be implemented implicitly. The planner may also add an explicit sort step:", "/versions/15/sections/4/blocks/1/paragraphs/0": "Example copied from the PostgreSQL 15.19 manual; it was not executed for this collection.", "/versions/15/sections/4/blocks/1/paragraphs/1": "If a part of the plan guarantees an ordering on a prefix of the required sort keys, then the planner may instead decide to use an incremental sort step:"}, "fallback_fields": [], "source_language": "en", "original_snapshot_sha256": "0d88fb639eae54a4ece31ffc9d403094486c1bdd215168d6b664e5a38845e9da"}, "evidence_kind": "source and documentation", "explain_names": ["Sort"], "partial_modes": [], "comparison_data": {"node_tag": "T_Sort", "strategies": [], "text_names": ["Sort"], "initializer": "ExecInitSort", "partial_modes": [], "memory_mechanism": "tuplesort", "parallel_callbacks": ["ExecSortEstimate", "ExecSortInitializeDSM", "ExecSortInitializeWorker", "ExecSortRetrieveInstrumentation"]}, "comparison_hash": "32a824f93669794b01449d5d8a08ff4edcb6024cb1a897131b35fe5cddc2e4da", "explain_prefixes": ["Parallel", "Async"], "runtime_verified": false, "source_inventory": {"explain": "src/backend/commands/explain.c", "executor": "src/backend/executor/execProcnode.c", "implementation": "src/backend/executor/nodeSort.c"}, "parallel_callbacks": ["ExecSortEstimate", "ExecSortInitializeDSM", "ExecSortInitializeWorker", "ExecSortRetrieveInstrumentation"]}, "16": {"facts": [{"label": "\u6838\u5fc3\u8282\u70b9\u6807\u7b7e", "value": "T_Sort"}, {"label": "\u7ed3\u6784\u5316 EXPLAIN \u8282\u70b9\u7c7b\u578b", "value": "Sort"}, {"label": "\u8f93\u5165", "value": "\u4e00\u4e2a\u5b50\u8ba1\u5212"}, {"label": "\u8f93\u51fa", "value": "\u5df2\u6392\u5e8f\u7684\u5143\u7ec4"}, {"label": "\u6267\u884c\u5668\u521d\u59cb\u5316\u51fd\u6570", "value": "ExecInitSort"}, {"label": "\u5185\u5b58\u673a\u5236", "value": "tuplesort"}], "memory": {"evidence": [{"url": "https://ftp.postgresql.org/pub/source/v16.15/postgresql-16.15.tar.bz2", "path": "src/backend/executor/nodeSort.c", "label": "src/backend/executor/nodeSort.c", "sha256": "e2e40c389e08a10986ca6f6a70367388a74121c890ecb8d478f9dc6b35769afb", "archive_sha256": "c1575341fa7bd40f5274ea465b34390f4dc64cdd0770af327005caaeb9f6b7ed"}, {"url": "https://ftp.postgresql.org/pub/source/v16.15/postgresql-16.15.tar.bz2", "path": "src/backend/utils/sort/tuplesort.c", "label": "src/backend/utils/sort/tuplesort.c", "sha256": "cd9bf1be7bf73177a3c70e5daedd027c78d5ba8585652ed48750281e4af85af3", "archive_sha256": "c1575341fa7bd40f5274ea465b34390f4dc64cdd0770af327005caaeb9f6b7ed"}], "mechanism": "tuplesort", "description": "\u6b64\u8282\u70b9\u5c06 work_mem \u4f20\u7ed9 tuplesort\u3002\u6392\u5e8f\u53ef\u4f7f\u7528\u5185\u5b58\u6216\u4e34\u65f6\u6587\u4ef6\uff1b\u5b9e\u9645\u65b9\u6cd5\u548c\u7a7a\u95f4\u7528\u91cf\u53d6\u51b3\u4e8e\u8f93\u5165\u53ca\u8ba1\u5212\u3002", "source_notes": ["Sorts tuples from the outer subtree of the node using tuplesort, which saves the results in a temporary file or memory. After the initial call, returns a tuple from the file with each call."]}, "tables": [{"key": "explain-labels", "rows": [{"label": "Sort", "identity": "Sort"}], "title": "\u672c\u6784\u5efa\u4e2d\u7684 EXPLAIN \u6807\u7b7e", "columns": [{"key": "label", "label": "\u6587\u672c\u683c\u5f0f\u6807\u7b7e"}, {"key": "identity", "label": "\u7ed3\u6784\u5316\u8282\u70b9\u6807\u8bc6"}]}], "related": [{"url": "/wiki/sql/explain/?v=16", "label": "EXPLAIN"}, {"url": "/docs/16/using-explain.html", "label": "\u4f7f\u7528 EXPLAIN"}, {"url": "/docs/16/parallel-plans.html", "label": "\u5e76\u884c\u8ba1\u5212"}, {"url": "/wiki/guc/enable_sort/?v=16", "label": "enable_sort"}, {"url": "/wiki/guc/work_mem/?v=16", "label": "work_mem"}], "release": {"ref": "PostgreSQL 16.15 source archive", "label": "16.15", "major": "16", "channel": "stable", "revision": "c1575341fa7bd40f5274ea465b34390f4dc64cdd0770af327005caaeb9f6b7ed", "source_url": "https://ftp.postgresql.org/pub/source/v16.15/postgresql-16.15.tar.bz2", "source_snapshot_utc": ""}, "sources": [{"url": "https://ftp.postgresql.org/pub/source/v16.15/postgresql-16.15.tar.bz2", "line": 1348, "path": "src/backend/commands/explain.c", "label": "src/backend/commands/explain.c:1348", "sha256": "8e017f0116dbea471339b40c37a667cc9f95039e7e0329c783e5e8ce194de7e1", "archive_sha256": "c1575341fa7bd40f5274ea465b34390f4dc64cdd0770af327005caaeb9f6b7ed"}, {"url": "https://ftp.postgresql.org/pub/source/v16.15/postgresql-16.15.tar.bz2", "line": 320, "path": "src/backend/executor/execProcnode.c", "label": "src/backend/executor/execProcnode.c:320", "sha256": "e48c08e555f8cb4e4bb43df516c4b8906ce9bc374b2a745d98a1fc8c22cc5099", "archive_sha256": "c1575341fa7bd40f5274ea465b34390f4dc64cdd0770af327005caaeb9f6b7ed"}, {"url": "https://ftp.postgresql.org/pub/source/v16.15/postgresql-16.15.tar.bz2", "path": "src/backend/executor/nodeSort.c", "label": "src/backend/executor/nodeSort.c", "sha256": "e2e40c389e08a10986ca6f6a70367388a74121c890ecb8d478f9dc6b35769afb", "archive_sha256": "c1575341fa7bd40f5274ea465b34390f4dc64cdd0770af327005caaeb9f6b7ed"}, {"url": "https://ftp.postgresql.org/pub/source/v16.15/postgresql-16.15.tar.bz2", "path": "src/include/nodes/plannodes.h", "label": "src/include/nodes/plannodes.h", "sha256": "97db47353db76326b874589a5ad0a04501cc74cd72e237e7bd956e7472c41f1f", "archive_sha256": "c1575341fa7bd40f5274ea465b34390f4dc64cdd0770af327005caaeb9f6b7ed"}, {"url": "https://ftp.postgresql.org/pub/source/v16.15/postgresql-16.15.tar.bz2", "path": "src/backend/utils/sort/tuplesort.c", "label": "src/backend/utils/sort/tuplesort.c", "sha256": "cd9bf1be7bf73177a3c70e5daedd027c78d5ba8585652ed48750281e4af85af3", "archive_sha256": "c1575341fa7bd40f5274ea465b34390f4dc64cdd0770af327005caaeb9f6b7ed"}, {"url": "https://pg.center/docs/16/using-explain.html#USING-EXPLAIN-BASICS", "path": "using-explain.html", "label": "PostgreSQL 16.15 \u00b7 using-explain", "sha256": "bd8b86e5281cf0e52ad6e0e4bb8b6ff6510dac61982b44f0c1dd07d54012db3c", "language": "en", "original_url": "/docs/16/using-explain.html#USING-EXPLAIN-BASICS"}], "node_tag": "T_Sort", "sections": [{"title": "EXPLAIN \u540d\u79f0\u4e0e\u5c5e\u6027", "paragraphs": ["\u7ed3\u6784\u5316\u683c\u5f0f\u4f7f\u7528\u4e0a\u8ff0 Node Type\u3002\u6587\u672c\u683c\u5f0f\u540d\u79f0\u8fd8\u53ef\u80fd\u5305\u542b\u64cd\u4f5c\u3001\u7b56\u7565\u3001\u8fde\u63a5\u7c7b\u578b\u3001\u626b\u63cf\u65b9\u5411\u6216\u805a\u5408\u9636\u6bb5\u5c5e\u6027\u3002", "\u6b64\u6e90\u7801\u8bb0\u5f55\u7684\u6587\u672c\u540d\u79f0\uff1aSort.", "\u5e76\u884c\u611f\u77e5\u4e0e\u5e76\u884c\u5b89\u5168\u662f\u4e0d\u540c\u7684\u8ba1\u5212\u5c5e\u6027\u3002\u5728\u5e76\u884c\u5de5\u4f5c\u8fdb\u7a0b\u5185\u8fd0\u884c\u7684\u8282\u70b9\u4e0d\u4e00\u5b9a\u662f\u5e76\u884c\u611f\u77e5\u8282\u70b9\u3002"]}, {"title": "\u5185\u5b58\u4e0e\u4e34\u65f6\u5b58\u50a8", "paragraphs": ["\u6b64\u8282\u70b9\u5c06 work_mem \u4f20\u7ed9 tuplesort\u3002\u6392\u5e8f\u53ef\u4f7f\u7528\u5185\u5b58\u6216\u4e34\u65f6\u6587\u4ef6\uff1b\u5b9e\u9645\u65b9\u6cd5\u548c\u7a7a\u95f4\u7528\u91cf\u53d6\u51b3\u4e8e\u8f93\u5165\u53ca\u8ba1\u5212\u3002", "\u4f7f\u7528 tuplesort \u5bf9\u8282\u70b9\u5916\u4fa7\u5b50\u6811\u7684\u5143\u7ec4\u6392\u5e8f\uff0c\u5c06\u7ed3\u679c\u4fdd\u5b58\u5728\u4e34\u65f6\u6587\u4ef6\u6216\u5185\u5b58\u4e2d\u3002\u9996\u6b21\u8c03\u7528\u4e4b\u540e\uff0c\u6bcf\u6b21\u8c03\u7528\u90fd\u4ece\u6587\u4ef6\u8fd4\u56de\u4e00\u4e2a\u5143\u7ec4\u3002"]}, {"title": "\u5e76\u884c\u6267\u884c\u4e0e\u8fd0\u884c\u4fe1\u606f\u91c7\u96c6", "paragraphs": ["\u4ee5\u4e0b\u6e90\u7801\u56de\u8c03\u53ef\u4ee5\u534f\u8c03\u6267\u884c\u6216\u6536\u96c6\u5de5\u4f5c\u8fdb\u7a0b\u7684\u6d4b\u91cf\u6570\u636e\u3002\u56de\u8c03\u5b58\u5728\u4e0d\u4ee3\u8868\u8be5\u8282\u70b9\u666e\u904d\u652f\u6301\u5171\u4eab\u5e76\u884c\u626b\u63cf\u6216\u5171\u4eab\u72b6\u6001\u3002", "\u6b64\u6784\u5efa\u7684\u56de\u8c03\uff1aExecSortEstimate, ExecSortInitializeDSM, ExecSortInitializeWorker, ExecSortRetrieveInstrumentation."]}, {"title": "\u540c\u7248\u672c\u624b\u518c\u8bf4\u660e", "paragraphs": ["\u4f30\u8ba1\u542f\u52a8\u4ee3\u4ef7\uff1a\u8f93\u51fa\u9636\u6bb5\u5f00\u59cb\u4e4b\u524d\u6d88\u8017\u7684\u65f6\u95f4\uff0c\u4f8b\u5982\u6392\u5e8f\u8282\u70b9\u6267\u884c\u6392\u5e8f\u6240\u9700\u7684\u65f6\u95f4\u3002", "\u89c4\u5212\u5668\u53ef\u7528\u591a\u79cd\u65b9\u5f0f\u5b9e\u73b0 ORDER BY\u3002\u4e0a\u4f8b\u5c55\u793a\u4e86\u9690\u5f0f\u5b9e\u73b0\u6392\u5e8f\u7684\u65b9\u5f0f\uff1b\u89c4\u5212\u5668\u4e5f\u53ef\u4ee5\u6dfb\u52a0\u663e\u5f0f\u6392\u5e8f\u6b65\u9aa4\uff1a", "\u5982\u679c\u8ba1\u5212\u7684\u4e00\u90e8\u5206\u80fd\u4fdd\u8bc1\u8f93\u5165\u5df2\u6309\u6240\u9700\u6392\u5e8f\u952e\u7684\u524d\u7f00\u6392\u5e8f\uff0c\u89c4\u5212\u5668\u53ef\u80fd\u6539\u7528\u589e\u91cf\u6392\u5e8f\u6b65\u9aa4\uff1a", "\u5f52\u5e76\u8fde\u63a5\u8981\u6c42\u8f93\u5165\u6309\u8fde\u63a5\u952e\u6392\u5e8f\u3002\u6b64\u8ba1\u5212\u901a\u8fc7\u7d22\u5f15\u626b\u63cf\u6309\u987a\u5e8f\u8bfb\u53d6 tenk1\uff1b\u5bf9\u4e8e onek\uff0c\u5219\u503e\u5411\u4e8e\u987a\u5e8f\u626b\u63cf\u540e\u6392\u5e8f\uff0c\u56e0\u4e3a\u8be5\u8868\u8981\u8bbf\u95ee\u7684\u884c\u66f4\u591a\u3002\uff08\u5bf9\u5927\u91cf\u884c\u6392\u5e8f\u65f6\uff0c\u987a\u5e8f\u626b\u63cf\u52a0\u6392\u5e8f\u5e38\u5e38\u4f18\u4e8e\u7d22\u5f15\u626b\u63cf\uff0c\u56e0\u4e3a\u540e\u8005\u9700\u8981\u975e\u987a\u5e8f\u78c1\u76d8\u8bbf\u95ee\u3002\uff09", "\u8003\u5bdf\u5176\u4ed6\u8ba1\u5212\u7684\u4e00\u79cd\u65b9\u6cd5\uff0c\u662f\u7528\u7b2c 20.7.1 \u8282\u4e2d\u7684\u542f\u7528/\u7981\u7528\u6807\u5fd7\uff0c\u5f3a\u5236\u89c4\u5212\u5668\u5ffd\u7565\u5b83\u539f\u672c\u8ba4\u4e3a\u6210\u672c\u6700\u4f4e\u7684\u7b56\u7565\u3002\uff08\u8fd9\u79cd\u65b9\u6cd5\u6bd4\u8f83\u7c97\u7cd9\uff0c\u4f46\u5f88\u6709\u7528\uff1b\u53e6\u89c1\u7b2c 14.3 \u8282\u3002\uff09\u4f8b\u5982\uff0c\u82e5\u4e0d\u786e\u4fe1\u4e0a\u4f8b\u5904\u7406 onek \u7684\u6700\u4f73\u65b9\u5f0f\u662f\u987a\u5e8f\u626b\u63cf\u52a0\u6392\u5e8f\uff0c\u53ef\u4ee5\u5c1d\u8bd5\uff1a", "\u8fd9\u8bf4\u660e\u89c4\u5212\u5668\u8ba4\u4e3a\u901a\u8fc7\u7d22\u5f15\u626b\u63cf\u5bf9 onek \u6392\u5e8f\u7684\u6210\u672c\u6bd4\u987a\u5e8f\u626b\u63cf\u52a0\u6392\u5e8f\u9ad8\u7ea6 12%\u3002\u63a5\u4e0b\u6765\u5f53\u7136\u8981\u786e\u8ba4\u5b83\u5224\u65ad\u662f\u5426\u6b63\u786e\uff1b\u53ef\u4f7f\u7528\u4e0b\u6587\u4ecb\u7ecd\u7684 EXPLAIN ANALYZE \u6765\u9a8c\u8bc1\u3002"]}, {"title": "\u672c\u7248\u624b\u518c\u4e2d\u7684\u793a\u4f8b", "blocks": [{"code": "EXPLAIN SELECT * FROM tenk1 ORDER BY unique1;\n                            QUERY PLAN\n-------------------------------------------------------------------\n Sort  (cost=1109.39..1134.39 rows=10000 width=244)\n   Sort Key: unique1\n   ->  Seq Scan on tenk1  (cost=0.00..445.00 rows=10000 width=244)", "source": {"url": "/docs/16/using-explain.html#USING-EXPLAIN-BASICS", "path": "using-explain.html", "label": "PostgreSQL 16.15 \u00b7 using-explain", "sha256": "bd8b86e5281cf0e52ad6e0e4bb8b6ff6510dac61982b44f0c1dd07d54012db3c"}, "paragraphs": ["\u793a\u4f8b\u6458\u81ea PostgreSQL 16.15 \u624b\u518c\uff1b\u672c\u767e\u79d1\u672a\u5b9e\u9645\u6267\u884c\u6b64\u793a\u4f8b\u3002", "\u89c4\u5212\u5668\u53ef\u7528\u591a\u79cd\u65b9\u5f0f\u5b9e\u73b0 ORDER BY\u3002\u4e0a\u4f8b\u5c55\u793a\u4e86\u9690\u5f0f\u5b9e\u73b0\u6392\u5e8f\u7684\u65b9\u5f0f\uff1b\u89c4\u5212\u5668\u4e5f\u53ef\u4ee5\u6dfb\u52a0\u663e\u5f0f\u6392\u5e8f\u6b65\u9aa4\uff1a"]}, {"code": "EXPLAIN SELECT * FROM tenk1 ORDER BY four, ten LIMIT 100;\n                                              QUERY PLAN\n------------------------------------------------------------------------------------------------------\n Limit  (cost=521.06..538.05 rows=100 width=244)\n   ->  Incremental Sort  (cost=521.06..2220.95 rows=10000 width=244)\n         Sort Key: four, ten\n         Presorted Key: four\n         ->  Index Scan using index_tenk1_on_four on tenk1  (cost=0.29..1510.08 rows=10000 width=244)", "source": {"url": "/docs/16/using-explain.html#USING-EXPLAIN-BASICS", "path": "using-explain.html", "label": "PostgreSQL 16.15 \u00b7 using-explain", "sha256": "bd8b86e5281cf0e52ad6e0e4bb8b6ff6510dac61982b44f0c1dd07d54012db3c"}, "paragraphs": ["\u793a\u4f8b\u6458\u81ea PostgreSQL 16.15 \u624b\u518c\uff1b\u672c\u767e\u79d1\u672a\u5b9e\u9645\u6267\u884c\u6b64\u793a\u4f8b\u3002", "\u5982\u679c\u8ba1\u5212\u7684\u4e00\u90e8\u5206\u80fd\u4fdd\u8bc1\u8f93\u5165\u5df2\u6309\u6240\u9700\u6392\u5e8f\u952e\u7684\u524d\u7f00\u6392\u5e8f\uff0c\u89c4\u5212\u5668\u53ef\u80fd\u6539\u7528\u589e\u91cf\u6392\u5e8f\u6b65\u9aa4\uff1a"]}]}, {"title": "\u6267\u884c\u5668\u5b9e\u73b0\u8bf4\u660e", "paragraphs": ["\u4f7f\u7528 tuplesort \u5bf9\u8282\u70b9\u5916\u4fa7\u5b50\u6811\u7684\u5143\u7ec4\u6392\u5e8f\uff0c\u5c06\u7ed3\u679c\u4fdd\u5b58\u5728\u4e34\u65f6\u6587\u4ef6\u6216\u5185\u5b58\u4e2d\u3002\u9996\u6b21\u8c03\u7528\u4e4b\u540e\uff0c\u6bcf\u6b21\u8c03\u7528\u90fd\u4ece\u6587\u4ef6\u8fd4\u56de\u4e00\u4e2a\u5143\u7ec4\u3002", "\u6b64\u6392\u5e8f\u53ef\u7528\u4e24\u79cd\u4e0d\u540c\u65b9\u5f0f\u6267\u884c\uff1a", "1\uff09\u7ed3\u679c\u53ea\u6709\u4e00\u5217\u65f6\uff0c\u6267\u884c Datum \u6392\u5e8f\u3002", "2\uff09\u7ed3\u679c\u5305\u542b\u591a\u5217\u65f6\uff0c\u6267\u884c\u5143\u7ec4\u6392\u5e8f\u3002", "\u4e5f\u53ef\u4ee5\u59cb\u7ec8\u6267\u884c\u5143\u7ec4\u6392\u5e8f\uff0c\u4f46\u4ec5\u5bf9 Datum \u6392\u5e8f\u53ef\u80fd\u663e\u8457\u66f4\u5feb\uff0c\u5c24\u5176\u5f53 Datum \u5c5e\u4e8e\u6309\u503c\u4f20\u9012\u7684\u7c7b\u578b\u65f6\u3002"]}, {"code": "case T_Sort:\n\t\t\tpname = sname = \"Sort\";\n\t\t\tbreak;", "title": "\u6838\u5fc3\u6e90\u7801\u4e2d\u7684 EXPLAIN \u6807\u8bc6"}], "strategies": [], "description": ["\u6309\u8ba1\u5212\u6392\u5e8f\u952e\u5bf9\u5b50\u8ba1\u5212\u8f93\u51fa\u7684\u884c\u6392\u5e8f\u3002"], "localization": {"status": "complete", "sources": [], "language": "zh", "original_text": {"/versions/16/description/0": "Sorts rows from its child according to the plan sort keys.", "/versions/16/facts/0/label": "Core node tag", "/versions/16/facts/1/label": "Structured EXPLAIN Node Type", "/versions/16/facts/2/label": "Inputs", "/versions/16/facts/2/value": "One child plan", "/versions/16/facts/3/label": "Output", "/versions/16/facts/3/value": "Sorted tuples", "/versions/16/facts/4/label": "Executor initializer", "/versions/16/facts/5/label": "Memory mechanism", "/versions/16/tables/0/title": "EXPLAIN labels in this source build", "/versions/16/related/1/label": "Using EXPLAIN", "/versions/16/related/2/label": "Parallel plans", "/versions/16/sections/0/title": "EXPLAIN names and attributes", "/versions/16/sections/1/title": "Memory and temporary storage", "/versions/16/sections/2/title": "Parallel execution and instrumentation", "/versions/16/sections/3/title": "Same-version manual discussion", "/versions/16/sections/4/title": "Examples from this manual build", "/versions/16/sections/5/title": "Executor implementation notes", "/versions/16/sections/6/title": "EXPLAIN identity in core source", "/versions/16/memory/description": "The node passes work_mem to tuplesort. Sorting can use memory or temporary files; the actual method and space use depend on the input and plan.", "/versions/16/sections/0/paragraphs/0": "Structured formats use the Node Type above. Text-format spellings can also include operation, strategy, join type, scan direction or aggregation-stage attributes.", "/versions/16/sections/0/paragraphs/1": "Text names recorded by this source: Sort.", "/versions/16/sections/0/paragraphs/2": "Parallel-aware and parallel-safe are different plan properties. A node running inside a parallel worker is not necessarily a parallel-aware node.", "/versions/16/sections/1/paragraphs/0": "The node passes work_mem to tuplesort. Sorting can use memory or temporary files; the actual method and space use depend on the input and plan.", "/versions/16/sections/1/paragraphs/1": "Sorts tuples from the outer subtree of the node using tuplesort, which saves the results in a temporary file or memory. After the initial call, returns a tuple from the file with each call.", "/versions/16/sections/2/paragraphs/0": "The source callbacks below can coordinate execution or collect worker instrumentation. Their presence is not a blanket claim that this node supports a shared parallel scan or shared state.", "/versions/16/sections/2/paragraphs/1": "Callbacks in this build: ExecSortEstimate, ExecSortInitializeDSM, ExecSortInitializeWorker, ExecSortRetrieveInstrumentation.", "/versions/16/sections/3/paragraphs/0": "Estimated start-up cost. This is the time expended before the output phase can begin, e.g., time to do the sorting in a sort node.", "/versions/16/sections/3/paragraphs/1": "The planner may implement an ORDER BY clause in several ways. The above example shows that such an ordering clause may be implemented implicitly. The planner may also add an explicit sort step:", "/versions/16/sections/3/paragraphs/2": "If a part of the plan guarantees an ordering on a prefix of the required sort keys, then the planner may instead decide to use an incremental sort step:", "/versions/16/sections/3/paragraphs/3": "Merge join requires its input data to be sorted on the join keys. In this plan the tenk1 data is sorted by using an index scan to visit the rows in the correct order, but a sequential scan and sort is preferred for onek , because there are many more rows to be visited in that table. (Sequential-scan-and-sort frequently beats an index scan for sorting many rows, because of the nonsequential disk access required by the index scan.)", "/versions/16/sections/3/paragraphs/4": "One way to look at variant plans is to force the planner to disregard whatever strategy it thought was the cheapest, using the enable/disable flags described in Section 20.7.1 . (This is a crude tool, but useful. See also Section 14.3 .) For example, if we're unconvinced that sequential-scan-and-sort is the best way to deal with table onek in the previous example, we could try", "/versions/16/sections/3/paragraphs/5": "which shows that the planner thinks that sorting onek by index-scanning is about 12% more expensive than sequential-scan-and-sort. Of course, the next question is whether it's right about that. We can investigate that using EXPLAIN ANALYZE , as discussed below.", "/versions/16/sections/5/paragraphs/0": "Sorts tuples from the outer subtree of the node using tuplesort, which saves the results in a temporary file or memory. After the initial call, returns a tuple from the file with each call.", "/versions/16/sections/5/paragraphs/1": "There are two distinct ways that this sort can be performed:", "/versions/16/sections/5/paragraphs/2": "1) When the result is a single column we perform a Datum sort.", "/versions/16/sections/5/paragraphs/3": "2) When the result contains multiple columns we perform a tuple sort.", "/versions/16/sections/5/paragraphs/4": "We could do this by always performing a tuple sort, however sorting Datums only can be significantly faster than sorting tuples, especially when the Datums are of a pass-by-value type.", "/versions/16/tables/0/columns/0/label": "Text-format label", "/versions/16/tables/0/columns/1/label": "Structured node identity", "/versions/16/sections/4/blocks/0/paragraphs/0": "Example copied from the PostgreSQL 16.15 manual; it was not executed for this collection.", "/versions/16/sections/4/blocks/0/paragraphs/1": "The planner may implement an ORDER BY clause in several ways. The above example shows that such an ordering clause may be implemented implicitly. The planner may also add an explicit sort step:", "/versions/16/sections/4/blocks/1/paragraphs/0": "Example copied from the PostgreSQL 16.15 manual; it was not executed for this collection.", "/versions/16/sections/4/blocks/1/paragraphs/1": "If a part of the plan guarantees an ordering on a prefix of the required sort keys, then the planner may instead decide to use an incremental sort step:"}, "fallback_fields": [], "source_language": "en", "original_snapshot_sha256": "3e5e4a08dddc22a68e170ea1f170adc4409400a6235575675b3d77c4758f4409"}, "evidence_kind": "source and documentation", "explain_names": ["Sort"], "partial_modes": [], "comparison_data": {"node_tag": "T_Sort", "strategies": [], "text_names": ["Sort"], "initializer": "ExecInitSort", "partial_modes": [], "memory_mechanism": "tuplesort", "parallel_callbacks": ["ExecSortEstimate", "ExecSortInitializeDSM", "ExecSortInitializeWorker", "ExecSortRetrieveInstrumentation"]}, "comparison_hash": "32a824f93669794b01449d5d8a08ff4edcb6024cb1a897131b35fe5cddc2e4da", "explain_prefixes": ["Parallel", "Async"], "runtime_verified": false, "source_inventory": {"explain": "src/backend/commands/explain.c", "executor": "src/backend/executor/execProcnode.c", "implementation": "src/backend/executor/nodeSort.c"}, "parallel_callbacks": ["ExecSortEstimate", "ExecSortInitializeDSM", "ExecSortInitializeWorker", "ExecSortRetrieveInstrumentation"]}, "17": {"facts": [{"label": "\u6838\u5fc3\u8282\u70b9\u6807\u7b7e", "value": "T_Sort"}, {"label": "\u7ed3\u6784\u5316 EXPLAIN \u8282\u70b9\u7c7b\u578b", "value": "Sort"}, {"label": "\u8f93\u5165", "value": "\u4e00\u4e2a\u5b50\u8ba1\u5212"}, {"label": "\u8f93\u51fa", "value": "\u5df2\u6392\u5e8f\u7684\u5143\u7ec4"}, {"label": "\u6267\u884c\u5668\u521d\u59cb\u5316\u51fd\u6570", "value": "ExecInitSort"}, {"label": "\u5185\u5b58\u673a\u5236", "value": "tuplesort"}], "memory": {"evidence": [{"url": "https://ftp.postgresql.org/pub/source/v17.11/postgresql-17.11.tar.bz2", "path": "src/backend/executor/nodeSort.c", "label": "src/backend/executor/nodeSort.c", "sha256": "239f1c62dfd5ec783dbef6b26189b611b7b96a34043e4b0e593f7b34d64baa6b", "archive_sha256": "dd27f2b3c59e73ed14aa3324901242bf69a032a6347805f274e6260322d42979"}, {"url": "https://ftp.postgresql.org/pub/source/v17.11/postgresql-17.11.tar.bz2", "path": "src/backend/utils/sort/tuplesort.c", "label": "src/backend/utils/sort/tuplesort.c", "sha256": "a353a6ff27e5ad56e35624ef271b557876ac7fa321ab387987ff02a745869b5e", "archive_sha256": "dd27f2b3c59e73ed14aa3324901242bf69a032a6347805f274e6260322d42979"}], "mechanism": "tuplesort", "description": "\u6b64\u8282\u70b9\u5c06 work_mem \u4f20\u7ed9 tuplesort\u3002\u6392\u5e8f\u53ef\u4f7f\u7528\u5185\u5b58\u6216\u4e34\u65f6\u6587\u4ef6\uff1b\u5b9e\u9645\u65b9\u6cd5\u548c\u7a7a\u95f4\u7528\u91cf\u53d6\u51b3\u4e8e\u8f93\u5165\u53ca\u8ba1\u5212\u3002", "source_notes": ["Sorts tuples from the outer subtree of the node using tuplesort, which saves the results in a temporary file or memory. After the initial call, returns a tuple from the file with each call."]}, "tables": [{"key": "explain-labels", "rows": [{"label": "Sort", "identity": "Sort"}], "title": "\u672c\u6784\u5efa\u4e2d\u7684 EXPLAIN \u6807\u7b7e", "columns": [{"key": "label", "label": "\u6587\u672c\u683c\u5f0f\u6807\u7b7e"}, {"key": "identity", "label": "\u7ed3\u6784\u5316\u8282\u70b9\u6807\u8bc6"}]}], "related": [{"url": "/wiki/sql/explain/?v=17", "label": "EXPLAIN"}, {"url": "/docs/17/using-explain.html", "label": "\u4f7f\u7528 EXPLAIN"}, {"url": "/docs/17/parallel-plans.html", "label": "\u5e76\u884c\u8ba1\u5212"}, {"url": "/wiki/guc/enable_sort/?v=17", "label": "enable_sort"}, {"url": "/wiki/guc/work_mem/?v=17", "label": "work_mem"}], "release": {"ref": "PostgreSQL 17.11 source archive", "label": "17.11", "major": "17", "channel": "stable", "revision": "dd27f2b3c59e73ed14aa3324901242bf69a032a6347805f274e6260322d42979", "source_url": "https://ftp.postgresql.org/pub/source/v17.11/postgresql-17.11.tar.bz2", "source_snapshot_utc": ""}, "sources": [{"url": "https://ftp.postgresql.org/pub/source/v17.11/postgresql-17.11.tar.bz2", "line": 1537, "path": "src/backend/commands/explain.c", "label": "src/backend/commands/explain.c:1537", "sha256": "741251b1a3b6d269a52a673d42eb63b02e13a5872db7b359b137086ab21b63c8", "archive_sha256": "dd27f2b3c59e73ed14aa3324901242bf69a032a6347805f274e6260322d42979"}, {"url": "https://ftp.postgresql.org/pub/source/v17.11/postgresql-17.11.tar.bz2", "line": 320, "path": "src/backend/executor/execProcnode.c", "label": "src/backend/executor/execProcnode.c:320", "sha256": "a77576e158b94cb01fa8c5174ba133004eabdd727660323f8afc66c8d2e757b8", "archive_sha256": "dd27f2b3c59e73ed14aa3324901242bf69a032a6347805f274e6260322d42979"}, {"url": "https://ftp.postgresql.org/pub/source/v17.11/postgresql-17.11.tar.bz2", "path": "src/backend/executor/nodeSort.c", "label": "src/backend/executor/nodeSort.c", "sha256": "239f1c62dfd5ec783dbef6b26189b611b7b96a34043e4b0e593f7b34d64baa6b", "archive_sha256": "dd27f2b3c59e73ed14aa3324901242bf69a032a6347805f274e6260322d42979"}, {"url": "https://ftp.postgresql.org/pub/source/v17.11/postgresql-17.11.tar.bz2", "path": "src/include/nodes/plannodes.h", "label": "src/include/nodes/plannodes.h", "sha256": "d390dd69e2d3f5085beb42b33e46ff0676a2959b916a12b82118a7e545f8e562", "archive_sha256": "dd27f2b3c59e73ed14aa3324901242bf69a032a6347805f274e6260322d42979"}, {"url": "https://ftp.postgresql.org/pub/source/v17.11/postgresql-17.11.tar.bz2", "path": "src/backend/utils/sort/tuplesort.c", "label": "src/backend/utils/sort/tuplesort.c", "sha256": "a353a6ff27e5ad56e35624ef271b557876ac7fa321ab387987ff02a745869b5e", "archive_sha256": "dd27f2b3c59e73ed14aa3324901242bf69a032a6347805f274e6260322d42979"}, {"url": "https://pg.center/docs/17/using-explain.html#USING-EXPLAIN-BASICS", "path": "using-explain.html", "label": "PostgreSQL 17.11 \u00b7 using-explain", "sha256": "8e3422c77496cc53bfc225ccadda3e82eb23c8c362b8eb95e7fb02cdb315ea78", "language": "en", "original_url": "/docs/17/using-explain.html#USING-EXPLAIN-BASICS"}, {"url": "https://pg.center/docs/17/using-explain.html#USING-EXPLAIN-ANALYZE", "path": "using-explain.html", "label": "PostgreSQL 17.11 \u00b7 using-explain", "sha256": "8e3422c77496cc53bfc225ccadda3e82eb23c8c362b8eb95e7fb02cdb315ea78", "language": "en", "original_url": "/docs/17/using-explain.html#USING-EXPLAIN-ANALYZE"}], "node_tag": "T_Sort", "sections": [{"title": "EXPLAIN \u540d\u79f0\u4e0e\u5c5e\u6027", "paragraphs": ["\u7ed3\u6784\u5316\u683c\u5f0f\u4f7f\u7528\u4e0a\u8ff0 Node Type\u3002\u6587\u672c\u683c\u5f0f\u540d\u79f0\u8fd8\u53ef\u80fd\u5305\u542b\u64cd\u4f5c\u3001\u7b56\u7565\u3001\u8fde\u63a5\u7c7b\u578b\u3001\u626b\u63cf\u65b9\u5411\u6216\u805a\u5408\u9636\u6bb5\u5c5e\u6027\u3002", "\u6b64\u6e90\u7801\u8bb0\u5f55\u7684\u6587\u672c\u540d\u79f0\uff1aSort.", "\u5e76\u884c\u611f\u77e5\u4e0e\u5e76\u884c\u5b89\u5168\u662f\u4e0d\u540c\u7684\u8ba1\u5212\u5c5e\u6027\u3002\u5728\u5e76\u884c\u5de5\u4f5c\u8fdb\u7a0b\u5185\u8fd0\u884c\u7684\u8282\u70b9\u4e0d\u4e00\u5b9a\u662f\u5e76\u884c\u611f\u77e5\u8282\u70b9\u3002"]}, {"title": "\u5185\u5b58\u4e0e\u4e34\u65f6\u5b58\u50a8", "paragraphs": ["\u6b64\u8282\u70b9\u5c06 work_mem \u4f20\u7ed9 tuplesort\u3002\u6392\u5e8f\u53ef\u4f7f\u7528\u5185\u5b58\u6216\u4e34\u65f6\u6587\u4ef6\uff1b\u5b9e\u9645\u65b9\u6cd5\u548c\u7a7a\u95f4\u7528\u91cf\u53d6\u51b3\u4e8e\u8f93\u5165\u53ca\u8ba1\u5212\u3002", "\u4f7f\u7528 tuplesort \u5bf9\u8282\u70b9\u5916\u4fa7\u5b50\u6811\u7684\u5143\u7ec4\u6392\u5e8f\uff0c\u5c06\u7ed3\u679c\u4fdd\u5b58\u5728\u4e34\u65f6\u6587\u4ef6\u6216\u5185\u5b58\u4e2d\u3002\u9996\u6b21\u8c03\u7528\u4e4b\u540e\uff0c\u6bcf\u6b21\u8c03\u7528\u90fd\u4ece\u6587\u4ef6\u8fd4\u56de\u4e00\u4e2a\u5143\u7ec4\u3002"]}, {"title": "\u5e76\u884c\u6267\u884c\u4e0e\u8fd0\u884c\u4fe1\u606f\u91c7\u96c6", "paragraphs": ["\u4ee5\u4e0b\u6e90\u7801\u56de\u8c03\u53ef\u4ee5\u534f\u8c03\u6267\u884c\u6216\u6536\u96c6\u5de5\u4f5c\u8fdb\u7a0b\u7684\u6d4b\u91cf\u6570\u636e\u3002\u56de\u8c03\u5b58\u5728\u4e0d\u4ee3\u8868\u8be5\u8282\u70b9\u666e\u904d\u652f\u6301\u5171\u4eab\u5e76\u884c\u626b\u63cf\u6216\u5171\u4eab\u72b6\u6001\u3002", "\u6b64\u6784\u5efa\u7684\u56de\u8c03\uff1aExecSortEstimate, ExecSortInitializeDSM, ExecSortInitializeWorker, ExecSortRetrieveInstrumentation."]}, {"title": "\u540c\u7248\u672c\u624b\u518c\u8bf4\u660e", "paragraphs": ["\u4f30\u8ba1\u542f\u52a8\u4ee3\u4ef7\uff1a\u8f93\u51fa\u9636\u6bb5\u5f00\u59cb\u4e4b\u524d\u6d88\u8017\u7684\u65f6\u95f4\uff0c\u4f8b\u5982\u6392\u5e8f\u8282\u70b9\u6267\u884c\u6392\u5e8f\u6240\u9700\u7684\u65f6\u95f4\u3002", "\u89c4\u5212\u5668\u53ef\u4ee5\u7528\u591a\u79cd\u65b9\u5f0f\u5b9e\u73b0 ORDER BY \u5b50\u53e5\u3002\u4e0a\u9762\u7684\u793a\u4f8b\u8868\u660e\uff0c\u8fd9\u79cd\u6392\u5e8f\u5b50\u53e5\u53ef\u4ee5\u88ab\u9690\u5f0f\u6ee1\u8db3\u3002\u89c4\u5212\u5668\u4e5f\u53ef\u80fd\u663e\u5f0f\u589e\u52a0\u4e00\u4e2a Sort \u6b65\u9aa4\uff1a", "\u5982\u679c\u8ba1\u5212\u4e2d\u7684\u67d0\u4e00\u90e8\u5206\u5df2\u7ecf\u4fdd\u8bc1\u4e86\u6240\u9700\u6392\u5e8f\u952e\u524d\u7f00\u7684\u987a\u5e8f\uff0c\u89c4\u5212\u5668\u4e5f\u53ef\u80fd\u6539\u7528 Incremental Sort \u6b65\u9aa4\uff1a", "\u5f52\u5e76\u8fde\u63a5\u8981\u6c42\u8f93\u5165\u6570\u636e\u6309\u8fde\u63a5\u952e\u6392\u5e8f\u3002\u5728\u8fd9\u4e2a\u4f8b\u5b50\u4e2d\uff0c\u4e24\u4e2a\u8f93\u5165\u90fd\u901a\u8fc7\u7d22\u5f15\u626b\u63cf\u6309\u6b63\u786e\u987a\u5e8f\u8bbf\u95ee\u884c\u800c\u5b8c\u6210\u6392\u5e8f\uff1b\u4e0d\u8fc7\u4e5f\u53ef\u4ee5\u91c7\u7528\u987a\u5e8f\u626b\u63cf\u518d\u6392\u5e8f\u7684\u65b9\u5f0f\u3002\uff08\u5bf9\u4e8e\u9700\u8981\u6392\u5e8f\u5f88\u591a\u884c\u7684\u60c5\u51b5\uff0c\u987a\u5e8f\u626b\u63cf\u52a0\u6392\u5e8f\u5f80\u5f80\u4f1a\u80dc\u8fc7\u7d22\u5f15\u626b\u63cf\uff0c\u56e0\u4e3a\u7d22\u5f15\u626b\u63cf\u9700\u8981\u975e\u987a\u5e8f\u78c1\u76d8\u8bbf\u95ee\u3002\uff09", "\u5728\u67d0\u4e9b\u60c5\u51b5\u4e0b\uff0cEXPLAIN ANALYZE \u9664\u4e86\u8ba1\u5212\u8282\u70b9\u7684\u6267\u884c\u65f6\u95f4\u548c\u884c\u6570\u4e4b\u5916\uff0c\u8fd8\u4f1a\u663e\u793a\u989d\u5916\u7684\u6267\u884c\u7edf\u8ba1\u4fe1\u606f\u3002\u4f8b\u5982\uff0cSort \u548c Hash \u8282\u70b9\u4f1a\u63d0\u4f9b\u66f4\u591a\u4fe1\u606f\uff1a", "Sort \u8282\u70b9\u663e\u793a\u6392\u5e8f\u65b9\u6cd5\uff08\u5c24\u5176\u662f\u5185\u5b58\u6392\u5e8f\u8fd8\u662f\u78c1\u76d8\u6392\u5e8f\uff09\u53ca\u6240\u9700\u5185\u5b58\u6216\u78c1\u76d8\u7a7a\u95f4\u3002Hash \u8282\u70b9\u663e\u793a\u54c8\u5e0c\u6876\u6570\u3001\u6279\u6b21\u6570\u53ca\u54c8\u5e0c\u8868\u5185\u5b58\u4f7f\u7528\u5cf0\u503c\u3002\uff08\u6279\u6b21\u6570\u8d85\u8fc7\u4e00\u65f6\u4e5f\u4f1a\u4f7f\u7528\u78c1\u76d8\u7a7a\u95f4\uff0c\u4f46\u6b64\u5904\u4e0d\u663e\u793a\u3002\uff09"]}, {"title": "\u672c\u7248\u624b\u518c\u4e2d\u7684\u793a\u4f8b", "blocks": [{"code": "EXPLAIN SELECT * FROM tenk1 ORDER BY unique1;\n\n                            QUERY PLAN\n-------------------------------------------------------------------\n Sort  (cost=1109.39..1134.39 rows=10000 width=244)\n   Sort Key: unique1\n   ->  Seq Scan on tenk1  (cost=0.00..445.00 rows=10000 width=244)", "source": {"url": "/docs/17/using-explain.html#USING-EXPLAIN-BASICS", "path": "using-explain.html", "label": "PostgreSQL 17.11 \u00b7 using-explain", "sha256": "8e3422c77496cc53bfc225ccadda3e82eb23c8c362b8eb95e7fb02cdb315ea78"}, "paragraphs": ["\u793a\u4f8b\u6458\u81ea PostgreSQL 17.11 \u624b\u518c\uff1b\u672c\u767e\u79d1\u672a\u5b9e\u9645\u6267\u884c\u6b64\u793a\u4f8b\u3002", "\u89c4\u5212\u5668\u53ef\u4ee5\u7528\u591a\u79cd\u65b9\u5f0f\u5b9e\u73b0 ORDER BY \u5b50\u53e5\u3002\u4e0a\u9762\u7684\u793a\u4f8b\u8868\u660e\uff0c\u8fd9\u79cd\u6392\u5e8f\u5b50\u53e5\u53ef\u4ee5\u88ab\u9690\u5f0f\u6ee1\u8db3\u3002\u89c4\u5212\u5668\u4e5f\u53ef\u80fd\u663e\u5f0f\u589e\u52a0\u4e00\u4e2a Sort \u6b65\u9aa4\uff1a"]}, {"code": "EXPLAIN SELECT * FROM tenk1 ORDER BY hundred, ten LIMIT 100;\n\n                                              QUERY PLAN\n------------------------------------------------------------------------------------------------\n Limit  (cost=19.35..39.49 rows=100 width=244)\n   ->  Incremental Sort  (cost=19.35..2033.39 rows=10000 width=244)\n         Sort Key: hundred, ten\n         Presorted Key: hundred\n         ->  Index Scan using tenk1_hundred on tenk1  (cost=0.29..1574.20 rows=10000 width=244)", "source": {"url": "/docs/17/using-explain.html#USING-EXPLAIN-BASICS", "path": "using-explain.html", "label": "PostgreSQL 17.11 \u00b7 using-explain", "sha256": "8e3422c77496cc53bfc225ccadda3e82eb23c8c362b8eb95e7fb02cdb315ea78"}, "paragraphs": ["\u793a\u4f8b\u6458\u81ea PostgreSQL 17.11 \u624b\u518c\uff1b\u672c\u767e\u79d1\u672a\u5b9e\u9645\u6267\u884c\u6b64\u793a\u4f8b\u3002", "\u5982\u679c\u8ba1\u5212\u4e2d\u7684\u67d0\u4e00\u90e8\u5206\u5df2\u7ecf\u4fdd\u8bc1\u4e86\u6240\u9700\u6392\u5e8f\u952e\u524d\u7f00\u7684\u987a\u5e8f\uff0c\u89c4\u5212\u5668\u4e5f\u53ef\u80fd\u6539\u7528 Incremental Sort \u6b65\u9aa4\uff1a"]}]}, {"title": "\u6267\u884c\u5668\u5b9e\u73b0\u8bf4\u660e", "paragraphs": ["\u4f7f\u7528 tuplesort \u5bf9\u8282\u70b9\u5916\u4fa7\u5b50\u6811\u7684\u5143\u7ec4\u6392\u5e8f\uff0c\u5c06\u7ed3\u679c\u4fdd\u5b58\u5728\u4e34\u65f6\u6587\u4ef6\u6216\u5185\u5b58\u4e2d\u3002\u9996\u6b21\u8c03\u7528\u4e4b\u540e\uff0c\u6bcf\u6b21\u8c03\u7528\u90fd\u4ece\u6587\u4ef6\u8fd4\u56de\u4e00\u4e2a\u5143\u7ec4\u3002", "\u6b64\u6392\u5e8f\u53ef\u7528\u4e24\u79cd\u4e0d\u540c\u65b9\u5f0f\u6267\u884c\uff1a", "1\uff09\u7ed3\u679c\u53ea\u6709\u4e00\u5217\u65f6\uff0c\u6267\u884c Datum \u6392\u5e8f\u3002", "2\uff09\u7ed3\u679c\u5305\u542b\u591a\u5217\u65f6\uff0c\u6267\u884c\u5143\u7ec4\u6392\u5e8f\u3002", "\u4e5f\u53ef\u4ee5\u59cb\u7ec8\u6267\u884c\u5143\u7ec4\u6392\u5e8f\uff0c\u4f46\u4ec5\u5bf9 Datum \u6392\u5e8f\u53ef\u80fd\u663e\u8457\u66f4\u5feb\uff0c\u5c24\u5176\u5f53 Datum \u5c5e\u4e8e\u6309\u503c\u4f20\u9012\u7684\u7c7b\u578b\u65f6\u3002"]}, {"code": "case T_Sort:\n\t\t\tpname = sname = \"Sort\";\n\t\t\tbreak;", "title": "\u6838\u5fc3\u6e90\u7801\u4e2d\u7684 EXPLAIN \u6807\u8bc6"}], "strategies": [], "description": ["\u6309\u8ba1\u5212\u6392\u5e8f\u952e\u5bf9\u5b50\u8ba1\u5212\u8f93\u51fa\u7684\u884c\u6392\u5e8f\u3002"], "localization": {"status": "complete", "sources": [{"url": "/docs/17/using-explain.html", "method": "same-major semantic node", "sha256": "610ae355c419b53a5e213a8c8e2eacbf34e4fa0ac8f6d27365071bc6d3c90278", "language": "zh", "matched_nodes": ["#USING-EXPLAIN/div[7]/p[27]", "#USING-EXPLAIN/div[7]/p[29]", "#USING-EXPLAIN/div[7]/p[51]"]}], "language": "zh", "original_text": {"/versions/17/description/0": "Sorts rows from its child according to the plan sort keys.", "/versions/17/facts/0/label": "Core node tag", "/versions/17/facts/1/label": "Structured EXPLAIN Node Type", "/versions/17/facts/2/label": "Inputs", "/versions/17/facts/2/value": "One child plan", "/versions/17/facts/3/label": "Output", "/versions/17/facts/3/value": "Sorted tuples", "/versions/17/facts/4/label": "Executor initializer", "/versions/17/facts/5/label": "Memory mechanism", "/versions/17/tables/0/title": "EXPLAIN labels in this source build", "/versions/17/related/1/label": "Using EXPLAIN", "/versions/17/related/2/label": "Parallel plans", "/versions/17/sections/0/title": "EXPLAIN names and attributes", "/versions/17/sections/1/title": "Memory and temporary storage", "/versions/17/sections/2/title": "Parallel execution and instrumentation", "/versions/17/sections/3/title": "Same-version manual discussion", "/versions/17/sections/4/title": "Examples from this manual build", "/versions/17/sections/5/title": "Executor implementation notes", "/versions/17/sections/6/title": "EXPLAIN identity in core source", "/versions/17/memory/description": "The node passes work_mem to tuplesort. Sorting can use memory or temporary files; the actual method and space use depend on the input and plan.", "/versions/17/sections/0/paragraphs/0": "Structured formats use the Node Type above. Text-format spellings can also include operation, strategy, join type, scan direction or aggregation-stage attributes.", "/versions/17/sections/0/paragraphs/1": "Text names recorded by this source: Sort.", "/versions/17/sections/0/paragraphs/2": "Parallel-aware and parallel-safe are different plan properties. A node running inside a parallel worker is not necessarily a parallel-aware node.", "/versions/17/sections/1/paragraphs/0": "The node passes work_mem to tuplesort. Sorting can use memory or temporary files; the actual method and space use depend on the input and plan.", "/versions/17/sections/1/paragraphs/1": "Sorts tuples from the outer subtree of the node using tuplesort, which saves the results in a temporary file or memory. After the initial call, returns a tuple from the file with each call.", "/versions/17/sections/2/paragraphs/0": "The source callbacks below can coordinate execution or collect worker instrumentation. Their presence is not a blanket claim that this node supports a shared parallel scan or shared state.", "/versions/17/sections/2/paragraphs/1": "Callbacks in this build: ExecSortEstimate, ExecSortInitializeDSM, ExecSortInitializeWorker, ExecSortRetrieveInstrumentation.", "/versions/17/sections/3/paragraphs/0": "Estimated start-up cost. This is the time expended before the output phase can begin, e.g., time to do the sorting in a sort node.", "/versions/17/sections/3/paragraphs/1": "The planner may implement an ORDER BY clause in several ways. The above example shows that such an ordering clause may be implemented implicitly. The planner may also add an explicit Sort step:", "/versions/17/sections/3/paragraphs/2": "If a part of the plan guarantees an ordering on a prefix of the required sort keys, then the planner may instead decide to use an Incremental Sort step:", "/versions/17/sections/3/paragraphs/3": "Merge join requires its input data to be sorted on the join keys. In this example each input is sorted by using an index scan to visit the rows in the correct order; but a sequential scan and sort could also be used. (Sequential-scan-and-sort frequently beats an index scan for sorting many rows, because of the nonsequential disk access required by the index scan.)", "/versions/17/sections/3/paragraphs/4": "In some cases EXPLAIN ANALYZE shows additional execution statistics beyond the plan node execution times and row counts. For example, Sort and Hash nodes provide extra information:", "/versions/17/sections/3/paragraphs/5": "The Sort node shows the sort method used (in particular, whether the sort was in-memory or on-disk) and the amount of memory or disk space needed. The Hash node shows the number of hash buckets and batches as well as the peak amount of memory used for the hash table. (If the number of batches exceeds one, there will also be disk space usage involved, but that is not shown.)", "/versions/17/sections/5/paragraphs/0": "Sorts tuples from the outer subtree of the node using tuplesort, which saves the results in a temporary file or memory. After the initial call, returns a tuple from the file with each call.", "/versions/17/sections/5/paragraphs/1": "There are two distinct ways that this sort can be performed:", "/versions/17/sections/5/paragraphs/2": "1) When the result is a single column we perform a Datum sort.", "/versions/17/sections/5/paragraphs/3": "2) When the result contains multiple columns we perform a tuple sort.", "/versions/17/sections/5/paragraphs/4": "We could do this by always performing a tuple sort, however sorting Datums only can be significantly faster than sorting tuples, especially when the Datums are of a pass-by-value type.", "/versions/17/tables/0/columns/0/label": "Text-format label", "/versions/17/tables/0/columns/1/label": "Structured node identity", "/versions/17/sections/4/blocks/0/paragraphs/0": "Example copied from the PostgreSQL 17.11 manual; it was not executed for this collection.", "/versions/17/sections/4/blocks/0/paragraphs/1": "The planner may implement an ORDER BY clause in several ways. The above example shows that such an ordering clause may be implemented implicitly. The planner may also add an explicit Sort step:", "/versions/17/sections/4/blocks/1/paragraphs/0": "Example copied from the PostgreSQL 17.11 manual; it was not executed for this collection.", "/versions/17/sections/4/blocks/1/paragraphs/1": "If a part of the plan guarantees an ordering on a prefix of the required sort keys, then the planner may instead decide to use an Incremental Sort step:"}, "fallback_fields": [], "source_language": "en", "original_snapshot_sha256": "3760ee8556a606a62e1739c27da222bee5b33190549eb78fbd555c22678fabeb"}, "evidence_kind": "source and documentation", "explain_names": ["Sort"], "partial_modes": [], "comparison_data": {"node_tag": "T_Sort", "strategies": [], "text_names": ["Sort"], "initializer": "ExecInitSort", "partial_modes": [], "memory_mechanism": "tuplesort", "parallel_callbacks": ["ExecSortEstimate", "ExecSortInitializeDSM", "ExecSortInitializeWorker", "ExecSortRetrieveInstrumentation"]}, "comparison_hash": "32a824f93669794b01449d5d8a08ff4edcb6024cb1a897131b35fe5cddc2e4da", "explain_prefixes": ["Parallel", "Async"], "runtime_verified": false, "source_inventory": {"explain": "src/backend/commands/explain.c", "executor": "src/backend/executor/execProcnode.c", "implementation": "src/backend/executor/nodeSort.c"}, "parallel_callbacks": ["ExecSortEstimate", "ExecSortInitializeDSM", "ExecSortInitializeWorker", "ExecSortRetrieveInstrumentation"]}, "18": {"facts": [{"label": "\u6838\u5fc3\u8282\u70b9\u6807\u7b7e", "value": "T_Sort"}, {"label": "\u7ed3\u6784\u5316 EXPLAIN \u8282\u70b9\u7c7b\u578b", "value": "Sort"}, {"label": "\u8f93\u5165", "value": "\u4e00\u4e2a\u5b50\u8ba1\u5212"}, {"label": "\u8f93\u51fa", "value": "\u5df2\u6392\u5e8f\u7684\u5143\u7ec4"}, {"label": "\u6267\u884c\u5668\u521d\u59cb\u5316\u51fd\u6570", "value": "ExecInitSort"}, {"label": "\u5185\u5b58\u673a\u5236", "value": "tuplesort"}], "memory": {"evidence": [{"url": "https://ftp.postgresql.org/pub/source/v18.6/postgresql-18.6.tar.bz2", "path": "src/backend/executor/nodeSort.c", "label": "src/backend/executor/nodeSort.c", "sha256": "47c6b983626e15e112f904040e96d43190ae4b3226e7cd2b27234dc95adf54a2", "archive_sha256": "555610c24d53e4316da5b7d3fc25c279d96856d5e0e23ee308c328c5fa881d9f"}, {"url": "https://ftp.postgresql.org/pub/source/v18.6/postgresql-18.6.tar.bz2", "path": "src/backend/utils/sort/tuplesort.c", "label": "src/backend/utils/sort/tuplesort.c", "sha256": "509d4cef598613bbf0725f697e1e1e33f3dfc8debed20169a6c4bf1ac9e5c2e3", "archive_sha256": "555610c24d53e4316da5b7d3fc25c279d96856d5e0e23ee308c328c5fa881d9f"}], "mechanism": "tuplesort", "description": "\u6b64\u8282\u70b9\u5c06 work_mem \u4f20\u7ed9 tuplesort\u3002\u6392\u5e8f\u53ef\u4f7f\u7528\u5185\u5b58\u6216\u4e34\u65f6\u6587\u4ef6\uff1b\u5b9e\u9645\u65b9\u6cd5\u548c\u7a7a\u95f4\u7528\u91cf\u53d6\u51b3\u4e8e\u8f93\u5165\u53ca\u8ba1\u5212\u3002", "source_notes": ["Sorts tuples from the outer subtree of the node using tuplesort, which saves the results in a temporary file or memory. After the initial call, returns a tuple from the file with each call."]}, "tables": [{"key": "explain-labels", "rows": [{"label": "Sort", "identity": "Sort"}], "title": "\u672c\u6784\u5efa\u4e2d\u7684 EXPLAIN \u6807\u7b7e", "columns": [{"key": "label", "label": "\u6587\u672c\u683c\u5f0f\u6807\u7b7e"}, {"key": "identity", "label": "\u7ed3\u6784\u5316\u8282\u70b9\u6807\u8bc6"}]}], "related": [{"url": "/wiki/sql/explain/?v=18", "label": "EXPLAIN"}, {"url": "/docs/18/using-explain.html", "label": "\u4f7f\u7528 EXPLAIN"}, {"url": "/docs/18/parallel-plans.html", "label": "\u5e76\u884c\u8ba1\u5212"}, {"url": "/wiki/guc/enable_sort/?v=18", "label": "enable_sort"}, {"url": "/wiki/guc/work_mem/?v=18", "label": "work_mem"}], "release": {"ref": "PostgreSQL 18.6 source archive", "label": "18.6", "major": "18", "channel": "stable", "revision": "555610c24d53e4316da5b7d3fc25c279d96856d5e0e23ee308c328c5fa881d9f", "source_url": "https://ftp.postgresql.org/pub/source/v18.6/postgresql-18.6.tar.bz2", "source_snapshot_utc": ""}, "sources": [{"url": "https://ftp.postgresql.org/pub/source/v18.6/postgresql-18.6.tar.bz2", "line": 1522, "path": "src/backend/commands/explain.c", "label": "src/backend/commands/explain.c:1522", "sha256": "34c86d6070224a0e981efef51f79101d6d505e5874f1684ace183034bab14bb4", "archive_sha256": "555610c24d53e4316da5b7d3fc25c279d96856d5e0e23ee308c328c5fa881d9f"}, {"url": "https://ftp.postgresql.org/pub/source/v18.6/postgresql-18.6.tar.bz2", "line": 320, "path": "src/backend/executor/execProcnode.c", "label": "src/backend/executor/execProcnode.c:320", "sha256": "f8a06a3f539077249b20664b2812433db6d7bd12b2c0ca633525db43d06f112a", "archive_sha256": "555610c24d53e4316da5b7d3fc25c279d96856d5e0e23ee308c328c5fa881d9f"}, {"url": "https://ftp.postgresql.org/pub/source/v18.6/postgresql-18.6.tar.bz2", "path": "src/backend/executor/nodeSort.c", "label": "src/backend/executor/nodeSort.c", "sha256": "47c6b983626e15e112f904040e96d43190ae4b3226e7cd2b27234dc95adf54a2", "archive_sha256": "555610c24d53e4316da5b7d3fc25c279d96856d5e0e23ee308c328c5fa881d9f"}, {"url": "https://ftp.postgresql.org/pub/source/v18.6/postgresql-18.6.tar.bz2", "path": "src/include/nodes/plannodes.h", "label": "src/include/nodes/plannodes.h", "sha256": "52422b327a8049fbbb20d8b96008a0fc0a6fafa60f7eff3c695d5b2e83830120", "archive_sha256": "555610c24d53e4316da5b7d3fc25c279d96856d5e0e23ee308c328c5fa881d9f"}, {"url": "https://ftp.postgresql.org/pub/source/v18.6/postgresql-18.6.tar.bz2", "path": "src/backend/utils/sort/tuplesort.c", "label": "src/backend/utils/sort/tuplesort.c", "sha256": "509d4cef598613bbf0725f697e1e1e33f3dfc8debed20169a6c4bf1ac9e5c2e3", "archive_sha256": "555610c24d53e4316da5b7d3fc25c279d96856d5e0e23ee308c328c5fa881d9f"}, {"url": "https://pg.center/docs/18/using-explain.html#USING-EXPLAIN-BASICS", "path": "using-explain.html", "label": "PostgreSQL 18.6 \u00b7 using-explain", "sha256": "60040c30180093418a0affe56dd27dff9df2504b705b38039589e458bf5c31ed", "language": "en", "original_url": "/docs/18/using-explain.html#USING-EXPLAIN-BASICS"}, {"url": "https://pg.center/docs/18/using-explain.html#USING-EXPLAIN-ANALYZE", "path": "using-explain.html", "label": "PostgreSQL 18.6 \u00b7 using-explain", "sha256": "60040c30180093418a0affe56dd27dff9df2504b705b38039589e458bf5c31ed", "language": "en", "original_url": "/docs/18/using-explain.html#USING-EXPLAIN-ANALYZE"}], "node_tag": "T_Sort", "sections": [{"title": "EXPLAIN \u540d\u79f0\u4e0e\u5c5e\u6027", "paragraphs": ["\u7ed3\u6784\u5316\u683c\u5f0f\u4f7f\u7528\u4e0a\u8ff0 Node Type\u3002\u6587\u672c\u683c\u5f0f\u540d\u79f0\u8fd8\u53ef\u80fd\u5305\u542b\u64cd\u4f5c\u3001\u7b56\u7565\u3001\u8fde\u63a5\u7c7b\u578b\u3001\u626b\u63cf\u65b9\u5411\u6216\u805a\u5408\u9636\u6bb5\u5c5e\u6027\u3002", "\u6b64\u6e90\u7801\u8bb0\u5f55\u7684\u6587\u672c\u540d\u79f0\uff1aSort.", "\u5e76\u884c\u611f\u77e5\u4e0e\u5e76\u884c\u5b89\u5168\u662f\u4e0d\u540c\u7684\u8ba1\u5212\u5c5e\u6027\u3002\u5728\u5e76\u884c\u5de5\u4f5c\u8fdb\u7a0b\u5185\u8fd0\u884c\u7684\u8282\u70b9\u4e0d\u4e00\u5b9a\u662f\u5e76\u884c\u611f\u77e5\u8282\u70b9\u3002"]}, {"title": "\u5185\u5b58\u4e0e\u4e34\u65f6\u5b58\u50a8", "paragraphs": ["\u6b64\u8282\u70b9\u5c06 work_mem \u4f20\u7ed9 tuplesort\u3002\u6392\u5e8f\u53ef\u4f7f\u7528\u5185\u5b58\u6216\u4e34\u65f6\u6587\u4ef6\uff1b\u5b9e\u9645\u65b9\u6cd5\u548c\u7a7a\u95f4\u7528\u91cf\u53d6\u51b3\u4e8e\u8f93\u5165\u53ca\u8ba1\u5212\u3002", "\u4f7f\u7528 tuplesort \u5bf9\u8282\u70b9\u5916\u4fa7\u5b50\u6811\u7684\u5143\u7ec4\u6392\u5e8f\uff0c\u5c06\u7ed3\u679c\u4fdd\u5b58\u5728\u4e34\u65f6\u6587\u4ef6\u6216\u5185\u5b58\u4e2d\u3002\u9996\u6b21\u8c03\u7528\u4e4b\u540e\uff0c\u6bcf\u6b21\u8c03\u7528\u90fd\u4ece\u6587\u4ef6\u8fd4\u56de\u4e00\u4e2a\u5143\u7ec4\u3002"]}, {"title": "\u5e76\u884c\u6267\u884c\u4e0e\u8fd0\u884c\u4fe1\u606f\u91c7\u96c6", "paragraphs": ["\u4ee5\u4e0b\u6e90\u7801\u56de\u8c03\u53ef\u4ee5\u534f\u8c03\u6267\u884c\u6216\u6536\u96c6\u5de5\u4f5c\u8fdb\u7a0b\u7684\u6d4b\u91cf\u6570\u636e\u3002\u56de\u8c03\u5b58\u5728\u4e0d\u4ee3\u8868\u8be5\u8282\u70b9\u666e\u904d\u652f\u6301\u5171\u4eab\u5e76\u884c\u626b\u63cf\u6216\u5171\u4eab\u72b6\u6001\u3002", "\u6b64\u6784\u5efa\u7684\u56de\u8c03\uff1aExecSortEstimate, ExecSortInitializeDSM, ExecSortInitializeWorker, ExecSortRetrieveInstrumentation."]}, {"title": "\u540c\u7248\u672c\u624b\u518c\u8bf4\u660e", "paragraphs": ["\u4f30\u8ba1\u542f\u52a8\u4ee3\u4ef7\uff1a\u8f93\u51fa\u9636\u6bb5\u5f00\u59cb\u4e4b\u524d\u6d88\u8017\u7684\u65f6\u95f4\uff0c\u4f8b\u5982\u6392\u5e8f\u8282\u70b9\u6267\u884c\u6392\u5e8f\u6240\u9700\u7684\u65f6\u95f4\u3002", "\u89c4\u5212\u5668\u53ef\u4ee5\u7528\u591a\u79cd\u65b9\u5f0f\u5b9e\u73b0 ORDER BY \u5b50\u53e5\u3002\u4e0a\u9762\u7684\u793a\u4f8b\u8868\u660e\uff0c\u8fd9\u79cd\u6392\u5e8f\u5b50\u53e5\u53ef\u4ee5\u88ab\u9690\u5f0f\u6ee1\u8db3\u3002\u89c4\u5212\u5668\u4e5f\u53ef\u80fd\u663e\u5f0f\u589e\u52a0\u4e00\u4e2a Sort \u6b65\u9aa4\uff1a", "\u5982\u679c\u8ba1\u5212\u4e2d\u7684\u67d0\u4e00\u90e8\u5206\u5df2\u7ecf\u4fdd\u8bc1\u4e86\u6240\u9700\u6392\u5e8f\u952e\u524d\u7f00\u7684\u987a\u5e8f\uff0c\u89c4\u5212\u5668\u4e5f\u53ef\u80fd\u6539\u7528 Incremental Sort \u6b65\u9aa4\uff1a", "\u5f52\u5e76\u8fde\u63a5\u8981\u6c42\u8f93\u5165\u6570\u636e\u6309\u8fde\u63a5\u952e\u6392\u5e8f\u3002\u5728\u8fd9\u4e2a\u4f8b\u5b50\u4e2d\uff0c\u4e24\u4e2a\u8f93\u5165\u90fd\u901a\u8fc7\u7d22\u5f15\u626b\u63cf\u6309\u6b63\u786e\u987a\u5e8f\u8bbf\u95ee\u884c\u800c\u5b8c\u6210\u6392\u5e8f\uff1b\u4e0d\u8fc7\u4e5f\u53ef\u4ee5\u91c7\u7528\u987a\u5e8f\u626b\u63cf\u518d\u6392\u5e8f\u7684\u65b9\u5f0f\u3002\uff08\u5bf9\u4e8e\u9700\u8981\u6392\u5e8f\u5f88\u591a\u884c\u7684\u60c5\u51b5\uff0c\u987a\u5e8f\u626b\u63cf\u52a0\u6392\u5e8f\u5f80\u5f80\u4f1a\u80dc\u8fc7\u7d22\u5f15\u626b\u63cf\uff0c\u56e0\u4e3a\u7d22\u5f15\u626b\u63cf\u9700\u8981\u975e\u987a\u5e8f\u78c1\u76d8\u8bbf\u95ee\u3002\uff09", "\u5728\u67d0\u4e9b\u60c5\u51b5\u4e0b\uff0cEXPLAIN ANALYZE \u9664\u4e86\u8ba1\u5212\u8282\u70b9\u7684\u6267\u884c\u65f6\u95f4\u548c\u884c\u6570\u4e4b\u5916\uff0c\u8fd8\u4f1a\u663e\u793a\u989d\u5916\u7684\u6267\u884c\u7edf\u8ba1\u4fe1\u606f\u3002\u4f8b\u5982\uff0cSort \u548c Hash \u8282\u70b9\u4f1a\u63d0\u4f9b\u66f4\u591a\u4fe1\u606f\uff1a", "Sort \u8282\u70b9\u663e\u793a\u6392\u5e8f\u65b9\u6cd5\uff08\u5c24\u5176\u662f\u5185\u5b58\u6392\u5e8f\u8fd8\u662f\u78c1\u76d8\u6392\u5e8f\uff09\u53ca\u6240\u9700\u5185\u5b58\u6216\u78c1\u76d8\u7a7a\u95f4\u3002Hash \u8282\u70b9\u663e\u793a\u54c8\u5e0c\u6876\u6570\u3001\u6279\u6b21\u6570\u53ca\u54c8\u5e0c\u8868\u5185\u5b58\u4f7f\u7528\u5cf0\u503c\u3002\uff08\u6279\u6b21\u6570\u8d85\u8fc7\u4e00\u65f6\u4e5f\u4f1a\u4f7f\u7528\u78c1\u76d8\u7a7a\u95f4\uff0c\u4f46\u6b64\u5904\u4e0d\u663e\u793a\u3002\uff09"]}, {"title": "\u672c\u7248\u624b\u518c\u4e2d\u7684\u793a\u4f8b", "blocks": [{"code": "EXPLAIN SELECT * FROM tenk1 ORDER BY unique1;\n\n                            QUERY PLAN\n-------------------------------------------------------------------\n Sort  (cost=1109.39..1134.39 rows=10000 width=244)\n   Sort Key: unique1\n   ->  Seq Scan on tenk1  (cost=0.00..445.00 rows=10000 width=244)", "source": {"url": "/docs/18/using-explain.html#USING-EXPLAIN-BASICS", "path": "using-explain.html", "label": "PostgreSQL 18.6 \u00b7 using-explain", "sha256": "60040c30180093418a0affe56dd27dff9df2504b705b38039589e458bf5c31ed"}, "paragraphs": ["\u793a\u4f8b\u6458\u81ea PostgreSQL 18.6 \u624b\u518c\uff1b\u672c\u767e\u79d1\u672a\u5b9e\u9645\u6267\u884c\u6b64\u793a\u4f8b\u3002", "\u89c4\u5212\u5668\u53ef\u4ee5\u7528\u591a\u79cd\u65b9\u5f0f\u5b9e\u73b0 ORDER BY \u5b50\u53e5\u3002\u4e0a\u9762\u7684\u793a\u4f8b\u8868\u660e\uff0c\u8fd9\u79cd\u6392\u5e8f\u5b50\u53e5\u53ef\u4ee5\u88ab\u9690\u5f0f\u6ee1\u8db3\u3002\u89c4\u5212\u5668\u4e5f\u53ef\u80fd\u663e\u5f0f\u589e\u52a0\u4e00\u4e2a Sort \u6b65\u9aa4\uff1a"]}, {"code": "EXPLAIN SELECT * FROM tenk1 ORDER BY hundred, ten LIMIT 100;\n\n                                              QUERY PLAN\n------------------------------------------------------------------------------------------------\n Limit  (cost=19.35..39.49 rows=100 width=244)\n   ->  Incremental Sort  (cost=19.35..2033.39 rows=10000 width=244)\n         Sort Key: hundred, ten\n         Presorted Key: hundred\n         ->  Index Scan using tenk1_hundred on tenk1  (cost=0.29..1574.20 rows=10000 width=244)", "source": {"url": "/docs/18/using-explain.html#USING-EXPLAIN-BASICS", "path": "using-explain.html", "label": "PostgreSQL 18.6 \u00b7 using-explain", "sha256": "60040c30180093418a0affe56dd27dff9df2504b705b38039589e458bf5c31ed"}, "paragraphs": ["\u793a\u4f8b\u6458\u81ea PostgreSQL 18.6 \u624b\u518c\uff1b\u672c\u767e\u79d1\u672a\u5b9e\u9645\u6267\u884c\u6b64\u793a\u4f8b\u3002", "\u5982\u679c\u8ba1\u5212\u4e2d\u7684\u67d0\u4e00\u90e8\u5206\u5df2\u7ecf\u4fdd\u8bc1\u4e86\u6240\u9700\u6392\u5e8f\u952e\u524d\u7f00\u7684\u987a\u5e8f\uff0c\u89c4\u5212\u5668\u4e5f\u53ef\u80fd\u6539\u7528 Incremental Sort \u6b65\u9aa4\uff1a"]}]}, {"title": "\u6267\u884c\u5668\u5b9e\u73b0\u8bf4\u660e", "paragraphs": ["\u4f7f\u7528 tuplesort \u5bf9\u8282\u70b9\u5916\u4fa7\u5b50\u6811\u7684\u5143\u7ec4\u6392\u5e8f\uff0c\u5c06\u7ed3\u679c\u4fdd\u5b58\u5728\u4e34\u65f6\u6587\u4ef6\u6216\u5185\u5b58\u4e2d\u3002\u9996\u6b21\u8c03\u7528\u4e4b\u540e\uff0c\u6bcf\u6b21\u8c03\u7528\u90fd\u4ece\u6587\u4ef6\u8fd4\u56de\u4e00\u4e2a\u5143\u7ec4\u3002", "\u6b64\u6392\u5e8f\u53ef\u7528\u4e24\u79cd\u4e0d\u540c\u65b9\u5f0f\u6267\u884c\uff1a", "1\uff09\u7ed3\u679c\u53ea\u6709\u4e00\u5217\u65f6\uff0c\u6267\u884c Datum \u6392\u5e8f\u3002", "2\uff09\u7ed3\u679c\u5305\u542b\u591a\u5217\u65f6\uff0c\u6267\u884c\u5143\u7ec4\u6392\u5e8f\u3002", "\u4e5f\u53ef\u4ee5\u59cb\u7ec8\u6267\u884c\u5143\u7ec4\u6392\u5e8f\uff0c\u4f46\u4ec5\u5bf9 Datum \u6392\u5e8f\u53ef\u80fd\u663e\u8457\u66f4\u5feb\uff0c\u5c24\u5176\u5f53 Datum \u5c5e\u4e8e\u6309\u503c\u4f20\u9012\u7684\u7c7b\u578b\u65f6\u3002"]}, {"code": "case T_Sort:\n\t\t\tpname = sname = \"Sort\";\n\t\t\tbreak;", "title": "\u6838\u5fc3\u6e90\u7801\u4e2d\u7684 EXPLAIN \u6807\u8bc6"}], "strategies": [], "description": ["\u6309\u8ba1\u5212\u6392\u5e8f\u952e\u5bf9\u5b50\u8ba1\u5212\u8f93\u51fa\u7684\u884c\u6392\u5e8f\u3002"], "localization": {"status": "complete", "sources": [{"url": "/docs/18/using-explain.html", "method": "same-major semantic node", "sha256": "b8835ec9adbc70ec150667a6b5443f8d298222dc0cc8c2bd1abb1c1d64895904", "language": "zh", "matched_nodes": ["#USING-EXPLAIN/div[7]/p[27]", "#USING-EXPLAIN/div[7]/p[29]", "#USING-EXPLAIN/div[7]/p[51]"]}], "language": "zh", "original_text": {"/versions/18/description/0": "Sorts rows from its child according to the plan sort keys.", "/versions/18/facts/0/label": "Core node tag", "/versions/18/facts/1/label": "Structured EXPLAIN Node Type", "/versions/18/facts/2/label": "Inputs", "/versions/18/facts/2/value": "One child plan", "/versions/18/facts/3/label": "Output", "/versions/18/facts/3/value": "Sorted tuples", "/versions/18/facts/4/label": "Executor initializer", "/versions/18/facts/5/label": "Memory mechanism", "/versions/18/tables/0/title": "EXPLAIN labels in this source build", "/versions/18/related/1/label": "Using EXPLAIN", "/versions/18/related/2/label": "Parallel plans", "/versions/18/sections/0/title": "EXPLAIN names and attributes", "/versions/18/sections/1/title": "Memory and temporary storage", "/versions/18/sections/2/title": "Parallel execution and instrumentation", "/versions/18/sections/3/title": "Same-version manual discussion", "/versions/18/sections/4/title": "Examples from this manual build", "/versions/18/sections/5/title": "Executor implementation notes", "/versions/18/sections/6/title": "EXPLAIN identity in core source", "/versions/18/memory/description": "The node passes work_mem to tuplesort. Sorting can use memory or temporary files; the actual method and space use depend on the input and plan.", "/versions/18/sections/0/paragraphs/0": "Structured formats use the Node Type above. Text-format spellings can also include operation, strategy, join type, scan direction or aggregation-stage attributes.", "/versions/18/sections/0/paragraphs/1": "Text names recorded by this source: Sort.", "/versions/18/sections/0/paragraphs/2": "Parallel-aware and parallel-safe are different plan properties. A node running inside a parallel worker is not necessarily a parallel-aware node.", "/versions/18/sections/1/paragraphs/0": "The node passes work_mem to tuplesort. Sorting can use memory or temporary files; the actual method and space use depend on the input and plan.", "/versions/18/sections/1/paragraphs/1": "Sorts tuples from the outer subtree of the node using tuplesort, which saves the results in a temporary file or memory. After the initial call, returns a tuple from the file with each call.", "/versions/18/sections/2/paragraphs/0": "The source callbacks below can coordinate execution or collect worker instrumentation. Their presence is not a blanket claim that this node supports a shared parallel scan or shared state.", "/versions/18/sections/2/paragraphs/1": "Callbacks in this build: ExecSortEstimate, ExecSortInitializeDSM, ExecSortInitializeWorker, ExecSortRetrieveInstrumentation.", "/versions/18/sections/3/paragraphs/0": "Estimated start-up cost. This is the time expended before the output phase can begin, e.g., time to do the sorting in a sort node.", "/versions/18/sections/3/paragraphs/1": "The planner may implement an ORDER BY clause in several ways. The above example shows that such an ordering clause may be implemented implicitly. The planner may also add an explicit Sort step:", "/versions/18/sections/3/paragraphs/2": "If a part of the plan guarantees an ordering on a prefix of the required sort keys, then the planner may instead decide to use an Incremental Sort step:", "/versions/18/sections/3/paragraphs/3": "Merge join requires its input data to be sorted on the join keys. In this example each input is sorted by using an index scan to visit the rows in the correct order; but a sequential scan and sort could also be used. (Sequential-scan-and-sort frequently beats an index scan for sorting many rows, because of the nonsequential disk access required by the index scan.)", "/versions/18/sections/3/paragraphs/4": "In some cases EXPLAIN ANALYZE shows additional execution statistics beyond the plan node execution times and row counts. For example, Sort and Hash nodes provide extra information:", "/versions/18/sections/3/paragraphs/5": "The Sort node shows the sort method used (in particular, whether the sort was in-memory or on-disk) and the amount of memory or disk space needed. The Hash node shows the number of hash buckets and batches as well as the peak amount of memory used for the hash table. (If the number of batches exceeds one, there will also be disk space usage involved, but that is not shown.)", "/versions/18/sections/5/paragraphs/0": "Sorts tuples from the outer subtree of the node using tuplesort, which saves the results in a temporary file or memory. After the initial call, returns a tuple from the file with each call.", "/versions/18/sections/5/paragraphs/1": "There are two distinct ways that this sort can be performed:", "/versions/18/sections/5/paragraphs/2": "1) When the result is a single column we perform a Datum sort.", "/versions/18/sections/5/paragraphs/3": "2) When the result contains multiple columns we perform a tuple sort.", "/versions/18/sections/5/paragraphs/4": "We could do this by always performing a tuple sort, however sorting Datums only can be significantly faster than sorting tuples, especially when the Datums are of a pass-by-value type.", "/versions/18/tables/0/columns/0/label": "Text-format label", "/versions/18/tables/0/columns/1/label": "Structured node identity", "/versions/18/sections/4/blocks/0/paragraphs/0": "Example copied from the PostgreSQL 18.6 manual; it was not executed for this collection.", "/versions/18/sections/4/blocks/0/paragraphs/1": "The planner may implement an ORDER BY clause in several ways. The above example shows that such an ordering clause may be implemented implicitly. The planner may also add an explicit Sort step:", "/versions/18/sections/4/blocks/1/paragraphs/0": "Example copied from the PostgreSQL 18.6 manual; it was not executed for this collection.", "/versions/18/sections/4/blocks/1/paragraphs/1": "If a part of the plan guarantees an ordering on a prefix of the required sort keys, then the planner may instead decide to use an Incremental Sort step:"}, "fallback_fields": [], "source_language": "en", "original_snapshot_sha256": "658f474e9a5baffc05bd4c380ff770c5624945b0b7dd56752a05dffc04a2172c"}, "evidence_kind": "source and documentation", "explain_names": ["Sort"], "partial_modes": [], "comparison_data": {"node_tag": "T_Sort", "strategies": [], "text_names": ["Sort"], "initializer": "ExecInitSort", "partial_modes": [], "memory_mechanism": "tuplesort", "parallel_callbacks": ["ExecSortEstimate", "ExecSortInitializeDSM", "ExecSortInitializeWorker", "ExecSortRetrieveInstrumentation"]}, "comparison_hash": "32a824f93669794b01449d5d8a08ff4edcb6024cb1a897131b35fe5cddc2e4da", "explain_prefixes": ["Parallel", "Async"], "runtime_verified": false, "source_inventory": {"explain": "src/backend/commands/explain.c", "executor": "src/backend/executor/execProcnode.c", "implementation": "src/backend/executor/nodeSort.c"}, "parallel_callbacks": ["ExecSortEstimate", "ExecSortInitializeDSM", "ExecSortInitializeWorker", "ExecSortRetrieveInstrumentation"]}, "19": {"facts": [{"label": "\u6838\u5fc3\u8282\u70b9\u6807\u7b7e", "value": "T_Sort"}, {"label": "\u7ed3\u6784\u5316 EXPLAIN \u8282\u70b9\u7c7b\u578b", "value": "Sort"}, {"label": "\u8f93\u5165", "value": "\u4e00\u4e2a\u5b50\u8ba1\u5212"}, {"label": "\u8f93\u51fa", "value": "\u5df2\u6392\u5e8f\u7684\u5143\u7ec4"}, {"label": "\u6267\u884c\u5668\u521d\u59cb\u5316\u51fd\u6570", "value": "ExecInitSort"}, {"label": "\u5185\u5b58\u673a\u5236", "value": "tuplesort"}], "memory": {"evidence": [{"url": "https://ftp.postgresql.org/pub/source/v19beta4/postgresql-19beta4.tar.bz2", "path": "src/backend/executor/nodeSort.c", "label": "src/backend/executor/nodeSort.c", "sha256": "f5ffade5df879b417e269f2a8bbfca8f727b09de6c1a47ab3b5e5d57da817732", "archive_sha256": "83157ee9c599d03b2f7a3d73ef3a56ec24e0e79cc2b3501a64d1364f56398c86"}, {"url": "https://ftp.postgresql.org/pub/source/v19beta4/postgresql-19beta4.tar.bz2", "path": "src/backend/utils/sort/tuplesort.c", "label": "src/backend/utils/sort/tuplesort.c", "sha256": "5687562c1a9a65e8b567ec865e0cb04e0cd6b3e196dbf13afdde7d52c4eb16ae", "archive_sha256": "83157ee9c599d03b2f7a3d73ef3a56ec24e0e79cc2b3501a64d1364f56398c86"}], "mechanism": "tuplesort", "description": "\u6b64\u8282\u70b9\u5c06 work_mem \u4f20\u7ed9 tuplesort\u3002\u6392\u5e8f\u53ef\u4f7f\u7528\u5185\u5b58\u6216\u4e34\u65f6\u6587\u4ef6\uff1b\u5b9e\u9645\u65b9\u6cd5\u548c\u7a7a\u95f4\u7528\u91cf\u53d6\u51b3\u4e8e\u8f93\u5165\u53ca\u8ba1\u5212\u3002", "source_notes": ["Sorts tuples from the outer subtree of the node using tuplesort, which saves the results in a temporary file or memory. After the initial call, returns a tuple from the file with each call."]}, "tables": [{"key": "explain-labels", "rows": [{"label": "Sort", "identity": "Sort"}], "title": "\u672c\u6784\u5efa\u4e2d\u7684 EXPLAIN \u6807\u7b7e", "columns": [{"key": "label", "label": "\u6587\u672c\u683c\u5f0f\u6807\u7b7e"}, {"key": "identity", "label": "\u7ed3\u6784\u5316\u8282\u70b9\u6807\u8bc6"}]}], "related": [{"url": "/wiki/sql/explain/?v=19", "label": "EXPLAIN"}, {"url": "/docs/19/using-explain.html", "label": "\u4f7f\u7528 EXPLAIN"}, {"url": "/docs/19/parallel-plans.html", "label": "\u5e76\u884c\u8ba1\u5212"}, {"url": "/wiki/guc/enable_sort/?v=19", "label": "enable_sort"}, {"url": "/wiki/guc/work_mem/?v=19", "label": "work_mem"}], "release": {"ref": "PostgreSQL 19beta4 source archive", "label": "19beta4", "major": "19", "channel": "preview", "revision": "83157ee9c599d03b2f7a3d73ef3a56ec24e0e79cc2b3501a64d1364f56398c86", "source_url": "https://ftp.postgresql.org/pub/source/v19beta4/postgresql-19beta4.tar.bz2", "source_snapshot_utc": ""}, "sources": [{"url": "https://ftp.postgresql.org/pub/source/v19beta4/postgresql-19beta4.tar.bz2", "line": 1534, "path": "src/backend/commands/explain.c", "label": "src/backend/commands/explain.c:1534", "sha256": "8b115b1c194a4b54ae630209a741e293b1df49a9052f10b2de9ca092a48998e3", "archive_sha256": "83157ee9c599d03b2f7a3d73ef3a56ec24e0e79cc2b3501a64d1364f56398c86"}, {"url": "https://ftp.postgresql.org/pub/source/v19beta4/postgresql-19beta4.tar.bz2", "line": 320, "path": "src/backend/executor/execProcnode.c", "label": "src/backend/executor/execProcnode.c:320", "sha256": "5e39b2037bed672da55104229ecc32da5abde44c26bcad01479edcfa044d09ed", "archive_sha256": "83157ee9c599d03b2f7a3d73ef3a56ec24e0e79cc2b3501a64d1364f56398c86"}, {"url": "https://ftp.postgresql.org/pub/source/v19beta4/postgresql-19beta4.tar.bz2", "path": "src/backend/executor/nodeSort.c", "label": "src/backend/executor/nodeSort.c", "sha256": "f5ffade5df879b417e269f2a8bbfca8f727b09de6c1a47ab3b5e5d57da817732", "archive_sha256": "83157ee9c599d03b2f7a3d73ef3a56ec24e0e79cc2b3501a64d1364f56398c86"}, {"url": "https://ftp.postgresql.org/pub/source/v19beta4/postgresql-19beta4.tar.bz2", "path": "src/include/nodes/plannodes.h", "label": "src/include/nodes/plannodes.h", "sha256": "1c65d5d6b6c81c71531685843647869bcae630779d815a5036b06e070c6c06c7", "archive_sha256": "83157ee9c599d03b2f7a3d73ef3a56ec24e0e79cc2b3501a64d1364f56398c86"}, {"url": "https://ftp.postgresql.org/pub/source/v19beta4/postgresql-19beta4.tar.bz2", "path": "src/backend/utils/sort/tuplesort.c", "label": "src/backend/utils/sort/tuplesort.c", "sha256": "5687562c1a9a65e8b567ec865e0cb04e0cd6b3e196dbf13afdde7d52c4eb16ae", "archive_sha256": "83157ee9c599d03b2f7a3d73ef3a56ec24e0e79cc2b3501a64d1364f56398c86"}, {"url": "https://pg.center/docs/19/using-explain.html#USING-EXPLAIN-BASICS", "path": "using-explain.html", "label": "PostgreSQL 19beta4 \u00b7 using-explain", "sha256": "52f111fbd213e2200146319d01a9dcc2ea90001617d2a28edc52f7954c2dd70b", "language": "en", "original_url": "/docs/19/using-explain.html#USING-EXPLAIN-BASICS"}, {"url": "https://pg.center/docs/19/using-explain.html#USING-EXPLAIN-ANALYZE", "path": "using-explain.html", "label": "PostgreSQL 19beta4 \u00b7 using-explain", "sha256": "52f111fbd213e2200146319d01a9dcc2ea90001617d2a28edc52f7954c2dd70b", "language": "en", "original_url": "/docs/19/using-explain.html#USING-EXPLAIN-ANALYZE"}], "node_tag": "T_Sort", "sections": [{"title": "EXPLAIN \u540d\u79f0\u4e0e\u5c5e\u6027", "paragraphs": ["\u7ed3\u6784\u5316\u683c\u5f0f\u4f7f\u7528\u4e0a\u8ff0 Node Type\u3002\u6587\u672c\u683c\u5f0f\u540d\u79f0\u8fd8\u53ef\u80fd\u5305\u542b\u64cd\u4f5c\u3001\u7b56\u7565\u3001\u8fde\u63a5\u7c7b\u578b\u3001\u626b\u63cf\u65b9\u5411\u6216\u805a\u5408\u9636\u6bb5\u5c5e\u6027\u3002", "\u6b64\u6e90\u7801\u8bb0\u5f55\u7684\u6587\u672c\u540d\u79f0\uff1aSort.", "\u5e76\u884c\u611f\u77e5\u4e0e\u5e76\u884c\u5b89\u5168\u662f\u4e0d\u540c\u7684\u8ba1\u5212\u5c5e\u6027\u3002\u5728\u5e76\u884c\u5de5\u4f5c\u8fdb\u7a0b\u5185\u8fd0\u884c\u7684\u8282\u70b9\u4e0d\u4e00\u5b9a\u662f\u5e76\u884c\u611f\u77e5\u8282\u70b9\u3002"]}, {"title": "\u5185\u5b58\u4e0e\u4e34\u65f6\u5b58\u50a8", "paragraphs": ["\u6b64\u8282\u70b9\u5c06 work_mem \u4f20\u7ed9 tuplesort\u3002\u6392\u5e8f\u53ef\u4f7f\u7528\u5185\u5b58\u6216\u4e34\u65f6\u6587\u4ef6\uff1b\u5b9e\u9645\u65b9\u6cd5\u548c\u7a7a\u95f4\u7528\u91cf\u53d6\u51b3\u4e8e\u8f93\u5165\u53ca\u8ba1\u5212\u3002", "\u4f7f\u7528 tuplesort \u5bf9\u8282\u70b9\u5916\u4fa7\u5b50\u6811\u7684\u5143\u7ec4\u6392\u5e8f\uff0c\u5c06\u7ed3\u679c\u4fdd\u5b58\u5728\u4e34\u65f6\u6587\u4ef6\u6216\u5185\u5b58\u4e2d\u3002\u9996\u6b21\u8c03\u7528\u4e4b\u540e\uff0c\u6bcf\u6b21\u8c03\u7528\u90fd\u4ece\u6587\u4ef6\u8fd4\u56de\u4e00\u4e2a\u5143\u7ec4\u3002"]}, {"title": "\u5e76\u884c\u6267\u884c\u4e0e\u8fd0\u884c\u4fe1\u606f\u91c7\u96c6", "paragraphs": ["\u4ee5\u4e0b\u6e90\u7801\u56de\u8c03\u53ef\u4ee5\u534f\u8c03\u6267\u884c\u6216\u6536\u96c6\u5de5\u4f5c\u8fdb\u7a0b\u7684\u6d4b\u91cf\u6570\u636e\u3002\u56de\u8c03\u5b58\u5728\u4e0d\u4ee3\u8868\u8be5\u8282\u70b9\u666e\u904d\u652f\u6301\u5171\u4eab\u5e76\u884c\u626b\u63cf\u6216\u5171\u4eab\u72b6\u6001\u3002", "\u6b64\u6784\u5efa\u7684\u56de\u8c03\uff1aExecSortEstimate, ExecSortInitializeDSM, ExecSortInitializeWorker, ExecSortRetrieveInstrumentation."]}, {"title": "\u540c\u7248\u672c\u624b\u518c\u8bf4\u660e", "paragraphs": ["\u4f30\u8ba1\u542f\u52a8\u4ee3\u4ef7\uff1a\u8f93\u51fa\u9636\u6bb5\u5f00\u59cb\u4e4b\u524d\u6d88\u8017\u7684\u65f6\u95f4\uff0c\u4f8b\u5982\u6392\u5e8f\u8282\u70b9\u6267\u884c\u6392\u5e8f\u6240\u9700\u7684\u65f6\u95f4\u3002", "\u89c4\u5212\u5668\u53ef\u4ee5\u7528\u591a\u79cd\u65b9\u5f0f\u5b9e\u73b0 ORDER BY \u5b50\u53e5\u3002\u4e0a\u9762\u7684\u793a\u4f8b\u8868\u660e\uff0c\u8fd9\u79cd\u6392\u5e8f\u5b50\u53e5\u53ef\u4ee5\u88ab\u9690\u5f0f\u6ee1\u8db3\u3002\u89c4\u5212\u5668\u4e5f\u53ef\u80fd\u663e\u5f0f\u589e\u52a0\u4e00\u4e2a Sort \u6b65\u9aa4\uff1a", "\u5982\u679c\u8ba1\u5212\u4e2d\u7684\u67d0\u4e00\u90e8\u5206\u5df2\u7ecf\u4fdd\u8bc1\u4e86\u6240\u9700\u6392\u5e8f\u952e\u524d\u7f00\u7684\u987a\u5e8f\uff0c\u89c4\u5212\u5668\u4e5f\u53ef\u80fd\u6539\u7528 Incremental Sort \u6b65\u9aa4\uff1a", "\u5f52\u5e76\u8fde\u63a5\u8981\u6c42\u8f93\u5165\u6570\u636e\u6309\u8fde\u63a5\u952e\u6392\u5e8f\u3002\u5728\u8fd9\u4e2a\u4f8b\u5b50\u4e2d\uff0c\u4e24\u4e2a\u8f93\u5165\u90fd\u901a\u8fc7\u7d22\u5f15\u626b\u63cf\u6309\u6b63\u786e\u987a\u5e8f\u8bbf\u95ee\u884c\u800c\u5b8c\u6210\u6392\u5e8f\uff1b\u4e0d\u8fc7\u4e5f\u53ef\u4ee5\u91c7\u7528\u987a\u5e8f\u626b\u63cf\u518d\u6392\u5e8f\u7684\u65b9\u5f0f\u3002\uff08\u5bf9\u4e8e\u9700\u8981\u6392\u5e8f\u5f88\u591a\u884c\u7684\u60c5\u51b5\uff0c\u987a\u5e8f\u626b\u63cf\u52a0\u6392\u5e8f\u5f80\u5f80\u4f1a\u80dc\u8fc7\u7d22\u5f15\u626b\u63cf\uff0c\u56e0\u4e3a\u7d22\u5f15\u626b\u63cf\u9700\u8981\u975e\u987a\u5e8f\u78c1\u76d8\u8bbf\u95ee\u3002\uff09", "\u5728\u67d0\u4e9b\u60c5\u51b5\u4e0b\uff0cEXPLAIN ANALYZE \u9664\u4e86\u8ba1\u5212\u8282\u70b9\u7684\u6267\u884c\u65f6\u95f4\u548c\u884c\u6570\u4e4b\u5916\uff0c\u8fd8\u4f1a\u663e\u793a\u989d\u5916\u7684\u6267\u884c\u7edf\u8ba1\u4fe1\u606f\u3002\u4f8b\u5982\uff0cSort \u548c Hash \u8282\u70b9\u4f1a\u63d0\u4f9b\u66f4\u591a\u4fe1\u606f\uff1a", "Sort \u8282\u70b9\u663e\u793a\u6392\u5e8f\u65b9\u6cd5\uff08\u5c24\u5176\u662f\u5185\u5b58\u6392\u5e8f\u8fd8\u662f\u78c1\u76d8\u6392\u5e8f\uff09\u53ca\u6240\u9700\u5185\u5b58\u6216\u78c1\u76d8\u7a7a\u95f4\u3002Hash \u8282\u70b9\u663e\u793a\u54c8\u5e0c\u6876\u6570\u3001\u6279\u6b21\u6570\u53ca\u54c8\u5e0c\u8868\u5185\u5b58\u4f7f\u7528\u5cf0\u503c\u3002\uff08\u6279\u6b21\u6570\u8d85\u8fc7\u4e00\u65f6\u4e5f\u4f1a\u4f7f\u7528\u78c1\u76d8\u7a7a\u95f4\uff0c\u4f46\u6b64\u5904\u4e0d\u663e\u793a\u3002\uff09"]}, {"title": "\u672c\u7248\u624b\u518c\u4e2d\u7684\u793a\u4f8b", "blocks": [{"code": "EXPLAIN SELECT * FROM tenk1 ORDER BY unique1;\n\n                            QUERY PLAN\n-------------------------------------------------------------------\n Sort  (cost=1109.39..1134.39 rows=10000 width=244)\n   Sort Key: unique1\n   ->  Seq Scan on tenk1  (cost=0.00..445.00 rows=10000 width=244)", "source": {"url": "/docs/19/using-explain.html#USING-EXPLAIN-BASICS", "path": "using-explain.html", "label": "PostgreSQL 19beta4 \u00b7 using-explain", "sha256": "52f111fbd213e2200146319d01a9dcc2ea90001617d2a28edc52f7954c2dd70b"}, "paragraphs": ["\u793a\u4f8b\u6458\u81ea PostgreSQL 19beta4 \u624b\u518c\uff1b\u672c\u767e\u79d1\u672a\u5b9e\u9645\u6267\u884c\u6b64\u793a\u4f8b\u3002", "\u89c4\u5212\u5668\u53ef\u4ee5\u7528\u591a\u79cd\u65b9\u5f0f\u5b9e\u73b0 ORDER BY \u5b50\u53e5\u3002\u4e0a\u9762\u7684\u793a\u4f8b\u8868\u660e\uff0c\u8fd9\u79cd\u6392\u5e8f\u5b50\u53e5\u53ef\u4ee5\u88ab\u9690\u5f0f\u6ee1\u8db3\u3002\u89c4\u5212\u5668\u4e5f\u53ef\u80fd\u663e\u5f0f\u589e\u52a0\u4e00\u4e2a Sort \u6b65\u9aa4\uff1a"]}, {"code": "EXPLAIN SELECT * FROM tenk1 ORDER BY hundred, ten LIMIT 100;\n\n                                              QUERY PLAN\n------------------------------------------------------------------------------------------------\n Limit  (cost=19.35..39.49 rows=100 width=244)\n   ->  Incremental Sort  (cost=19.35..2033.39 rows=10000 width=244)\n         Sort Key: hundred, ten\n         Presorted Key: hundred\n         ->  Index Scan using tenk1_hundred on tenk1  (cost=0.29..1574.20 rows=10000 width=244)", "source": {"url": "/docs/19/using-explain.html#USING-EXPLAIN-BASICS", "path": "using-explain.html", "label": "PostgreSQL 19beta4 \u00b7 using-explain", "sha256": "52f111fbd213e2200146319d01a9dcc2ea90001617d2a28edc52f7954c2dd70b"}, "paragraphs": ["\u793a\u4f8b\u6458\u81ea PostgreSQL 19beta4 \u624b\u518c\uff1b\u672c\u767e\u79d1\u672a\u5b9e\u9645\u6267\u884c\u6b64\u793a\u4f8b\u3002", "\u5982\u679c\u8ba1\u5212\u4e2d\u7684\u67d0\u4e00\u90e8\u5206\u5df2\u7ecf\u4fdd\u8bc1\u4e86\u6240\u9700\u6392\u5e8f\u952e\u524d\u7f00\u7684\u987a\u5e8f\uff0c\u89c4\u5212\u5668\u4e5f\u53ef\u80fd\u6539\u7528 Incremental Sort \u6b65\u9aa4\uff1a"]}]}, {"title": "\u6267\u884c\u5668\u5b9e\u73b0\u8bf4\u660e", "paragraphs": ["\u4f7f\u7528 tuplesort \u5bf9\u8282\u70b9\u5916\u4fa7\u5b50\u6811\u7684\u5143\u7ec4\u6392\u5e8f\uff0c\u5c06\u7ed3\u679c\u4fdd\u5b58\u5728\u4e34\u65f6\u6587\u4ef6\u6216\u5185\u5b58\u4e2d\u3002\u9996\u6b21\u8c03\u7528\u4e4b\u540e\uff0c\u6bcf\u6b21\u8c03\u7528\u90fd\u4ece\u6587\u4ef6\u8fd4\u56de\u4e00\u4e2a\u5143\u7ec4\u3002", "\u6b64\u6392\u5e8f\u53ef\u7528\u4e24\u79cd\u4e0d\u540c\u65b9\u5f0f\u6267\u884c\uff1a", "1\uff09\u7ed3\u679c\u53ea\u6709\u4e00\u5217\u65f6\uff0c\u6267\u884c Datum \u6392\u5e8f\u3002", "2\uff09\u7ed3\u679c\u5305\u542b\u591a\u5217\u65f6\uff0c\u6267\u884c\u5143\u7ec4\u6392\u5e8f\u3002", "\u4e5f\u53ef\u4ee5\u59cb\u7ec8\u6267\u884c\u5143\u7ec4\u6392\u5e8f\uff0c\u4f46\u4ec5\u5bf9 Datum \u6392\u5e8f\u53ef\u80fd\u663e\u8457\u66f4\u5feb\uff0c\u5c24\u5176\u5f53 Datum \u5c5e\u4e8e\u6309\u503c\u4f20\u9012\u7684\u7c7b\u578b\u65f6\u3002"]}, {"code": "case T_Sort:\n\t\t\tpname = sname = \"Sort\";\n\t\t\tbreak;", "title": "\u6838\u5fc3\u6e90\u7801\u4e2d\u7684 EXPLAIN \u6807\u8bc6"}], "strategies": [], "description": ["\u6309\u8ba1\u5212\u6392\u5e8f\u952e\u5bf9\u5b50\u8ba1\u5212\u8f93\u51fa\u7684\u884c\u6392\u5e8f\u3002"], "localization": {"status": "complete", "sources": [{"url": "/docs/19/using-explain.html", "method": "same-major semantic node", "sha256": "7cc78f59bf29afb1811ece53e9d5c572a3f634d66d7422fb8761f19bc6811492", "language": "zh", "matched_nodes": ["#USING-EXPLAIN/div[7]/p[27]", "#USING-EXPLAIN/div[7]/p[29]", "#USING-EXPLAIN/div[7]/p[51]"]}], "language": "zh", "original_text": {"/versions/19/description/0": "Sorts rows from its child according to the plan sort keys.", "/versions/19/facts/0/label": "Core node tag", "/versions/19/facts/1/label": "Structured EXPLAIN Node Type", "/versions/19/facts/2/label": "Inputs", "/versions/19/facts/2/value": "One child plan", "/versions/19/facts/3/label": "Output", "/versions/19/facts/3/value": "Sorted tuples", "/versions/19/facts/4/label": "Executor initializer", "/versions/19/facts/5/label": "Memory mechanism", "/versions/19/tables/0/title": "EXPLAIN labels in this source build", "/versions/19/related/1/label": "Using EXPLAIN", "/versions/19/related/2/label": "Parallel plans", "/versions/19/sections/0/title": "EXPLAIN names and attributes", "/versions/19/sections/1/title": "Memory and temporary storage", "/versions/19/sections/2/title": "Parallel execution and instrumentation", "/versions/19/sections/3/title": "Same-version manual discussion", "/versions/19/sections/4/title": "Examples from this manual build", "/versions/19/sections/5/title": "Executor implementation notes", "/versions/19/sections/6/title": "EXPLAIN identity in core source", "/versions/19/memory/description": "The node passes work_mem to tuplesort. Sorting can use memory or temporary files; the actual method and space use depend on the input and plan.", "/versions/19/sections/0/paragraphs/0": "Structured formats use the Node Type above. Text-format spellings can also include operation, strategy, join type, scan direction or aggregation-stage attributes.", "/versions/19/sections/0/paragraphs/1": "Text names recorded by this source: Sort.", "/versions/19/sections/0/paragraphs/2": "Parallel-aware and parallel-safe are different plan properties. A node running inside a parallel worker is not necessarily a parallel-aware node.", "/versions/19/sections/1/paragraphs/0": "The node passes work_mem to tuplesort. Sorting can use memory or temporary files; the actual method and space use depend on the input and plan.", "/versions/19/sections/1/paragraphs/1": "Sorts tuples from the outer subtree of the node using tuplesort, which saves the results in a temporary file or memory. After the initial call, returns a tuple from the file with each call.", "/versions/19/sections/2/paragraphs/0": "The source callbacks below can coordinate execution or collect worker instrumentation. Their presence is not a blanket claim that this node supports a shared parallel scan or shared state.", "/versions/19/sections/2/paragraphs/1": "Callbacks in this build: ExecSortEstimate, ExecSortInitializeDSM, ExecSortInitializeWorker, ExecSortRetrieveInstrumentation.", "/versions/19/sections/3/paragraphs/0": "Estimated start-up cost. This is the time expended before the output phase can begin, e.g., time to do the sorting in a sort node.", "/versions/19/sections/3/paragraphs/1": "The planner may implement an ORDER BY clause in several ways. The above example shows that such an ordering clause may be implemented implicitly. The planner may also add an explicit Sort step:", "/versions/19/sections/3/paragraphs/2": "If a part of the plan guarantees an ordering on a prefix of the required sort keys, then the planner may instead decide to use an Incremental Sort step:", "/versions/19/sections/3/paragraphs/3": "Merge join requires its input data to be sorted on the join keys. In this example each input is sorted by using an index scan to visit the rows in the correct order; but a sequential scan and sort could also be used. (Sequential-scan-and-sort frequently beats an index scan for sorting many rows, because of the nonsequential disk access required by the index scan.)", "/versions/19/sections/3/paragraphs/4": "In some cases EXPLAIN ANALYZE shows additional execution statistics beyond the plan node execution times and row counts. For example, Sort and Hash nodes provide extra information:", "/versions/19/sections/3/paragraphs/5": "The Sort node shows the sort method used (in particular, whether the sort was in-memory or on-disk) and the amount of memory or disk space needed. The Hash node shows the number of hash buckets and batches as well as the peak amount of memory used for the hash table. (If the number of batches exceeds one, there will also be disk space usage involved, but that is not shown.)", "/versions/19/sections/5/paragraphs/0": "Sorts tuples from the outer subtree of the node using tuplesort, which saves the results in a temporary file or memory. After the initial call, returns a tuple from the file with each call.", "/versions/19/sections/5/paragraphs/1": "There are two distinct ways that this sort can be performed:", "/versions/19/sections/5/paragraphs/2": "1) When the result is a single column we perform a Datum sort.", "/versions/19/sections/5/paragraphs/3": "2) When the result contains multiple columns we perform a tuple sort.", "/versions/19/sections/5/paragraphs/4": "We could do this by always performing a tuple sort, however sorting Datums only can be significantly faster than sorting tuples, especially when the Datums are of a pass-by-value type.", "/versions/19/tables/0/columns/0/label": "Text-format label", "/versions/19/tables/0/columns/1/label": "Structured node identity", "/versions/19/sections/4/blocks/0/paragraphs/0": "Example copied from the PostgreSQL 19beta4 manual; it was not executed for this collection.", "/versions/19/sections/4/blocks/0/paragraphs/1": "The planner may implement an ORDER BY clause in several ways. The above example shows that such an ordering clause may be implemented implicitly. The planner may also add an explicit Sort step:", "/versions/19/sections/4/blocks/1/paragraphs/0": "Example copied from the PostgreSQL 19beta4 manual; it was not executed for this collection.", "/versions/19/sections/4/blocks/1/paragraphs/1": "If a part of the plan guarantees an ordering on a prefix of the required sort keys, then the planner may instead decide to use an Incremental Sort step:"}, "fallback_fields": [], "source_language": "en", "original_snapshot_sha256": "88d381c4672665020444daa5af6cc6a858cc712599d9318ad88b6e39bb90efbf"}, "evidence_kind": "source and documentation", "explain_names": ["Sort"], "partial_modes": [], "comparison_data": {"node_tag": "T_Sort", "strategies": [], "text_names": ["Sort"], "initializer": "ExecInitSort", "partial_modes": [], "memory_mechanism": "tuplesort", "parallel_callbacks": ["ExecSortEstimate", "ExecSortInitializeDSM", "ExecSortInitializeWorker", "ExecSortRetrieveInstrumentation"]}, "comparison_hash": "32a824f93669794b01449d5d8a08ff4edcb6024cb1a897131b35fe5cddc2e4da", "explain_prefixes": ["Parallel", "Async"], "runtime_verified": false, "source_inventory": {"explain": "src/backend/commands/explain.c", "executor": "src/backend/executor/execProcnode.c", "implementation": "src/backend/executor/nodeSort.c"}, "parallel_callbacks": ["ExecSortEstimate", "ExecSortInitializeDSM", "ExecSortInitializeWorker", "ExecSortRetrieveInstrumentation"]}, "20": {"facts": [{"label": "\u6838\u5fc3\u8282\u70b9\u6807\u7b7e", "value": "T_Sort"}, {"label": "\u7ed3\u6784\u5316 EXPLAIN \u8282\u70b9\u7c7b\u578b", "value": "Sort"}, {"label": "\u8f93\u5165", "value": "\u4e00\u4e2a\u5b50\u8ba1\u5212"}, {"label": "\u8f93\u51fa", "value": "\u5df2\u6392\u5e8f\u7684\u5143\u7ec4"}, {"label": "\u6267\u884c\u5668\u521d\u59cb\u5316\u51fd\u6570", "value": "ExecInitSort"}, {"label": "\u5185\u5b58\u673a\u5236", "value": "tuplesort"}], "memory": {"evidence": [{"url": "https://ftp.postgresql.org/pub/snapshot/dev/postgresql-snapshot.tar.bz2", "path": "src/backend/executor/nodeSort.c", "label": "src/backend/executor/nodeSort.c", "sha256": "6ba1b4ff7a3f2e208c8f3b784bff61e182e47a44bd22a88744998b9850c112db", "archive_sha256": "4d3346909b201ac1648232cf290462a7070c119326f56196f1f0253ed80fae41"}, {"url": "https://ftp.postgresql.org/pub/snapshot/dev/postgresql-snapshot.tar.bz2", "path": "src/backend/utils/sort/tuplesort.c", "label": "src/backend/utils/sort/tuplesort.c", "sha256": "dc140a5018871fe263b585f4e8a7c9ab364b7d9533a6188b4279ab9ce3135641", "archive_sha256": "4d3346909b201ac1648232cf290462a7070c119326f56196f1f0253ed80fae41"}], "mechanism": "tuplesort", "description": "\u6b64\u8282\u70b9\u5c06 work_mem \u4f20\u7ed9 tuplesort\u3002\u6392\u5e8f\u53ef\u4f7f\u7528\u5185\u5b58\u6216\u4e34\u65f6\u6587\u4ef6\uff1b\u5b9e\u9645\u65b9\u6cd5\u548c\u7a7a\u95f4\u7528\u91cf\u53d6\u51b3\u4e8e\u8f93\u5165\u53ca\u8ba1\u5212\u3002", "source_notes": ["Sorts tuples from the outer subtree of the node using tuplesort, which saves the results in a temporary file or memory. After the initial call, returns a tuple from the file with each call."]}, "tables": [{"key": "explain-labels", "rows": [{"label": "Sort", "identity": "Sort"}], "title": "\u672c\u6784\u5efa\u4e2d\u7684 EXPLAIN \u6807\u7b7e", "columns": [{"key": "label", "label": "\u6587\u672c\u683c\u5f0f\u6807\u7b7e"}, {"key": "identity", "label": "\u7ed3\u6784\u5316\u8282\u70b9\u6807\u8bc6"}]}], "related": [{"url": "/wiki/sql/explain/?v=20", "label": "EXPLAIN"}, {"url": "/docs/devel/using-explain.html", "label": "\u4f7f\u7528 EXPLAIN"}, {"url": "/docs/devel/parallel-plans.html", "label": "\u5e76\u884c\u8ba1\u5212"}, {"url": "/wiki/guc/enable_sort/?v=20", "label": "enable_sort"}, {"url": "/wiki/guc/work_mem/?v=20", "label": "work_mem"}], "release": {"ref": "PostgreSQL 20devel source archive", "label": "20devel", "major": "20", "channel": "devel", "revision": "4d3346909b201ac1648232cf290462a7070c119326f56196f1f0253ed80fae41", "source_url": "https://ftp.postgresql.org/pub/snapshot/dev/postgresql-snapshot.tar.bz2", "source_snapshot_utc": "26-Sep-2026 20:22"}, "sources": [{"url": "https://ftp.postgresql.org/pub/snapshot/dev/postgresql-snapshot.tar.bz2", "line": 1534, "path": "src/backend/commands/explain.c", "label": "src/backend/commands/explain.c:1534", "sha256": "13402758013520451539427b5993db06d463ca11c4e2d4cc5444e82367688077", "archive_sha256": "4d3346909b201ac1648232cf290462a7070c119326f56196f1f0253ed80fae41"}, {"url": "https://ftp.postgresql.org/pub/snapshot/dev/postgresql-snapshot.tar.bz2", "line": 320, "path": "src/backend/executor/execProcnode.c", "label": "src/backend/executor/execProcnode.c:320", "sha256": "5e39b2037bed672da55104229ecc32da5abde44c26bcad01479edcfa044d09ed", "archive_sha256": "4d3346909b201ac1648232cf290462a7070c119326f56196f1f0253ed80fae41"}, {"url": "https://ftp.postgresql.org/pub/snapshot/dev/postgresql-snapshot.tar.bz2", "path": "src/backend/executor/nodeSort.c", "label": "src/backend/executor/nodeSort.c", "sha256": "6ba1b4ff7a3f2e208c8f3b784bff61e182e47a44bd22a88744998b9850c112db", "archive_sha256": "4d3346909b201ac1648232cf290462a7070c119326f56196f1f0253ed80fae41"}, {"url": "https://ftp.postgresql.org/pub/snapshot/dev/postgresql-snapshot.tar.bz2", "path": "src/include/nodes/plannodes.h", "label": "src/include/nodes/plannodes.h", "sha256": "7a94ed1652f0d74d50c39971d1cd3e8051dbc0d6058f31b6de71a433ca343521", "archive_sha256": "4d3346909b201ac1648232cf290462a7070c119326f56196f1f0253ed80fae41"}, {"url": "https://ftp.postgresql.org/pub/snapshot/dev/postgresql-snapshot.tar.bz2", "path": "src/backend/utils/sort/tuplesort.c", "label": "src/backend/utils/sort/tuplesort.c", "sha256": "dc140a5018871fe263b585f4e8a7c9ab364b7d9533a6188b4279ab9ce3135641", "archive_sha256": "4d3346909b201ac1648232cf290462a7070c119326f56196f1f0253ed80fae41"}, {"url": "https://pg.center/docs/devel/using-explain.html#USING-EXPLAIN-BASICS", "path": "using-explain.html", "label": "PostgreSQL 20devel \u00b7 using-explain", "sha256": "99cfea3035876ea63f88b75ba8c964b51a32a70606544e09f769c0b60a234b31", "language": "en", "original_url": "/docs/devel/using-explain.html#USING-EXPLAIN-BASICS"}, {"url": "https://pg.center/docs/devel/using-explain.html#USING-EXPLAIN-ANALYZE", "path": "using-explain.html", "label": "PostgreSQL 20devel \u00b7 using-explain", "sha256": "99cfea3035876ea63f88b75ba8c964b51a32a70606544e09f769c0b60a234b31", "language": "en", "original_url": "/docs/devel/using-explain.html#USING-EXPLAIN-ANALYZE"}], "node_tag": "T_Sort", "sections": [{"title": "EXPLAIN \u540d\u79f0\u4e0e\u5c5e\u6027", "paragraphs": ["\u7ed3\u6784\u5316\u683c\u5f0f\u4f7f\u7528\u4e0a\u8ff0 Node Type\u3002\u6587\u672c\u683c\u5f0f\u540d\u79f0\u8fd8\u53ef\u80fd\u5305\u542b\u64cd\u4f5c\u3001\u7b56\u7565\u3001\u8fde\u63a5\u7c7b\u578b\u3001\u626b\u63cf\u65b9\u5411\u6216\u805a\u5408\u9636\u6bb5\u5c5e\u6027\u3002", "\u6b64\u6e90\u7801\u8bb0\u5f55\u7684\u6587\u672c\u540d\u79f0\uff1aSort.", "\u5e76\u884c\u611f\u77e5\u4e0e\u5e76\u884c\u5b89\u5168\u662f\u4e0d\u540c\u7684\u8ba1\u5212\u5c5e\u6027\u3002\u5728\u5e76\u884c\u5de5\u4f5c\u8fdb\u7a0b\u5185\u8fd0\u884c\u7684\u8282\u70b9\u4e0d\u4e00\u5b9a\u662f\u5e76\u884c\u611f\u77e5\u8282\u70b9\u3002"]}, {"title": "\u5185\u5b58\u4e0e\u4e34\u65f6\u5b58\u50a8", "paragraphs": ["\u6b64\u8282\u70b9\u5c06 work_mem \u4f20\u7ed9 tuplesort\u3002\u6392\u5e8f\u53ef\u4f7f\u7528\u5185\u5b58\u6216\u4e34\u65f6\u6587\u4ef6\uff1b\u5b9e\u9645\u65b9\u6cd5\u548c\u7a7a\u95f4\u7528\u91cf\u53d6\u51b3\u4e8e\u8f93\u5165\u53ca\u8ba1\u5212\u3002", "\u4f7f\u7528 tuplesort \u5bf9\u8282\u70b9\u5916\u4fa7\u5b50\u6811\u7684\u5143\u7ec4\u6392\u5e8f\uff0c\u5c06\u7ed3\u679c\u4fdd\u5b58\u5728\u4e34\u65f6\u6587\u4ef6\u6216\u5185\u5b58\u4e2d\u3002\u9996\u6b21\u8c03\u7528\u4e4b\u540e\uff0c\u6bcf\u6b21\u8c03\u7528\u90fd\u4ece\u6587\u4ef6\u8fd4\u56de\u4e00\u4e2a\u5143\u7ec4\u3002"]}, {"title": "\u5e76\u884c\u6267\u884c\u4e0e\u8fd0\u884c\u4fe1\u606f\u91c7\u96c6", "paragraphs": ["\u4ee5\u4e0b\u6e90\u7801\u56de\u8c03\u53ef\u4ee5\u534f\u8c03\u6267\u884c\u6216\u6536\u96c6\u5de5\u4f5c\u8fdb\u7a0b\u7684\u6d4b\u91cf\u6570\u636e\u3002\u56de\u8c03\u5b58\u5728\u4e0d\u4ee3\u8868\u8be5\u8282\u70b9\u666e\u904d\u652f\u6301\u5171\u4eab\u5e76\u884c\u626b\u63cf\u6216\u5171\u4eab\u72b6\u6001\u3002", "\u6b64\u6784\u5efa\u7684\u56de\u8c03\uff1aExecSortEstimate, ExecSortInitializeDSM, ExecSortInitializeWorker, ExecSortRetrieveInstrumentation."]}, {"title": "\u540c\u7248\u672c\u624b\u518c\u8bf4\u660e", "paragraphs": ["\u4f30\u8ba1\u542f\u52a8\u4ee3\u4ef7\uff1a\u8f93\u51fa\u9636\u6bb5\u5f00\u59cb\u4e4b\u524d\u6d88\u8017\u7684\u65f6\u95f4\uff0c\u4f8b\u5982\u6392\u5e8f\u8282\u70b9\u6267\u884c\u6392\u5e8f\u6240\u9700\u7684\u65f6\u95f4\u3002", "\u89c4\u5212\u5668\u53ef\u4ee5\u7528\u591a\u79cd\u65b9\u5f0f\u5b9e\u73b0 ORDER BY \u5b50\u53e5\u3002\u4e0a\u9762\u7684\u793a\u4f8b\u8868\u660e\uff0c\u8fd9\u79cd\u6392\u5e8f\u5b50\u53e5\u53ef\u4ee5\u88ab\u9690\u5f0f\u6ee1\u8db3\u3002\u89c4\u5212\u5668\u4e5f\u53ef\u80fd\u663e\u5f0f\u589e\u52a0\u4e00\u4e2a Sort \u6b65\u9aa4\uff1a", "\u5982\u679c\u8ba1\u5212\u4e2d\u7684\u67d0\u4e00\u90e8\u5206\u5df2\u7ecf\u4fdd\u8bc1\u4e86\u6240\u9700\u6392\u5e8f\u952e\u524d\u7f00\u7684\u987a\u5e8f\uff0c\u89c4\u5212\u5668\u4e5f\u53ef\u80fd\u6539\u7528 Incremental Sort \u6b65\u9aa4\uff1a", "\u5f52\u5e76\u8fde\u63a5\u8981\u6c42\u8f93\u5165\u6570\u636e\u6309\u8fde\u63a5\u952e\u6392\u5e8f\u3002\u5728\u8fd9\u4e2a\u4f8b\u5b50\u4e2d\uff0c\u4e24\u4e2a\u8f93\u5165\u90fd\u901a\u8fc7\u7d22\u5f15\u626b\u63cf\u6309\u6b63\u786e\u987a\u5e8f\u8bbf\u95ee\u884c\u800c\u5b8c\u6210\u6392\u5e8f\uff1b\u4e0d\u8fc7\u4e5f\u53ef\u4ee5\u91c7\u7528\u987a\u5e8f\u626b\u63cf\u518d\u6392\u5e8f\u7684\u65b9\u5f0f\u3002\uff08\u5bf9\u4e8e\u9700\u8981\u6392\u5e8f\u5f88\u591a\u884c\u7684\u60c5\u51b5\uff0c\u987a\u5e8f\u626b\u63cf\u52a0\u6392\u5e8f\u5f80\u5f80\u4f1a\u80dc\u8fc7\u7d22\u5f15\u626b\u63cf\uff0c\u56e0\u4e3a\u7d22\u5f15\u626b\u63cf\u9700\u8981\u975e\u987a\u5e8f\u78c1\u76d8\u8bbf\u95ee\u3002\uff09", "\u5728\u67d0\u4e9b\u60c5\u51b5\u4e0b\uff0cEXPLAIN ANALYZE \u9664\u4e86\u8ba1\u5212\u8282\u70b9\u7684\u6267\u884c\u65f6\u95f4\u548c\u884c\u6570\u4e4b\u5916\uff0c\u8fd8\u4f1a\u663e\u793a\u989d\u5916\u7684\u6267\u884c\u7edf\u8ba1\u4fe1\u606f\u3002\u4f8b\u5982\uff0cSort \u548c Hash \u8282\u70b9\u4f1a\u63d0\u4f9b\u66f4\u591a\u4fe1\u606f\uff1a", "Sort \u8282\u70b9\u663e\u793a\u6392\u5e8f\u65b9\u6cd5\uff08\u5c24\u5176\u662f\u5185\u5b58\u6392\u5e8f\u8fd8\u662f\u78c1\u76d8\u6392\u5e8f\uff09\u53ca\u6240\u9700\u5185\u5b58\u6216\u78c1\u76d8\u7a7a\u95f4\u3002Hash \u8282\u70b9\u663e\u793a\u54c8\u5e0c\u6876\u6570\u3001\u6279\u6b21\u6570\u53ca\u54c8\u5e0c\u8868\u5185\u5b58\u4f7f\u7528\u5cf0\u503c\u3002\uff08\u6279\u6b21\u6570\u8d85\u8fc7\u4e00\u65f6\u4e5f\u4f1a\u4f7f\u7528\u78c1\u76d8\u7a7a\u95f4\uff0c\u4f46\u6b64\u5904\u4e0d\u663e\u793a\u3002\uff09"]}, {"title": "\u672c\u7248\u624b\u518c\u4e2d\u7684\u793a\u4f8b", "blocks": [{"code": "EXPLAIN SELECT * FROM tenk1 ORDER BY unique1;\n\n                            QUERY PLAN\n-------------------------------------------------------------------\n Sort  (cost=1109.39..1134.39 rows=10000 width=244)\n   Sort Key: unique1\n   ->  Seq Scan on tenk1  (cost=0.00..445.00 rows=10000 width=244)", "source": {"url": "/docs/devel/using-explain.html#USING-EXPLAIN-BASICS", "path": "using-explain.html", "label": "PostgreSQL 20devel \u00b7 using-explain", "sha256": "99cfea3035876ea63f88b75ba8c964b51a32a70606544e09f769c0b60a234b31"}, "paragraphs": ["\u793a\u4f8b\u6458\u81ea PostgreSQL 20devel \u624b\u518c\uff1b\u672c\u767e\u79d1\u672a\u5b9e\u9645\u6267\u884c\u6b64\u793a\u4f8b\u3002", "\u89c4\u5212\u5668\u53ef\u4ee5\u7528\u591a\u79cd\u65b9\u5f0f\u5b9e\u73b0 ORDER BY \u5b50\u53e5\u3002\u4e0a\u9762\u7684\u793a\u4f8b\u8868\u660e\uff0c\u8fd9\u79cd\u6392\u5e8f\u5b50\u53e5\u53ef\u4ee5\u88ab\u9690\u5f0f\u6ee1\u8db3\u3002\u89c4\u5212\u5668\u4e5f\u53ef\u80fd\u663e\u5f0f\u589e\u52a0\u4e00\u4e2a Sort \u6b65\u9aa4\uff1a"]}, {"code": "EXPLAIN SELECT * FROM tenk1 ORDER BY hundred, ten LIMIT 100;\n\n                                              QUERY PLAN\n------------------------------------------------------------------------------------------------\n Limit  (cost=19.35..39.49 rows=100 width=244)\n   ->  Incremental Sort  (cost=19.35..2033.39 rows=10000 width=244)\n         Sort Key: hundred, ten\n         Presorted Key: hundred\n         Estimated Groups: 100\n         ->  Index Scan using tenk1_hundred on tenk1  (cost=0.29..1574.20 rows=10000 width=244)", "source": {"url": "/docs/devel/using-explain.html#USING-EXPLAIN-BASICS", "path": "using-explain.html", "label": "PostgreSQL 20devel \u00b7 using-explain", "sha256": "99cfea3035876ea63f88b75ba8c964b51a32a70606544e09f769c0b60a234b31"}, "paragraphs": ["\u793a\u4f8b\u6458\u81ea PostgreSQL 20devel \u624b\u518c\uff1b\u672c\u767e\u79d1\u672a\u5b9e\u9645\u6267\u884c\u6b64\u793a\u4f8b\u3002", "\u5982\u679c\u8ba1\u5212\u4e2d\u7684\u67d0\u4e00\u90e8\u5206\u5df2\u7ecf\u4fdd\u8bc1\u4e86\u6240\u9700\u6392\u5e8f\u952e\u524d\u7f00\u7684\u987a\u5e8f\uff0c\u89c4\u5212\u5668\u4e5f\u53ef\u80fd\u6539\u7528 Incremental Sort \u6b65\u9aa4\uff1a"]}]}, {"title": "\u6267\u884c\u5668\u5b9e\u73b0\u8bf4\u660e", "paragraphs": ["\u4f7f\u7528 tuplesort \u5bf9\u8282\u70b9\u5916\u4fa7\u5b50\u6811\u7684\u5143\u7ec4\u6392\u5e8f\uff0c\u5c06\u7ed3\u679c\u4fdd\u5b58\u5728\u4e34\u65f6\u6587\u4ef6\u6216\u5185\u5b58\u4e2d\u3002\u9996\u6b21\u8c03\u7528\u4e4b\u540e\uff0c\u6bcf\u6b21\u8c03\u7528\u90fd\u4ece\u6587\u4ef6\u8fd4\u56de\u4e00\u4e2a\u5143\u7ec4\u3002", "\u6b64\u6392\u5e8f\u53ef\u7528\u4e24\u79cd\u4e0d\u540c\u65b9\u5f0f\u6267\u884c\uff1a", "1\uff09\u7ed3\u679c\u53ea\u6709\u4e00\u5217\u65f6\uff0c\u6267\u884c Datum \u6392\u5e8f\u3002", "2\uff09\u7ed3\u679c\u5305\u542b\u591a\u5217\u65f6\uff0c\u6267\u884c\u5143\u7ec4\u6392\u5e8f\u3002", "\u4e5f\u53ef\u4ee5\u59cb\u7ec8\u6267\u884c\u5143\u7ec4\u6392\u5e8f\uff0c\u4f46\u4ec5\u5bf9 Datum \u6392\u5e8f\u53ef\u80fd\u663e\u8457\u66f4\u5feb\uff0c\u5c24\u5176\u5f53 Datum \u5c5e\u4e8e\u6309\u503c\u4f20\u9012\u7684\u7c7b\u578b\u65f6\u3002"]}, {"code": "case T_Sort:\n\t\t\tpname = sname = \"Sort\";\n\t\t\tbreak;", "title": "\u6838\u5fc3\u6e90\u7801\u4e2d\u7684 EXPLAIN \u6807\u8bc6"}], "strategies": [], "description": ["\u6309\u8ba1\u5212\u6392\u5e8f\u952e\u5bf9\u5b50\u8ba1\u5212\u8f93\u51fa\u7684\u884c\u6392\u5e8f\u3002"], "localization": {"status": "complete", "sources": [{"url": "/docs/devel/using-explain.html", "method": "same-major semantic node", "sha256": "2744ee0e88d132c504bf5e102765edaabd393eb12c59294093db6d90b26dd65c", "language": "zh", "matched_nodes": ["#USING-EXPLAIN/div[7]/p[27]", "#USING-EXPLAIN/div[7]/p[29]", "#USING-EXPLAIN/div[7]/p[51]"]}], "language": "zh", "original_text": {"/summary": "Sorts rows from its child according to the plan sort keys.", "/category": "Ordering", "/versions/20/description/0": "Sorts rows from its child according to the plan sort keys.", "/versions/20/facts/0/label": "Core node tag", "/versions/20/facts/1/label": "Structured EXPLAIN Node Type", "/versions/20/facts/2/label": "Inputs", "/versions/20/facts/2/value": "One child plan", "/versions/20/facts/3/label": "Output", "/versions/20/facts/3/value": "Sorted tuples", "/versions/20/facts/4/label": "Executor initializer", "/versions/20/facts/5/label": "Memory mechanism", "/versions/20/tables/0/title": "EXPLAIN labels in this source build", "/versions/20/related/1/label": "Using EXPLAIN", "/versions/20/related/2/label": "Parallel plans", "/versions/20/sections/0/title": "EXPLAIN names and attributes", "/versions/20/sections/1/title": "Memory and temporary storage", "/versions/20/sections/2/title": "Parallel execution and instrumentation", "/versions/20/sections/3/title": "Same-version manual discussion", "/versions/20/sections/4/title": "Examples from this manual build", "/versions/20/sections/5/title": "Executor implementation notes", "/versions/20/sections/6/title": "EXPLAIN identity in core source", "/versions/20/memory/description": "The node passes work_mem to tuplesort. Sorting can use memory or temporary files; the actual method and space use depend on the input and plan.", "/versions/20/sections/0/paragraphs/0": "Structured formats use the Node Type above. Text-format spellings can also include operation, strategy, join type, scan direction or aggregation-stage attributes.", "/versions/20/sections/0/paragraphs/1": "Text names recorded by this source: Sort.", "/versions/20/sections/0/paragraphs/2": "Parallel-aware and parallel-safe are different plan properties. A node running inside a parallel worker is not necessarily a parallel-aware node.", "/versions/20/sections/1/paragraphs/0": "The node passes work_mem to tuplesort. Sorting can use memory or temporary files; the actual method and space use depend on the input and plan.", "/versions/20/sections/1/paragraphs/1": "Sorts tuples from the outer subtree of the node using tuplesort, which saves the results in a temporary file or memory. After the initial call, returns a tuple from the file with each call.", "/versions/20/sections/2/paragraphs/0": "The source callbacks below can coordinate execution or collect worker instrumentation. Their presence is not a blanket claim that this node supports a shared parallel scan or shared state.", "/versions/20/sections/2/paragraphs/1": "Callbacks in this build: ExecSortEstimate, ExecSortInitializeDSM, ExecSortInitializeWorker, ExecSortRetrieveInstrumentation.", "/versions/20/sections/3/paragraphs/0": "Estimated start-up cost. This is the time expended before the output phase can begin, e.g., time to do the sorting in a sort node.", "/versions/20/sections/3/paragraphs/1": "The planner may implement an ORDER BY clause in several ways. The above example shows that such an ordering clause may be implemented implicitly. The planner may also add an explicit Sort step:", "/versions/20/sections/3/paragraphs/2": "If a part of the plan guarantees an ordering on a prefix of the required sort keys, then the planner may instead decide to use an Incremental Sort step:", "/versions/20/sections/3/paragraphs/3": "Merge join requires its input data to be sorted on the join keys. In this example each input is sorted by using an index scan to visit the rows in the correct order; but a sequential scan and sort could also be used. (Sequential-scan-and-sort frequently beats an index scan for sorting many rows, because of the nonsequential disk access required by the index scan.)", "/versions/20/sections/3/paragraphs/4": "In some cases EXPLAIN ANALYZE shows additional execution statistics beyond the plan node execution times and row counts. For example, Sort and Hash nodes provide extra information:", "/versions/20/sections/3/paragraphs/5": "The Sort node shows the sort method used (in particular, whether the sort was in-memory or on-disk) and the amount of memory or disk space needed. The Hash node shows the number of hash buckets and batches as well as the peak amount of memory used for the hash table. (If the number of batches exceeds one, there will also be disk space usage involved, but that is not shown.)", "/versions/20/sections/5/paragraphs/0": "Sorts tuples from the outer subtree of the node using tuplesort, which saves the results in a temporary file or memory. After the initial call, returns a tuple from the file with each call.", "/versions/20/sections/5/paragraphs/1": "There are two distinct ways that this sort can be performed:", "/versions/20/sections/5/paragraphs/2": "1) When the result is a single column we perform a Datum sort.", "/versions/20/sections/5/paragraphs/3": "2) When the result contains multiple columns we perform a tuple sort.", "/versions/20/sections/5/paragraphs/4": "We could do this by always performing a tuple sort, however sorting Datums only can be significantly faster than sorting tuples, especially when the Datums are of a pass-by-value type.", "/versions/20/tables/0/columns/0/label": "Text-format label", "/versions/20/tables/0/columns/1/label": "Structured node identity", "/versions/20/sections/4/blocks/0/paragraphs/0": "Example copied from the PostgreSQL 20devel manual; it was not executed for this collection.", "/versions/20/sections/4/blocks/0/paragraphs/1": "The planner may implement an ORDER BY clause in several ways. The above example shows that such an ordering clause may be implemented implicitly. The planner may also add an explicit Sort step:", "/versions/20/sections/4/blocks/1/paragraphs/0": "Example copied from the PostgreSQL 20devel manual; it was not executed for this collection.", "/versions/20/sections/4/blocks/1/paragraphs/1": "If a part of the plan guarantees an ordering on a prefix of the required sort keys, then the planner may instead decide to use an Incremental Sort step:"}, "fallback_fields": [], "source_language": "en", "original_snapshot_sha256": "25268929802bf9fb34095afc98bcf9f4b42af693862e46c4fb8de5bd069f50be"}, "evidence_kind": "source and documentation", "explain_names": ["Sort"], "partial_modes": [], "comparison_data": {"node_tag": "T_Sort", "strategies": [], "text_names": ["Sort"], "initializer": "ExecInitSort", "partial_modes": [], "memory_mechanism": "tuplesort", "parallel_callbacks": ["ExecSortEstimate", "ExecSortInitializeDSM", "ExecSortInitializeWorker", "ExecSortRetrieveInstrumentation"]}, "comparison_hash": "32a824f93669794b01449d5d8a08ff4edcb6024cb1a897131b35fe5cddc2e4da", "explain_prefixes": ["Parallel", "Async"], "runtime_verified": false, "source_inventory": {"explain": "src/backend/commands/explain.c", "executor": "src/backend/executor/execProcnode.c", "implementation": "src/backend/executor/nodeSort.c"}, "parallel_callbacks": ["ExecSortEstimate", "ExecSortInitializeDSM", "ExecSortInitializeWorker", "ExecSortRetrieveInstrumentation"]}}}, "snapshot": {"facts": [{"label": "\u6838\u5fc3\u8282\u70b9\u6807\u7b7e", "value": "T_Sort"}, {"label": "\u7ed3\u6784\u5316 EXPLAIN \u8282\u70b9\u7c7b\u578b", "value": "Sort"}, {"label": "\u8f93\u5165", "value": "\u4e00\u4e2a\u5b50\u8ba1\u5212"}, {"label": "\u8f93\u51fa", "value": "\u5df2\u6392\u5e8f\u7684\u5143\u7ec4"}, {"label": "\u6267\u884c\u5668\u521d\u59cb\u5316\u51fd\u6570", "value": "ExecInitSort"}, {"label": "\u5185\u5b58\u673a\u5236", "value": "tuplesort"}], "memory": {"evidence": [{"url": "https://ftp.postgresql.org/pub/source/v18.6/postgresql-18.6.tar.bz2", "path": "src/backend/executor/nodeSort.c", "label": "src/backend/executor/nodeSort.c", "sha256": "47c6b983626e15e112f904040e96d43190ae4b3226e7cd2b27234dc95adf54a2", "archive_sha256": "555610c24d53e4316da5b7d3fc25c279d96856d5e0e23ee308c328c5fa881d9f"}, {"url": "https://ftp.postgresql.org/pub/source/v18.6/postgresql-18.6.tar.bz2", "path": "src/backend/utils/sort/tuplesort.c", "label": "src/backend/utils/sort/tuplesort.c", "sha256": "509d4cef598613bbf0725f697e1e1e33f3dfc8debed20169a6c4bf1ac9e5c2e3", "archive_sha256": "555610c24d53e4316da5b7d3fc25c279d96856d5e0e23ee308c328c5fa881d9f"}], "mechanism": "tuplesort", "description": "\u6b64\u8282\u70b9\u5c06 work_mem \u4f20\u7ed9 tuplesort\u3002\u6392\u5e8f\u53ef\u4f7f\u7528\u5185\u5b58\u6216\u4e34\u65f6\u6587\u4ef6\uff1b\u5b9e\u9645\u65b9\u6cd5\u548c\u7a7a\u95f4\u7528\u91cf\u53d6\u51b3\u4e8e\u8f93\u5165\u53ca\u8ba1\u5212\u3002", "source_notes": ["Sorts tuples from the outer subtree of the node using tuplesort, which saves the results in a temporary file or memory. After the initial call, returns a tuple from the file with each call."]}, "tables": [{"key": "explain-labels", "rows": [{"label": "Sort", "identity": "Sort"}], "title": "\u672c\u6784\u5efa\u4e2d\u7684 EXPLAIN \u6807\u7b7e", "columns": [{"key": "label", "label": "\u6587\u672c\u683c\u5f0f\u6807\u7b7e"}, {"key": "identity", "label": "\u7ed3\u6784\u5316\u8282\u70b9\u6807\u8bc6"}]}], "related": [{"url": "/wiki/sql/explain/?v=18", "label": "EXPLAIN"}, {"url": "/docs/18/using-explain.html", "label": "\u4f7f\u7528 EXPLAIN"}, {"url": "/docs/18/parallel-plans.html", "label": "\u5e76\u884c\u8ba1\u5212"}, {"url": "/wiki/guc/enable_sort/?v=18", "label": "enable_sort"}, {"url": "/wiki/guc/work_mem/?v=18", "label": "work_mem"}], "release": {"ref": "PostgreSQL 18.6 source archive", "label": "18.6", "major": "18", "channel": "stable", "revision": "555610c24d53e4316da5b7d3fc25c279d96856d5e0e23ee308c328c5fa881d9f", "source_url": "https://ftp.postgresql.org/pub/source/v18.6/postgresql-18.6.tar.bz2", "source_snapshot_utc": ""}, "sources": [{"url": "https://ftp.postgresql.org/pub/source/v18.6/postgresql-18.6.tar.bz2", "line": 1522, "path": "src/backend/commands/explain.c", "label": "src/backend/commands/explain.c:1522", "sha256": "34c86d6070224a0e981efef51f79101d6d505e5874f1684ace183034bab14bb4", "archive_sha256": "555610c24d53e4316da5b7d3fc25c279d96856d5e0e23ee308c328c5fa881d9f"}, {"url": "https://ftp.postgresql.org/pub/source/v18.6/postgresql-18.6.tar.bz2", "line": 320, "path": "src/backend/executor/execProcnode.c", "label": "src/backend/executor/execProcnode.c:320", "sha256": "f8a06a3f539077249b20664b2812433db6d7bd12b2c0ca633525db43d06f112a", "archive_sha256": "555610c24d53e4316da5b7d3fc25c279d96856d5e0e23ee308c328c5fa881d9f"}, {"url": "https://ftp.postgresql.org/pub/source/v18.6/postgresql-18.6.tar.bz2", "path": "src/backend/executor/nodeSort.c", "label": "src/backend/executor/nodeSort.c", "sha256": "47c6b983626e15e112f904040e96d43190ae4b3226e7cd2b27234dc95adf54a2", "archive_sha256": "555610c24d53e4316da5b7d3fc25c279d96856d5e0e23ee308c328c5fa881d9f"}, {"url": "https://ftp.postgresql.org/pub/source/v18.6/postgresql-18.6.tar.bz2", "path": "src/include/nodes/plannodes.h", "label": "src/include/nodes/plannodes.h", "sha256": "52422b327a8049fbbb20d8b96008a0fc0a6fafa60f7eff3c695d5b2e83830120", "archive_sha256": "555610c24d53e4316da5b7d3fc25c279d96856d5e0e23ee308c328c5fa881d9f"}, {"url": "https://ftp.postgresql.org/pub/source/v18.6/postgresql-18.6.tar.bz2", "path": "src/backend/utils/sort/tuplesort.c", "label": "src/backend/utils/sort/tuplesort.c", "sha256": "509d4cef598613bbf0725f697e1e1e33f3dfc8debed20169a6c4bf1ac9e5c2e3", "archive_sha256": "555610c24d53e4316da5b7d3fc25c279d96856d5e0e23ee308c328c5fa881d9f"}, {"url": "https://pg.center/docs/18/using-explain.html#USING-EXPLAIN-BASICS", "path": "using-explain.html", "label": "PostgreSQL 18.6 \u00b7 using-explain", "sha256": "60040c30180093418a0affe56dd27dff9df2504b705b38039589e458bf5c31ed", "language": "en", "original_url": "/docs/18/using-explain.html#USING-EXPLAIN-BASICS"}, {"url": "https://pg.center/docs/18/using-explain.html#USING-EXPLAIN-ANALYZE", "path": "using-explain.html", "label": "PostgreSQL 18.6 \u00b7 using-explain", "sha256": "60040c30180093418a0affe56dd27dff9df2504b705b38039589e458bf5c31ed", "language": "en", "original_url": "/docs/18/using-explain.html#USING-EXPLAIN-ANALYZE"}], "node_tag": "T_Sort", "sections": [{"title": "EXPLAIN \u540d\u79f0\u4e0e\u5c5e\u6027", "paragraphs": ["\u7ed3\u6784\u5316\u683c\u5f0f\u4f7f\u7528\u4e0a\u8ff0 Node Type\u3002\u6587\u672c\u683c\u5f0f\u540d\u79f0\u8fd8\u53ef\u80fd\u5305\u542b\u64cd\u4f5c\u3001\u7b56\u7565\u3001\u8fde\u63a5\u7c7b\u578b\u3001\u626b\u63cf\u65b9\u5411\u6216\u805a\u5408\u9636\u6bb5\u5c5e\u6027\u3002", "\u6b64\u6e90\u7801\u8bb0\u5f55\u7684\u6587\u672c\u540d\u79f0\uff1aSort.", "\u5e76\u884c\u611f\u77e5\u4e0e\u5e76\u884c\u5b89\u5168\u662f\u4e0d\u540c\u7684\u8ba1\u5212\u5c5e\u6027\u3002\u5728\u5e76\u884c\u5de5\u4f5c\u8fdb\u7a0b\u5185\u8fd0\u884c\u7684\u8282\u70b9\u4e0d\u4e00\u5b9a\u662f\u5e76\u884c\u611f\u77e5\u8282\u70b9\u3002"]}, {"title": "\u5185\u5b58\u4e0e\u4e34\u65f6\u5b58\u50a8", "paragraphs": ["\u6b64\u8282\u70b9\u5c06 work_mem \u4f20\u7ed9 tuplesort\u3002\u6392\u5e8f\u53ef\u4f7f\u7528\u5185\u5b58\u6216\u4e34\u65f6\u6587\u4ef6\uff1b\u5b9e\u9645\u65b9\u6cd5\u548c\u7a7a\u95f4\u7528\u91cf\u53d6\u51b3\u4e8e\u8f93\u5165\u53ca\u8ba1\u5212\u3002", "\u4f7f\u7528 tuplesort \u5bf9\u8282\u70b9\u5916\u4fa7\u5b50\u6811\u7684\u5143\u7ec4\u6392\u5e8f\uff0c\u5c06\u7ed3\u679c\u4fdd\u5b58\u5728\u4e34\u65f6\u6587\u4ef6\u6216\u5185\u5b58\u4e2d\u3002\u9996\u6b21\u8c03\u7528\u4e4b\u540e\uff0c\u6bcf\u6b21\u8c03\u7528\u90fd\u4ece\u6587\u4ef6\u8fd4\u56de\u4e00\u4e2a\u5143\u7ec4\u3002"]}, {"title": "\u5e76\u884c\u6267\u884c\u4e0e\u8fd0\u884c\u4fe1\u606f\u91c7\u96c6", "paragraphs": ["\u4ee5\u4e0b\u6e90\u7801\u56de\u8c03\u53ef\u4ee5\u534f\u8c03\u6267\u884c\u6216\u6536\u96c6\u5de5\u4f5c\u8fdb\u7a0b\u7684\u6d4b\u91cf\u6570\u636e\u3002\u56de\u8c03\u5b58\u5728\u4e0d\u4ee3\u8868\u8be5\u8282\u70b9\u666e\u904d\u652f\u6301\u5171\u4eab\u5e76\u884c\u626b\u63cf\u6216\u5171\u4eab\u72b6\u6001\u3002", "\u6b64\u6784\u5efa\u7684\u56de\u8c03\uff1aExecSortEstimate, ExecSortInitializeDSM, ExecSortInitializeWorker, ExecSortRetrieveInstrumentation."]}, {"title": "\u540c\u7248\u672c\u624b\u518c\u8bf4\u660e", "paragraphs": ["\u4f30\u8ba1\u542f\u52a8\u4ee3\u4ef7\uff1a\u8f93\u51fa\u9636\u6bb5\u5f00\u59cb\u4e4b\u524d\u6d88\u8017\u7684\u65f6\u95f4\uff0c\u4f8b\u5982\u6392\u5e8f\u8282\u70b9\u6267\u884c\u6392\u5e8f\u6240\u9700\u7684\u65f6\u95f4\u3002", "\u89c4\u5212\u5668\u53ef\u4ee5\u7528\u591a\u79cd\u65b9\u5f0f\u5b9e\u73b0 ORDER BY \u5b50\u53e5\u3002\u4e0a\u9762\u7684\u793a\u4f8b\u8868\u660e\uff0c\u8fd9\u79cd\u6392\u5e8f\u5b50\u53e5\u53ef\u4ee5\u88ab\u9690\u5f0f\u6ee1\u8db3\u3002\u89c4\u5212\u5668\u4e5f\u53ef\u80fd\u663e\u5f0f\u589e\u52a0\u4e00\u4e2a Sort \u6b65\u9aa4\uff1a", "\u5982\u679c\u8ba1\u5212\u4e2d\u7684\u67d0\u4e00\u90e8\u5206\u5df2\u7ecf\u4fdd\u8bc1\u4e86\u6240\u9700\u6392\u5e8f\u952e\u524d\u7f00\u7684\u987a\u5e8f\uff0c\u89c4\u5212\u5668\u4e5f\u53ef\u80fd\u6539\u7528 Incremental Sort \u6b65\u9aa4\uff1a", "\u5f52\u5e76\u8fde\u63a5\u8981\u6c42\u8f93\u5165\u6570\u636e\u6309\u8fde\u63a5\u952e\u6392\u5e8f\u3002\u5728\u8fd9\u4e2a\u4f8b\u5b50\u4e2d\uff0c\u4e24\u4e2a\u8f93\u5165\u90fd\u901a\u8fc7\u7d22\u5f15\u626b\u63cf\u6309\u6b63\u786e\u987a\u5e8f\u8bbf\u95ee\u884c\u800c\u5b8c\u6210\u6392\u5e8f\uff1b\u4e0d\u8fc7\u4e5f\u53ef\u4ee5\u91c7\u7528\u987a\u5e8f\u626b\u63cf\u518d\u6392\u5e8f\u7684\u65b9\u5f0f\u3002\uff08\u5bf9\u4e8e\u9700\u8981\u6392\u5e8f\u5f88\u591a\u884c\u7684\u60c5\u51b5\uff0c\u987a\u5e8f\u626b\u63cf\u52a0\u6392\u5e8f\u5f80\u5f80\u4f1a\u80dc\u8fc7\u7d22\u5f15\u626b\u63cf\uff0c\u56e0\u4e3a\u7d22\u5f15\u626b\u63cf\u9700\u8981\u975e\u987a\u5e8f\u78c1\u76d8\u8bbf\u95ee\u3002\uff09", "\u5728\u67d0\u4e9b\u60c5\u51b5\u4e0b\uff0cEXPLAIN ANALYZE \u9664\u4e86\u8ba1\u5212\u8282\u70b9\u7684\u6267\u884c\u65f6\u95f4\u548c\u884c\u6570\u4e4b\u5916\uff0c\u8fd8\u4f1a\u663e\u793a\u989d\u5916\u7684\u6267\u884c\u7edf\u8ba1\u4fe1\u606f\u3002\u4f8b\u5982\uff0cSort \u548c Hash \u8282\u70b9\u4f1a\u63d0\u4f9b\u66f4\u591a\u4fe1\u606f\uff1a", "Sort \u8282\u70b9\u663e\u793a\u6392\u5e8f\u65b9\u6cd5\uff08\u5c24\u5176\u662f\u5185\u5b58\u6392\u5e8f\u8fd8\u662f\u78c1\u76d8\u6392\u5e8f\uff09\u53ca\u6240\u9700\u5185\u5b58\u6216\u78c1\u76d8\u7a7a\u95f4\u3002Hash \u8282\u70b9\u663e\u793a\u54c8\u5e0c\u6876\u6570\u3001\u6279\u6b21\u6570\u53ca\u54c8\u5e0c\u8868\u5185\u5b58\u4f7f\u7528\u5cf0\u503c\u3002\uff08\u6279\u6b21\u6570\u8d85\u8fc7\u4e00\u65f6\u4e5f\u4f1a\u4f7f\u7528\u78c1\u76d8\u7a7a\u95f4\uff0c\u4f46\u6b64\u5904\u4e0d\u663e\u793a\u3002\uff09"]}, {"title": "\u672c\u7248\u624b\u518c\u4e2d\u7684\u793a\u4f8b", "blocks": [{"code": "EXPLAIN SELECT * FROM tenk1 ORDER BY unique1;\n\n                            QUERY PLAN\n-------------------------------------------------------------------\n Sort  (cost=1109.39..1134.39 rows=10000 width=244)\n   Sort Key: unique1\n   ->  Seq Scan on tenk1  (cost=0.00..445.00 rows=10000 width=244)", "source": {"url": "/docs/18/using-explain.html#USING-EXPLAIN-BASICS", "path": "using-explain.html", "label": "PostgreSQL 18.6 \u00b7 using-explain", "sha256": "60040c30180093418a0affe56dd27dff9df2504b705b38039589e458bf5c31ed"}, "paragraphs": ["\u793a\u4f8b\u6458\u81ea PostgreSQL 18.6 \u624b\u518c\uff1b\u672c\u767e\u79d1\u672a\u5b9e\u9645\u6267\u884c\u6b64\u793a\u4f8b\u3002", "\u89c4\u5212\u5668\u53ef\u4ee5\u7528\u591a\u79cd\u65b9\u5f0f\u5b9e\u73b0 ORDER BY \u5b50\u53e5\u3002\u4e0a\u9762\u7684\u793a\u4f8b\u8868\u660e\uff0c\u8fd9\u79cd\u6392\u5e8f\u5b50\u53e5\u53ef\u4ee5\u88ab\u9690\u5f0f\u6ee1\u8db3\u3002\u89c4\u5212\u5668\u4e5f\u53ef\u80fd\u663e\u5f0f\u589e\u52a0\u4e00\u4e2a Sort \u6b65\u9aa4\uff1a"]}, {"code": "EXPLAIN SELECT * FROM tenk1 ORDER BY hundred, ten LIMIT 100;\n\n                                              QUERY PLAN\n------------------------------------------------------------------------------------------------\n Limit  (cost=19.35..39.49 rows=100 width=244)\n   ->  Incremental Sort  (cost=19.35..2033.39 rows=10000 width=244)\n         Sort Key: hundred, ten\n         Presorted Key: hundred\n         ->  Index Scan using tenk1_hundred on tenk1  (cost=0.29..1574.20 rows=10000 width=244)", "source": {"url": "/docs/18/using-explain.html#USING-EXPLAIN-BASICS", "path": "using-explain.html", "label": "PostgreSQL 18.6 \u00b7 using-explain", "sha256": "60040c30180093418a0affe56dd27dff9df2504b705b38039589e458bf5c31ed"}, "paragraphs": ["\u793a\u4f8b\u6458\u81ea PostgreSQL 18.6 \u624b\u518c\uff1b\u672c\u767e\u79d1\u672a\u5b9e\u9645\u6267\u884c\u6b64\u793a\u4f8b\u3002", "\u5982\u679c\u8ba1\u5212\u4e2d\u7684\u67d0\u4e00\u90e8\u5206\u5df2\u7ecf\u4fdd\u8bc1\u4e86\u6240\u9700\u6392\u5e8f\u952e\u524d\u7f00\u7684\u987a\u5e8f\uff0c\u89c4\u5212\u5668\u4e5f\u53ef\u80fd\u6539\u7528 Incremental Sort \u6b65\u9aa4\uff1a"]}]}, {"title": "\u6267\u884c\u5668\u5b9e\u73b0\u8bf4\u660e", "paragraphs": ["\u4f7f\u7528 tuplesort \u5bf9\u8282\u70b9\u5916\u4fa7\u5b50\u6811\u7684\u5143\u7ec4\u6392\u5e8f\uff0c\u5c06\u7ed3\u679c\u4fdd\u5b58\u5728\u4e34\u65f6\u6587\u4ef6\u6216\u5185\u5b58\u4e2d\u3002\u9996\u6b21\u8c03\u7528\u4e4b\u540e\uff0c\u6bcf\u6b21\u8c03\u7528\u90fd\u4ece\u6587\u4ef6\u8fd4\u56de\u4e00\u4e2a\u5143\u7ec4\u3002", "\u6b64\u6392\u5e8f\u53ef\u7528\u4e24\u79cd\u4e0d\u540c\u65b9\u5f0f\u6267\u884c\uff1a", "1\uff09\u7ed3\u679c\u53ea\u6709\u4e00\u5217\u65f6\uff0c\u6267\u884c Datum \u6392\u5e8f\u3002", "2\uff09\u7ed3\u679c\u5305\u542b\u591a\u5217\u65f6\uff0c\u6267\u884c\u5143\u7ec4\u6392\u5e8f\u3002", "\u4e5f\u53ef\u4ee5\u59cb\u7ec8\u6267\u884c\u5143\u7ec4\u6392\u5e8f\uff0c\u4f46\u4ec5\u5bf9 Datum \u6392\u5e8f\u53ef\u80fd\u663e\u8457\u66f4\u5feb\uff0c\u5c24\u5176\u5f53 Datum \u5c5e\u4e8e\u6309\u503c\u4f20\u9012\u7684\u7c7b\u578b\u65f6\u3002"]}, {"code": "case T_Sort:\n\t\t\tpname = sname = \"Sort\";\n\t\t\tbreak;", "title": "\u6838\u5fc3\u6e90\u7801\u4e2d\u7684 EXPLAIN \u6807\u8bc6"}], "strategies": [], "description": ["\u6309\u8ba1\u5212\u6392\u5e8f\u952e\u5bf9\u5b50\u8ba1\u5212\u8f93\u51fa\u7684\u884c\u6392\u5e8f\u3002"], "localization": {"status": "complete", "sources": [{"url": "/docs/18/using-explain.html", "method": "same-major semantic node", "sha256": "b8835ec9adbc70ec150667a6b5443f8d298222dc0cc8c2bd1abb1c1d64895904", "language": "zh", "matched_nodes": ["#USING-EXPLAIN/div[7]/p[27]", "#USING-EXPLAIN/div[7]/p[29]", "#USING-EXPLAIN/div[7]/p[51]"]}], "language": "zh", "original_text": {"/versions/18/description/0": "Sorts rows from its child according to the plan sort keys.", "/versions/18/facts/0/label": "Core node tag", "/versions/18/facts/1/label": "Structured EXPLAIN Node Type", "/versions/18/facts/2/label": "Inputs", "/versions/18/facts/2/value": "One child plan", "/versions/18/facts/3/label": "Output", "/versions/18/facts/3/value": "Sorted tuples", "/versions/18/facts/4/label": "Executor initializer", "/versions/18/facts/5/label": "Memory mechanism", "/versions/18/tables/0/title": "EXPLAIN labels in this source build", "/versions/18/related/1/label": "Using EXPLAIN", "/versions/18/related/2/label": "Parallel plans", "/versions/18/sections/0/title": "EXPLAIN names and attributes", "/versions/18/sections/1/title": "Memory and temporary storage", "/versions/18/sections/2/title": "Parallel execution and instrumentation", "/versions/18/sections/3/title": "Same-version manual discussion", "/versions/18/sections/4/title": "Examples from this manual build", "/versions/18/sections/5/title": "Executor implementation notes", "/versions/18/sections/6/title": "EXPLAIN identity in core source", "/versions/18/memory/description": "The node passes work_mem to tuplesort. Sorting can use memory or temporary files; the actual method and space use depend on the input and plan.", "/versions/18/sections/0/paragraphs/0": "Structured formats use the Node Type above. Text-format spellings can also include operation, strategy, join type, scan direction or aggregation-stage attributes.", "/versions/18/sections/0/paragraphs/1": "Text names recorded by this source: Sort.", "/versions/18/sections/0/paragraphs/2": "Parallel-aware and parallel-safe are different plan properties. A node running inside a parallel worker is not necessarily a parallel-aware node.", "/versions/18/sections/1/paragraphs/0": "The node passes work_mem to tuplesort. Sorting can use memory or temporary files; the actual method and space use depend on the input and plan.", "/versions/18/sections/1/paragraphs/1": "Sorts tuples from the outer subtree of the node using tuplesort, which saves the results in a temporary file or memory. After the initial call, returns a tuple from the file with each call.", "/versions/18/sections/2/paragraphs/0": "The source callbacks below can coordinate execution or collect worker instrumentation. Their presence is not a blanket claim that this node supports a shared parallel scan or shared state.", "/versions/18/sections/2/paragraphs/1": "Callbacks in this build: ExecSortEstimate, ExecSortInitializeDSM, ExecSortInitializeWorker, ExecSortRetrieveInstrumentation.", "/versions/18/sections/3/paragraphs/0": "Estimated start-up cost. This is the time expended before the output phase can begin, e.g., time to do the sorting in a sort node.", "/versions/18/sections/3/paragraphs/1": "The planner may implement an ORDER BY clause in several ways. The above example shows that such an ordering clause may be implemented implicitly. The planner may also add an explicit Sort step:", "/versions/18/sections/3/paragraphs/2": "If a part of the plan guarantees an ordering on a prefix of the required sort keys, then the planner may instead decide to use an Incremental Sort step:", "/versions/18/sections/3/paragraphs/3": "Merge join requires its input data to be sorted on the join keys. In this example each input is sorted by using an index scan to visit the rows in the correct order; but a sequential scan and sort could also be used. (Sequential-scan-and-sort frequently beats an index scan for sorting many rows, because of the nonsequential disk access required by the index scan.)", "/versions/18/sections/3/paragraphs/4": "In some cases EXPLAIN ANALYZE shows additional execution statistics beyond the plan node execution times and row counts. For example, Sort and Hash nodes provide extra information:", "/versions/18/sections/3/paragraphs/5": "The Sort node shows the sort method used (in particular, whether the sort was in-memory or on-disk) and the amount of memory or disk space needed. The Hash node shows the number of hash buckets and batches as well as the peak amount of memory used for the hash table. (If the number of batches exceeds one, there will also be disk space usage involved, but that is not shown.)", "/versions/18/sections/5/paragraphs/0": "Sorts tuples from the outer subtree of the node using tuplesort, which saves the results in a temporary file or memory. After the initial call, returns a tuple from the file with each call.", "/versions/18/sections/5/paragraphs/1": "There are two distinct ways that this sort can be performed:", "/versions/18/sections/5/paragraphs/2": "1) When the result is a single column we perform a Datum sort.", "/versions/18/sections/5/paragraphs/3": "2) When the result contains multiple columns we perform a tuple sort.", "/versions/18/sections/5/paragraphs/4": "We could do this by always performing a tuple sort, however sorting Datums only can be significantly faster than sorting tuples, especially when the Datums are of a pass-by-value type.", "/versions/18/tables/0/columns/0/label": "Text-format label", "/versions/18/tables/0/columns/1/label": "Structured node identity", "/versions/18/sections/4/blocks/0/paragraphs/0": "Example copied from the PostgreSQL 18.6 manual; it was not executed for this collection.", "/versions/18/sections/4/blocks/0/paragraphs/1": "The planner may implement an ORDER BY clause in several ways. The above example shows that such an ordering clause may be implemented implicitly. The planner may also add an explicit Sort step:", "/versions/18/sections/4/blocks/1/paragraphs/0": "Example copied from the PostgreSQL 18.6 manual; it was not executed for this collection.", "/versions/18/sections/4/blocks/1/paragraphs/1": "If a part of the plan guarantees an ordering on a prefix of the required sort keys, then the planner may instead decide to use an Incremental Sort step:"}, "fallback_fields": [], "source_language": "en", "original_snapshot_sha256": "658f474e9a5baffc05bd4c380ff770c5624945b0b7dd56752a05dffc04a2172c"}, "evidence_kind": "source and documentation", "explain_names": ["Sort"], "partial_modes": [], "comparison_data": {"node_tag": "T_Sort", "strategies": [], "text_names": ["Sort"], "initializer": "ExecInitSort", "partial_modes": [], "memory_mechanism": "tuplesort", "parallel_callbacks": ["ExecSortEstimate", "ExecSortInitializeDSM", "ExecSortInitializeWorker", "ExecSortRetrieveInstrumentation"]}, "comparison_hash": "32a824f93669794b01449d5d8a08ff4edcb6024cb1a897131b35fe5cddc2e4da", "explain_prefixes": ["Parallel", "Async"], "runtime_verified": false, "source_inventory": {"explain": "src/backend/commands/explain.c", "executor": "src/backend/executor/execProcnode.c", "implementation": "src/backend/executor/nodeSort.c"}, "parallel_callbacks": ["ExecSortEstimate", "ExecSortInitializeDSM", "ExecSortInitializeWorker", "ExecSortRetrieveInstrumentation"]}, "comparison": {"left": "17", "right": "18", "status": "unchanged", "diff": ""}}