{"id":100761,"date":"2026-09-05T09:16:59","date_gmt":"2026-09-05T01:16:59","guid":{"rendered":"https:\/\/www.wsisp.com\/helps\/100761.html"},"modified":"2026-09-05T09:16:59","modified_gmt":"2026-09-05T01:16:59","slug":"postgresql-%e4%bb%8e%e9%9b%b6%e5%88%b0%e4%bc%81%e4%b8%9a%e7%ba%a7%e5%ae%8c%e5%85%a8%e6%8c%87%e5%8d%97","status":"publish","type":"post","link":"https:\/\/www.wsisp.com\/helps\/100761.html","title":{"rendered":"PostgreSQL \u4ece\u96f6\u5230\u4f01\u4e1a\u7ea7\u5b8c\u5168\u6307\u5357"},"content":{"rendered":"<h2>PostgreSQL \u4ece\u96f6\u5230\u4f01\u4e1a\u7ea7\u5b8c\u5168\u6307\u5357<\/h2>\n<p>&#x1f4da; \u672c\u6587\u6863\u6db5\u76d6 PostgreSQL \u6570\u636e\u5e93\u4ece\u5165\u95e8\u57fa\u7840\u5230\u4f01\u4e1a\u7ea7\u5e94\u7528\u7684\u5b8c\u6574\u77e5\u8bc6\u4f53\u7cfb &#x1f3af; \u9002\u5408\u5f00\u53d1\u8005\u3001DBA\u3001\u67b6\u6784\u5e08\u7b49\u4e0d\u540c\u89d2\u8272\u7684\u5b66\u4e60\u9700\u6c42<\/p>\n<hr \/>\n<h3>&#x1f4d1; \u76ee\u5f55<\/h3>\n<li>PostgreSQL \u7b80\u4ecb<\/li>\n<li>\u5b89\u88c5\u4e0e\u914d\u7f6e<\/li>\n<li>\u57fa\u7840\u64cd\u4f5c<\/li>\n<li>\u9ad8\u7ea7\u7279\u6027<\/li>\n<li>\u6027\u80fd\u4f18\u5316<\/li>\n<li>\u4f01\u4e1a\u7ea7\u90e8\u7f72\u4e0e\u7ef4\u62a4<\/li>\n<li>\u6700\u4f73\u5b9e\u8df5<\/li>\n<hr \/>\n<h3>1. PostgreSQL \u7b80\u4ecb<\/h3>\n<h4>1.1 \u4ec0\u4e48\u662f PostgreSQL<\/h4>\n<p>PostgreSQL \u662f\u4e00\u4e2a\u529f\u80fd\u5f3a\u5927\u7684 \u5f00\u6e90\u5bf9\u8c61-\u5173\u7cfb\u6570\u636e\u5e93\u7cfb\u7edf&#xff0c;\u5177\u6709\u8d85\u8fc7 35 \u5e74\u7684\u6d3b\u8dc3\u5f00\u53d1\u5386\u53f2\u3002\u5b83\u4ee5\u53ef\u9760\u6027\u3001\u529f\u80fd\u5b8c\u6574\u6027\u548c\u6027\u80fd\u8457\u79f0\u3002<\/p>\n<h4>1.2 \u6838\u5fc3\u7279\u6027<\/h4>\n<table>\n<tr>\u7279\u6027\u7c7b\u522b\u5177\u4f53\u7279\u6027<\/tr>\n<tbody>\n<tr>\n<td>SQL \u652f\u6301<\/td>\n<td>\u5b8c\u6574\u7684 SQL \u6807\u51c6\u652f\u6301\u3001\u9ad8\u7ea7\u67e5\u8be2\u529f\u80fd<\/td>\n<\/tr>\n<tr>\n<td>\u6570\u636e\u7c7b\u578b<\/td>\n<td>JSON\/JSONB\u3001\u6570\u7ec4\u3001hstore\u3001\u51e0\u4f55\u7c7b\u578b\u3001\u7f51\u7edc\u5730\u5740\u7c7b\u578b\u7b49<\/td>\n<\/tr>\n<tr>\n<td>\u5e76\u53d1\u63a7\u5236<\/td>\n<td>\u591a\u7248\u672c\u5e76\u53d1\u63a7\u5236 (MVCC)\u3001\u4e8b\u52a1\u9694\u79bb\u7ea7\u522b<\/td>\n<\/tr>\n<tr>\n<td>\u6269\u5c55\u6027<\/td>\n<td>\u81ea\u5b9a\u4e49\u7c7b\u578b\u3001\u51fd\u6570\u3001\u8fd0\u7b97\u7b26\u3001\u7d22\u5f15\u65b9\u6cd5<\/td>\n<\/tr>\n<tr>\n<td>\u5b89\u5168\u6027<\/td>\n<td>SSL\/TLS\u3001\u884c\u7ea7\u5b89\u5168\u7b56\u7565\u3001\u89d2\u8272\u7ba1\u7406<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h4>1.3 PostgreSQL vs \u5176\u4ed6\u6570\u636e\u5e93<\/h4>\n<p>\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510<br \/>\n\u2502     \u7279\u6027        \u2502 PostgreSQL   \u2502 MySQL        \u2502 SQL Server  \u2502<br \/>\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524<br \/>\n\u2502 \u5f00\u6e90            \u2502 \u2705 \u5b8c\u5168\u5f00\u6e90   \u2502 \u2705 \u5f00\u6e90       \u2502 \u274c \u5546\u4e1a      \u2502<br \/>\n\u2502 ACID \u4e8b\u52a1       \u2502 \u2705 \u5b8c\u6574\u652f\u6301   \u2502 \u2705 InnoDB     \u2502 \u2705 \u5b8c\u6574      \u2502<br \/>\n\u2502 JSON \u652f\u6301       \u2502 \u2705 \u539f\u751f JSONB \u2502 \u2705 \u57fa\u672c JSON  \u2502 \u2705 \u652f\u6301      \u2502<br \/>\n\u2502 \u6269\u5c55\u6027          \u2502 \u2b50 \u6781\u5f3a       \u2502 \u4e2d\u7b49          \u2502 \u6709\u9650        \u2502<br \/>\n\u2502 \u8bb8\u53ef\u8bc1          \u2502 PostgreSQL   \u2502 GPL          \u2502 \u5546\u4e1a\u8bb8\u53ef    \u2502<br \/>\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518<\/p>\n<hr \/>\n<h3>2. \u5b89\u88c5\u4e0e\u914d\u7f6e<\/h3>\n<h4>2.1 \u5b89\u88c5\u65b9\u5f0f<\/h4>\n<h5>Windows \u5b89\u88c5<\/h5>\n<p><span class=\"token comment\"># \u65b9\u6cd51: \u4f7f\u7528\u5b98\u65b9\u5b89\u88c5\u7a0b\u5e8f<\/span><br \/>\n<span class=\"token comment\"># \u4e0b\u8f7d\u5730\u5740: https:\/\/www.postgresql.org\/download\/windows\/<\/span><\/p>\n<p><span class=\"token comment\"># \u65b9\u6cd52: \u4f7f\u7528 Chocolatey<\/span><br \/>\nchoco install postgresql<\/p>\n<p><span class=\"token comment\"># \u65b9\u6cd53: \u4f7f\u7528 winget<\/span><br \/>\nwinget install PostgreSQL<span class=\"token punctuation\">.<\/span>PostgreSQL<\/p>\n<h5>Linux \u5b89\u88c5<\/h5>\n<p><span class=\"token comment\"># Ubuntu\/Debian<\/span><br \/>\n<span class=\"token function\">sudo<\/span> <span class=\"token function\">apt<\/span> update<br \/>\n<span class=\"token function\">sudo<\/span> <span class=\"token function\">apt<\/span> <span class=\"token function\">install<\/span> postgresql postgresql-contrib<\/p>\n<p><span class=\"token comment\"># CentOS\/RHEL<\/span><br \/>\n<span class=\"token function\">sudo<\/span> yum <span class=\"token function\">install<\/span> postgresql-server postgresql-contrib<br \/>\n<span class=\"token function\">sudo<\/span> postgresql-setup initdb<\/p>\n<p><span class=\"token comment\"># \u542f\u52a8\u670d\u52a1<\/span><br \/>\n<span class=\"token function\">sudo<\/span> systemctl start postgresql<br \/>\n<span class=\"token function\">sudo<\/span> systemctl <span class=\"token builtin class-name\">enable<\/span> postgresql<\/p>\n<h5>Docker \u5b89\u88c5<\/h5>\n<p><span class=\"token comment\"># \u5feb\u901f\u542f\u52a8<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">&#8211;name<\/span> postgres-db <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-e<\/span> <span class=\"token assign-left variable\">POSTGRES_PASSWORD<\/span><span class=\"token operator\">&#061;<\/span>your_password <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-p<\/span> <span class=\"token number\">5432<\/span>:5432 <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-d<\/span> postgres:15<\/p>\n<p><span class=\"token comment\"># \u5e26\u6301\u4e45\u5316\u5b58\u50a8<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">&#8211;name<\/span> postgres-db <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-e<\/span> <span class=\"token assign-left variable\">POSTGRES_PASSWORD<\/span><span class=\"token operator\">&#061;<\/span>your_password <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-v<\/span> pgdata:\/var\/lib\/postgresql\/data <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-p<\/span> <span class=\"token number\">5432<\/span>:5432 <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-d<\/span> postgres:15<\/p>\n<h4>2.2 \u8fde\u63a5\u7ba1\u7406<\/h4>\n<p><span class=\"token comment\"># \u8fde\u63a5\u5230\u9ed8\u8ba4\u6570\u636e\u5e93<\/span><br \/>\npsql <span class=\"token parameter variable\">-U<\/span> postgres<\/p>\n<p><span class=\"token comment\"># \u8fde\u63a5\u5230\u6307\u5b9a\u6570\u636e\u5e93<\/span><br \/>\npsql <span class=\"token parameter variable\">-U<\/span> username <span class=\"token parameter variable\">-d<\/span> database_name <span class=\"token parameter variable\">-h<\/span> <span class=\"token function\">host<\/span> <span class=\"token parameter variable\">-p<\/span> port<\/p>\n<p><span class=\"token comment\"># \u8fde\u63a5\u5b57\u7b26\u4e32\u65b9\u5f0f<\/span><br \/>\npsql <span class=\"token string\">&#034;postgresql:\/\/user:password&#064;host:5432\/database&#034;<\/span><\/p>\n<h4>2.3 \u6838\u5fc3\u914d\u7f6e\u6587\u4ef6<\/h4>\n<p>PostgreSQL \u914d\u7f6e\u6587\u4ef6\u4f4d\u7f6e:<br \/>\n\u251c\u2500\u2500 postgresql.conf      # \u4e3b\u914d\u7f6e\u6587\u4ef6<br \/>\n\u251c\u2500\u2500 pg_hba.conf          # \u5ba2\u6237\u7aef\u8ba4\u8bc1\u914d\u7f6e<br \/>\n\u2514\u2500\u2500 pg_ident.conf        # \u7528\u6237\u540d\u6620\u5c04\u914d\u7f6e<\/p>\n<h5>postgresql.conf \u91cd\u8981\u53c2\u6570<\/h5>\n<p># \u8fde\u63a5\u914d\u7f6e<br \/>\nlisten_addresses &#061; &#039;localhost&#039;    # \u76d1\u542c\u5730\u5740<br \/>\nport &#061; 5432                       # \u76d1\u542c\u7aef\u53e3<br \/>\nmax_connections &#061; 100             # \u6700\u5927\u8fde\u63a5\u6570<\/p>\n<p># \u5185\u5b58\u914d\u7f6e<br \/>\nshared_buffers &#061; &#039;256MB&#039;          # \u5171\u4eab\u7f13\u51b2\u533a<br \/>\nwork_mem &#061; &#039;4MB&#039;                  # \u5de5\u4f5c\u5185\u5b58<br \/>\nmaintenance_work_mem &#061; &#039;64MB&#039;     # \u7ef4\u62a4\u5185\u5b58<\/p>\n<p># WAL \u914d\u7f6e<br \/>\nwal_level &#061; &#039;replica&#039;            # WAL \u7ea7\u522b<br \/>\nmax_wal_size &#061; &#039;1GB&#039;             # \u6700\u5927 WAL \u5927\u5c0f<\/p>\n<h5>pg_hba.conf \u793a\u4f8b<\/h5>\n<p># TYPE  DATABASE  USER      ADDRESS           METHOD<br \/>\nlocal   all       postgres                    peer<br \/>\nhost    all       all       127.0.0.1\/32      scram-sha-256<br \/>\nhost    all       all       0.0.0.0\/0         scram-sha-256<\/p>\n<hr \/>\n<h3>3. \u57fa\u7840\u64cd\u4f5c<\/h3>\n<h4>3.1 \u6570\u636e\u5e93\u4e0e\u8868\u64cd\u4f5c<\/h4>\n<h5>\u521b\u5efa\u6570\u636e\u5e93<\/h5>\n<p><span class=\"token comment\">&#8212; \u521b\u5efa\u6570\u636e\u5e93<\/span><br \/>\n<span class=\"token keyword\">CREATE<\/span> <span class=\"token keyword\">DATABASE<\/span> my_database<br \/>\n    <span class=\"token keyword\">WITH<\/span> OWNER <span class=\"token operator\">&#061;<\/span> postgres<br \/>\n    ENCODING <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#039;UTF8&#039;<\/span><br \/>\n    LC_COLLATE <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#039;en_US.UTF-8&#039;<\/span><br \/>\n    LC_CTYPE <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#039;en_US.UTF-8&#039;<\/span><br \/>\n    TEMPLATE <span class=\"token operator\">&#061;<\/span> template0<span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">&#8212; \u67e5\u770b\u6240\u6709\u6570\u636e\u5e93<\/span><br \/>\n\\\\l<\/p>\n<p><span class=\"token comment\">&#8212; \u5207\u6362\u6570\u636e\u5e93<\/span><br \/>\n\\\\c my_database<\/p>\n<h5>\u521b\u5efa\u8868<\/h5>\n<p><span class=\"token comment\">&#8212; \u7528\u6237\u8868\u793a\u4f8b<\/span><br \/>\n<span class=\"token keyword\">CREATE<\/span> <span class=\"token keyword\">TABLE<\/span> users <span class=\"token punctuation\">(<\/span><br \/>\n    id <span class=\"token keyword\">SERIAL<\/span> <span class=\"token keyword\">PRIMARY<\/span> <span class=\"token keyword\">KEY<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    username <span class=\"token keyword\">VARCHAR<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">50<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">UNIQUE<\/span> <span class=\"token operator\">NOT<\/span> <span class=\"token boolean\">NULL<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    email <span class=\"token keyword\">VARCHAR<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">100<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">UNIQUE<\/span> <span class=\"token operator\">NOT<\/span> <span class=\"token boolean\">NULL<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    password_hash <span class=\"token keyword\">VARCHAR<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">255<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">NOT<\/span> <span class=\"token boolean\">NULL<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    created_at <span class=\"token keyword\">TIMESTAMP<\/span> <span class=\"token keyword\">WITH<\/span> <span class=\"token keyword\">TIME<\/span> ZONE <span class=\"token keyword\">DEFAULT<\/span> <span class=\"token keyword\">CURRENT_TIMESTAMP<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    updated_at <span class=\"token keyword\">TIMESTAMP<\/span> <span class=\"token keyword\">WITH<\/span> <span class=\"token keyword\">TIME<\/span> ZONE <span class=\"token keyword\">DEFAULT<\/span> <span class=\"token keyword\">CURRENT_TIMESTAMP<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    is_active <span class=\"token keyword\">BOOLEAN<\/span> <span class=\"token keyword\">DEFAULT<\/span> <span class=\"token boolean\">TRUE<\/span><br \/>\n<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">&#8212; \u8ba2\u5355\u8868\u793a\u4f8b<\/span><br \/>\n<span class=\"token keyword\">CREATE<\/span> <span class=\"token keyword\">TABLE<\/span> orders <span class=\"token punctuation\">(<\/span><br \/>\n    order_id <span class=\"token keyword\">SERIAL<\/span> <span class=\"token keyword\">PRIMARY<\/span> <span class=\"token keyword\">KEY<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    user_id <span class=\"token keyword\">INTEGER<\/span> <span class=\"token keyword\">REFERENCES<\/span> users<span class=\"token punctuation\">(<\/span>id<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">ON<\/span> <span class=\"token keyword\">DELETE<\/span> <span class=\"token keyword\">CASCADE<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    product_name <span class=\"token keyword\">VARCHAR<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">100<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">NOT<\/span> <span class=\"token boolean\">NULL<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    quantity <span class=\"token keyword\">INTEGER<\/span> <span class=\"token keyword\">DEFAULT<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    price <span class=\"token keyword\">DECIMAL<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">10<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">2<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token keyword\">status<\/span> <span class=\"token keyword\">VARCHAR<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">20<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">DEFAULT<\/span> <span class=\"token string\">&#039;pending&#039;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    created_at <span class=\"token keyword\">TIMESTAMP<\/span> <span class=\"token keyword\">WITH<\/span> <span class=\"token keyword\">TIME<\/span> ZONE <span class=\"token keyword\">DEFAULT<\/span> <span class=\"token keyword\">CURRENT_TIMESTAMP<\/span><br \/>\n<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">&#8212; \u67e5\u770b\u8868\u7ed3\u6784<\/span><br \/>\n\\\\d users<br \/>\n\\\\d orders<\/p>\n<h4>3.2 CRUD \u64cd\u4f5c<\/h4>\n<h5>\u63d2\u5165\u6570\u636e<\/h5>\n<p><span class=\"token comment\">&#8212; \u5355\u884c\u63d2\u5165<\/span><br \/>\n<span class=\"token keyword\">INSERT<\/span> <span class=\"token keyword\">INTO<\/span> users <span class=\"token punctuation\">(<\/span>username<span class=\"token punctuation\">,<\/span> email<span class=\"token punctuation\">,<\/span> password_hash<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token keyword\">VALUES<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token string\">&#039;john_doe&#039;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#039;john&#064;example.com&#039;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#039;hashed_password&#039;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">&#8212; \u591a\u884c\u63d2\u5165<\/span><br \/>\n<span class=\"token keyword\">INSERT<\/span> <span class=\"token keyword\">INTO<\/span> users <span class=\"token punctuation\">(<\/span>username<span class=\"token punctuation\">,<\/span> email<span class=\"token punctuation\">,<\/span> password_hash<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token keyword\">VALUES<\/span><br \/>\n    <span class=\"token punctuation\">(<\/span><span class=\"token string\">&#039;jane_smith&#039;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#039;jane&#064;example.com&#039;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#039;hashed_password_1&#039;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">(<\/span><span class=\"token string\">&#039;bob_wilson&#039;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#039;bob&#064;example.com&#039;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#039;hashed_password_2&#039;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">&#8212; \u6279\u91cf\u63d2\u5165<\/span><br \/>\n<span class=\"token keyword\">INSERT<\/span> <span class=\"token keyword\">INTO<\/span> orders <span class=\"token punctuation\">(<\/span>user_id<span class=\"token punctuation\">,<\/span> product_name<span class=\"token punctuation\">,<\/span> quantity<span class=\"token punctuation\">,<\/span> price<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token keyword\">SELECT<\/span><br \/>\n    id<span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token string\">&#039;Product &#039;<\/span> <span class=\"token operator\">||<\/span> id<span class=\"token punctuation\">,<\/span><br \/>\n    floor<span class=\"token punctuation\">(<\/span>random<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">*<\/span> <span class=\"token number\">10<\/span> <span class=\"token operator\">&#043;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span>::<span class=\"token keyword\">int<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">(<\/span>random<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">*<\/span> <span class=\"token number\">100<\/span><span class=\"token punctuation\">)<\/span>::<span class=\"token keyword\">decimal<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">10<\/span><span class=\"token punctuation\">,<\/span><span class=\"token number\">2<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token keyword\">FROM<\/span> users<br \/>\n<span class=\"token keyword\">WHERE<\/span> id <span class=\"token operator\">&lt;&#061;<\/span> <span class=\"token number\">5<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<h5>\u67e5\u8be2\u6570\u636e<\/h5>\n<p><span class=\"token comment\">&#8212; \u57fa\u7840\u67e5\u8be2<\/span><br \/>\n<span class=\"token keyword\">SELECT<\/span> <span class=\"token operator\">*<\/span> <span class=\"token keyword\">FROM<\/span> users <span class=\"token keyword\">WHERE<\/span> is_active <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">TRUE<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">&#8212; \u8054\u63a5\u67e5\u8be2<\/span><br \/>\n<span class=\"token keyword\">SELECT<\/span><br \/>\n    u<span class=\"token punctuation\">.<\/span>username<span class=\"token punctuation\">,<\/span><br \/>\n    u<span class=\"token punctuation\">.<\/span>email<span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token function\">COUNT<\/span><span class=\"token punctuation\">(<\/span>o<span class=\"token punctuation\">.<\/span>order_id<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">as<\/span> order_count<span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token function\">SUM<\/span><span class=\"token punctuation\">(<\/span>o<span class=\"token punctuation\">.<\/span>price <span class=\"token operator\">*<\/span> o<span class=\"token punctuation\">.<\/span>quantity<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">as<\/span> total_spent<br \/>\n<span class=\"token keyword\">FROM<\/span> users u<br \/>\n<span class=\"token keyword\">LEFT<\/span> <span class=\"token keyword\">JOIN<\/span> orders o <span class=\"token keyword\">ON<\/span> u<span class=\"token punctuation\">.<\/span>id <span class=\"token operator\">&#061;<\/span> o<span class=\"token punctuation\">.<\/span>user_id<br \/>\n<span class=\"token keyword\">GROUP<\/span> <span class=\"token keyword\">BY<\/span> u<span class=\"token punctuation\">.<\/span>id<span class=\"token punctuation\">,<\/span> u<span class=\"token punctuation\">.<\/span>username<span class=\"token punctuation\">,<\/span> u<span class=\"token punctuation\">.<\/span>email<br \/>\n<span class=\"token keyword\">HAVING<\/span> <span class=\"token function\">COUNT<\/span><span class=\"token punctuation\">(<\/span>o<span class=\"token punctuation\">.<\/span>order_id<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&gt;<\/span> <span class=\"token number\">0<\/span><br \/>\n<span class=\"token keyword\">ORDER<\/span> <span class=\"token keyword\">BY<\/span> total_spent <span class=\"token keyword\">DESC<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">&#8212; \u5b50\u67e5\u8be2<\/span><br \/>\n<span class=\"token keyword\">SELECT<\/span> <span class=\"token operator\">*<\/span> <span class=\"token keyword\">FROM<\/span> users<br \/>\n<span class=\"token keyword\">WHERE<\/span> id <span class=\"token operator\">IN<\/span> <span class=\"token punctuation\">(<\/span><br \/>\n    <span class=\"token keyword\">SELECT<\/span> user_id <span class=\"token keyword\">FROM<\/span> orders<br \/>\n    <span class=\"token keyword\">WHERE<\/span> price <span class=\"token operator\">&gt;<\/span> <span class=\"token number\">50<\/span><br \/>\n<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">&#8212; \u7a97\u53e3\u51fd\u6570<\/span><br \/>\n<span class=\"token keyword\">SELECT<\/span><br \/>\n    username<span class=\"token punctuation\">,<\/span><br \/>\n    email<span class=\"token punctuation\">,<\/span><br \/>\n    created_at<span class=\"token punctuation\">,<\/span><br \/>\n    ROW_NUMBER<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">OVER<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">ORDER<\/span> <span class=\"token keyword\">BY<\/span> created_at<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">as<\/span> row_num<span class=\"token punctuation\">,<\/span><br \/>\n    DENSE_RANK<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">OVER<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">ORDER<\/span> <span class=\"token keyword\">BY<\/span> created_at<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">as<\/span> dense_rank<br \/>\n<span class=\"token keyword\">FROM<\/span> users<span class=\"token punctuation\">;<\/span><\/p>\n<h5>\u66f4\u65b0\u6570\u636e<\/h5>\n<p><span class=\"token comment\">&#8212; \u5355\u884c\u66f4\u65b0<\/span><br \/>\n<span class=\"token keyword\">UPDATE<\/span> users<br \/>\n<span class=\"token keyword\">SET<\/span> email <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#039;new_email&#064;example.com&#039;<\/span><br \/>\n<span class=\"token keyword\">WHERE<\/span> username <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#039;john_doe&#039;<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">&#8212; \u6279\u91cf\u66f4\u65b0<\/span><br \/>\n<span class=\"token keyword\">UPDATE<\/span> orders<br \/>\n<span class=\"token keyword\">SET<\/span> <span class=\"token keyword\">status<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#039;completed&#039;<\/span><br \/>\n<span class=\"token keyword\">WHERE<\/span> created_at <span class=\"token operator\">&lt;<\/span> <span class=\"token keyword\">CURRENT_DATE<\/span> <span class=\"token operator\">&#8211;<\/span> <span class=\"token keyword\">INTERVAL<\/span> <span class=\"token string\">&#039;7 days&#039;<\/span><br \/>\n<span class=\"token operator\">AND<\/span> <span class=\"token keyword\">status<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#039;pending&#039;<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">&#8212; \u4f7f\u7528 CTE \u66f4\u65b0<\/span><br \/>\n<span class=\"token keyword\">WITH<\/span> user_orders <span class=\"token keyword\">AS<\/span> <span class=\"token punctuation\">(<\/span><br \/>\n    <span class=\"token keyword\">SELECT<\/span> user_id<span class=\"token punctuation\">,<\/span> <span class=\"token function\">COUNT<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">*<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">as<\/span> order_count<br \/>\n    <span class=\"token keyword\">FROM<\/span> orders<br \/>\n    <span class=\"token keyword\">GROUP<\/span> <span class=\"token keyword\">BY<\/span> user_id<br \/>\n<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token keyword\">UPDATE<\/span> users<br \/>\n<span class=\"token keyword\">SET<\/span> is_active <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">FALSE<\/span><br \/>\n<span class=\"token keyword\">WHERE<\/span> id <span class=\"token operator\">IN<\/span> <span class=\"token punctuation\">(<\/span><br \/>\n    <span class=\"token keyword\">SELECT<\/span> user_id<br \/>\n    <span class=\"token keyword\">FROM<\/span> user_orders<br \/>\n    <span class=\"token keyword\">WHERE<\/span> order_count <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><br \/>\n<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<h5>\u5220\u9664\u6570\u636e<\/h5>\n<p><span class=\"token comment\">&#8212; \u5355\u884c\u5220\u9664<\/span><br \/>\n<span class=\"token keyword\">DELETE<\/span> <span class=\"token keyword\">FROM<\/span> users <span class=\"token keyword\">WHERE<\/span> username <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#039;bob_wilson&#039;<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">&#8212; \u6279\u91cf\u5220\u9664<\/span><br \/>\n<span class=\"token keyword\">DELETE<\/span> <span class=\"token keyword\">FROM<\/span> orders<br \/>\n<span class=\"token keyword\">WHERE<\/span> <span class=\"token keyword\">status<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#039;cancelled&#039;<\/span><br \/>\n<span class=\"token operator\">AND<\/span> created_at <span class=\"token operator\">&lt;<\/span> <span class=\"token keyword\">CURRENT_DATE<\/span> <span class=\"token operator\">&#8211;<\/span> <span class=\"token keyword\">INTERVAL<\/span> <span class=\"token string\">&#039;1 year&#039;<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">&#8212; \u8f6f\u5220\u9664&#xff08;\u63a8\u8350&#xff09;<\/span><br \/>\n<span class=\"token keyword\">UPDATE<\/span> users <span class=\"token keyword\">SET<\/span> is_active <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">FALSE<\/span> <span class=\"token keyword\">WHERE<\/span> id <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">123<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<h4>3.3 \u4e8b\u52a1\u7ba1\u7406<\/h4>\n<p><span class=\"token comment\">&#8212; \u57fa\u672c\u4e8b\u52a1<\/span><br \/>\n<span class=\"token keyword\">BEGIN<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token keyword\">INSERT<\/span> <span class=\"token keyword\">INTO<\/span> users <span class=\"token punctuation\">(<\/span>username<span class=\"token punctuation\">,<\/span> email<span class=\"token punctuation\">,<\/span> password_hash<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token keyword\">VALUES<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token string\">&#039;transaction_user&#039;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#039;tx&#064;example.com&#039;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#039;hash&#039;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token keyword\">UPDATE<\/span> accounts <span class=\"token keyword\">SET<\/span> balance <span class=\"token operator\">&#061;<\/span> balance <span class=\"token operator\">&#8211;<\/span> <span class=\"token number\">100<\/span> <span class=\"token keyword\">WHERE<\/span> user_id <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">UPDATE<\/span> accounts <span class=\"token keyword\">SET<\/span> balance <span class=\"token operator\">&#061;<\/span> balance <span class=\"token operator\">&#043;<\/span> <span class=\"token number\">100<\/span> <span class=\"token keyword\">WHERE<\/span> user_id <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">2<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token keyword\">COMMIT<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">&#8212; \u56de\u6eda\u4e8b\u52a1<\/span><br \/>\n<span class=\"token keyword\">BEGIN<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token comment\">&#8212; \u67d0\u4e9b\u64cd\u4f5c&#8230;<\/span><br \/>\n<span class=\"token keyword\">ROLLBACK<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">&#8212; \u4fdd\u5b58\u70b9<\/span><br \/>\n<span class=\"token keyword\">BEGIN<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">INSERT<\/span> <span class=\"token keyword\">INTO<\/span> users <span class=\"token punctuation\">(<\/span>username<span class=\"token punctuation\">,<\/span> email<span class=\"token punctuation\">,<\/span> password_hash<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token keyword\">VALUES<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token string\">&#039;user1&#039;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#039;user1&#064;example.com&#039;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#039;hash1&#039;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token keyword\">SAVEPOINT<\/span> sp1<span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token keyword\">INSERT<\/span> <span class=\"token keyword\">INTO<\/span> users <span class=\"token punctuation\">(<\/span>username<span class=\"token punctuation\">,<\/span> email<span class=\"token punctuation\">,<\/span> password_hash<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token keyword\">VALUES<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token string\">&#039;user2&#039;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#039;user2&#064;example.com&#039;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#039;hash2&#039;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token keyword\">ROLLBACK<\/span> <span class=\"token keyword\">TO<\/span> sp1<span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token keyword\">COMMIT<\/span><span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">&#8212; \u53ea\u63d0\u4ea4 user1<\/span><\/p>\n<hr \/>\n<h3>4. \u9ad8\u7ea7\u7279\u6027<\/h3>\n<h4>4.1 \u7d22\u5f15\u4f18\u5316<\/h4>\n<h5>\u7d22\u5f15\u7c7b\u578b<\/h5>\n<p><span class=\"token comment\">&#8212; B-tree \u7d22\u5f15&#xff08;\u9ed8\u8ba4&#xff0c;\u6700\u5e38\u7528&#xff09;<\/span><br \/>\n<span class=\"token keyword\">CREATE<\/span> <span class=\"token keyword\">INDEX<\/span> idx_users_email <span class=\"token keyword\">ON<\/span> users<span class=\"token punctuation\">(<\/span>email<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">&#8212; \u590d\u5408\u7d22\u5f15<\/span><br \/>\n<span class=\"token keyword\">CREATE<\/span> <span class=\"token keyword\">INDEX<\/span> idx_orders_user_status <span class=\"token keyword\">ON<\/span> orders<span class=\"token punctuation\">(<\/span>user_id<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">status<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">&#8212; \u90e8\u5206\u7d22\u5f15<\/span><br \/>\n<span class=\"token keyword\">CREATE<\/span> <span class=\"token keyword\">INDEX<\/span> idx_active_users <span class=\"token keyword\">ON<\/span> users<span class=\"token punctuation\">(<\/span>email<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token keyword\">WHERE<\/span> is_active <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">TRUE<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">&#8212; \u8868\u8fbe\u5f0f\u7d22\u5f15<\/span><br \/>\n<span class=\"token keyword\">CREATE<\/span> <span class=\"token keyword\">INDEX<\/span> idx_users_lower_email <span class=\"token keyword\">ON<\/span> users<span class=\"token punctuation\">(<\/span>LOWER<span class=\"token punctuation\">(<\/span>email<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">&#8212; GIN \u7d22\u5f15&#xff08;\u7528\u4e8e\u5168\u6587\u641c\u7d22\u3001JSONB\u3001\u6570\u7ec4&#xff09;<\/span><br \/>\n<span class=\"token keyword\">CREATE<\/span> <span class=\"token keyword\">INDEX<\/span> idx_products_tags <span class=\"token keyword\">ON<\/span> products <span class=\"token keyword\">USING<\/span> GIN<span class=\"token punctuation\">(<\/span>tags<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">CREATE<\/span> <span class=\"token keyword\">INDEX<\/span> idx_documents_search <span class=\"token keyword\">ON<\/span> documents <span class=\"token keyword\">USING<\/span> GIN<span class=\"token punctuation\">(<\/span>to_tsvector<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#039;english&#039;<\/span><span class=\"token punctuation\">,<\/span> content<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">&#8212; GiST \u7d22\u5f15&#xff08;\u7528\u4e8e\u51e0\u4f55\u6570\u636e\u3001\u8303\u56f4\u7c7b\u578b&#xff09;<\/span><br \/>\n<span class=\"token keyword\">CREATE<\/span> <span class=\"token keyword\">INDEX<\/span> idx_locations_point <span class=\"token keyword\">ON<\/span> locations <span class=\"token keyword\">USING<\/span> GIST<span class=\"token punctuation\">(<\/span><span class=\"token keyword\">point<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">&#8212; BRIN \u7d22\u5f15&#xff08;\u7528\u4e8e\u5927\u8868\u7684\u8303\u56f4\u626b\u63cf&#xff09;<\/span><br \/>\n<span class=\"token keyword\">CREATE<\/span> <span class=\"token keyword\">INDEX<\/span> idx_logs_timestamp <span class=\"token keyword\">ON<\/span> logs <span class=\"token keyword\">USING<\/span> BRIN<span class=\"token punctuation\">(<\/span>created_at<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">&#8212; \u67e5\u770b\u7d22\u5f15<\/span><br \/>\n\\\\d tablename<br \/>\n<span class=\"token keyword\">SELECT<\/span> <span class=\"token operator\">*<\/span> <span class=\"token keyword\">FROM<\/span> pg_indexes <span class=\"token keyword\">WHERE<\/span> tablename <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#039;users&#039;<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<h4>4.2 JSONB \u64cd\u4f5c<\/h4>\n<p><span class=\"token comment\">&#8212; \u521b\u5efa\u5305\u542b JSONB \u7684\u8868<\/span><br \/>\n<span class=\"token keyword\">CREATE<\/span> <span class=\"token keyword\">TABLE<\/span> products <span class=\"token punctuation\">(<\/span><br \/>\n    id <span class=\"token keyword\">SERIAL<\/span> <span class=\"token keyword\">PRIMARY<\/span> <span class=\"token keyword\">KEY<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    name <span class=\"token keyword\">VARCHAR<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">100<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">NOT<\/span> <span class=\"token boolean\">NULL<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    attributes JSONB <span class=\"token operator\">NOT<\/span> <span class=\"token boolean\">NULL<\/span> <span class=\"token keyword\">DEFAULT<\/span> <span class=\"token string\">&#039;{}&#039;<\/span>::jsonb<br \/>\n<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">&#8212; \u63d2\u5165\u6570\u636e<\/span><br \/>\n<span class=\"token keyword\">INSERT<\/span> <span class=\"token keyword\">INTO<\/span> products <span class=\"token punctuation\">(<\/span>name<span class=\"token punctuation\">,<\/span> attributes<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token keyword\">VALUES<\/span><br \/>\n    <span class=\"token punctuation\">(<\/span><span class=\"token string\">&#039;iPhone 15&#039;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#039;{&#034;brand&#034;: &#034;Apple&#034;, &#034;color&#034;: &#034;black&#034;, &#034;specs&#034;: {&#034;ram&#034;: &#034;6GB&#034;, &#034;storage&#034;: &#034;128GB&#034;}}&#039;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">(<\/span><span class=\"token string\">&#039;Galaxy S24&#039;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#039;{&#034;brand&#034;: &#034;Samsung&#034;, &#034;color&#034;: &#034;white&#034;, &#034;specs&#034;: {&#034;ram&#034;: &#034;8GB&#034;, &#034;storage&#034;: &#034;256GB&#034;}}&#039;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">&#8212; \u67e5\u8be2 JSONB \u5b57\u6bb5<\/span><br \/>\n<span class=\"token keyword\">SELECT<\/span><br \/>\n    name<span class=\"token punctuation\">,<\/span><br \/>\n    attributes<span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;&gt;<\/span><span class=\"token string\">&#039;brand&#039;<\/span> <span class=\"token keyword\">as<\/span> brand<span class=\"token punctuation\">,<\/span><br \/>\n    attributes<span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span><span class=\"token string\">&#039;specs&#039;<\/span><span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;&gt;<\/span><span class=\"token string\">&#039;ram&#039;<\/span> <span class=\"token keyword\">as<\/span> ram<br \/>\n<span class=\"token keyword\">FROM<\/span> products<span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">&#8212; \u6761\u4ef6\u8fc7\u6ee4<\/span><br \/>\n<span class=\"token keyword\">SELECT<\/span> <span class=\"token operator\">*<\/span> <span class=\"token keyword\">FROM<\/span> products<br \/>\n<span class=\"token keyword\">WHERE<\/span> attributes &#064;<span class=\"token operator\">&gt;<\/span> <span class=\"token string\">&#039;{&#034;brand&#034;: &#034;Apple&#034;}&#039;<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">&#8212; \u5c55\u5f00 JSONB<\/span><br \/>\n<span class=\"token keyword\">SELECT<\/span><br \/>\n    name<span class=\"token punctuation\">,<\/span><br \/>\n    jsonb_object_keys<span class=\"token punctuation\">(<\/span>attributes<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">as<\/span> <span class=\"token keyword\">key<\/span><br \/>\n<span class=\"token keyword\">FROM<\/span> products<span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">&#8212; \u66f4\u65b0 JSONB<\/span><br \/>\n<span class=\"token keyword\">UPDATE<\/span> products<br \/>\n<span class=\"token keyword\">SET<\/span> attributes <span class=\"token operator\">&#061;<\/span> attributes <span class=\"token operator\">||<\/span> <span class=\"token string\">&#039;{&#034;color&#034;: &#034;blue&#034;}&#039;<\/span>::jsonb<br \/>\n<span class=\"token keyword\">WHERE<\/span> id <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">&#8212; \u6dfb\u52a0\u5d4c\u5957\u5b57\u6bb5<\/span><br \/>\n<span class=\"token keyword\">UPDATE<\/span> products<br \/>\n<span class=\"token keyword\">SET<\/span> attributes <span class=\"token operator\">&#061;<\/span> jsonb_set<span class=\"token punctuation\">(<\/span><br \/>\n    attributes<span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token string\">&#039;{specs, battery}&#039;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token string\">&#039;&#034;4500mAh&#034;&#039;<\/span><br \/>\n<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token keyword\">WHERE<\/span> id <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<h4>4.3 \u5b58\u50a8\u8fc7\u7a0b\u4e0e\u51fd\u6570<\/h4>\n<p><span class=\"token comment\">&#8212; \u521b\u5efa\u51fd\u6570<\/span><br \/>\n<span class=\"token keyword\">CREATE<\/span> <span class=\"token operator\">OR<\/span> <span class=\"token keyword\">REPLACE<\/span> <span class=\"token keyword\">FUNCTION<\/span> calculate_order_total<span class=\"token punctuation\">(<\/span><br \/>\n    p_user_id <span class=\"token keyword\">INTEGER<\/span><br \/>\n<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">RETURNS<\/span> <span class=\"token keyword\">DECIMAL<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">10<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">2<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">AS<\/span> $$<br \/>\n<span class=\"token keyword\">DECLARE<\/span><br \/>\n    v_total <span class=\"token keyword\">DECIMAL<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">10<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">2<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">BEGIN<\/span><br \/>\n    <span class=\"token keyword\">SELECT<\/span> <span class=\"token keyword\">COALESCE<\/span><span class=\"token punctuation\">(<\/span><span class=\"token function\">SUM<\/span><span class=\"token punctuation\">(<\/span>quantity <span class=\"token operator\">*<\/span> price<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">INTO<\/span> v_total<br \/>\n    <span class=\"token keyword\">FROM<\/span> orders<br \/>\n    <span class=\"token keyword\">WHERE<\/span> user_id <span class=\"token operator\">&#061;<\/span> p_user_id<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token keyword\">RETURN<\/span> v_total<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">END<\/span><span class=\"token punctuation\">;<\/span><br \/>\n$$ <span class=\"token keyword\">LANGUAGE<\/span> plpgsql<span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">&#8212; \u4f7f\u7528\u51fd\u6570<\/span><br \/>\n<span class=\"token keyword\">SELECT<\/span> calculate_order_total<span class=\"token punctuation\">(<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">as<\/span> user_total<span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">&#8212; \u521b\u5efa\u89e6\u53d1\u5668\u51fd\u6570<\/span><br \/>\n<span class=\"token keyword\">CREATE<\/span> <span class=\"token operator\">OR<\/span> <span class=\"token keyword\">REPLACE<\/span> <span class=\"token keyword\">FUNCTION<\/span> update_modified_column<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token keyword\">RETURNS<\/span> <span class=\"token keyword\">TRIGGER<\/span> <span class=\"token keyword\">AS<\/span> $$<br \/>\n<span class=\"token keyword\">BEGIN<\/span><br \/>\n    NEW<span class=\"token punctuation\">.<\/span>updated_at <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">CURRENT_TIMESTAMP<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">RETURN<\/span> NEW<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">END<\/span><span class=\"token punctuation\">;<\/span><br \/>\n$$ <span class=\"token keyword\">LANGUAGE<\/span> plpgsql<span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">&#8212; \u521b\u5efa\u89e6\u53d1\u5668<\/span><br \/>\n<span class=\"token keyword\">CREATE<\/span> <span class=\"token keyword\">TRIGGER<\/span> update_users_modtime<br \/>\n    BEFORE <span class=\"token keyword\">UPDATE<\/span> <span class=\"token keyword\">ON<\/span> users<br \/>\n    <span class=\"token keyword\">FOR EACH ROW<\/span><br \/>\n    <span class=\"token keyword\">EXECUTE<\/span> <span class=\"token keyword\">FUNCTION<\/span> update_modified_column<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">&#8212; \u521b\u5efa\u5b58\u50a8\u8fc7\u7a0b<\/span><br \/>\n<span class=\"token keyword\">CREATE<\/span> <span class=\"token operator\">OR<\/span> <span class=\"token keyword\">REPLACE<\/span> <span class=\"token keyword\">PROCEDURE<\/span> process_orders<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token keyword\">LANGUAGE<\/span> plpgsql<br \/>\n<span class=\"token keyword\">AS<\/span> $$<br \/>\n<span class=\"token keyword\">BEGIN<\/span><br \/>\n    <span class=\"token keyword\">UPDATE<\/span> orders<br \/>\n    <span class=\"token keyword\">SET<\/span> <span class=\"token keyword\">status<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#039;shipped&#039;<\/span><br \/>\n    <span class=\"token keyword\">WHERE<\/span> <span class=\"token keyword\">status<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#039;paid&#039;<\/span><br \/>\n    <span class=\"token operator\">AND<\/span> created_at <span class=\"token operator\">&lt;<\/span> <span class=\"token keyword\">CURRENT_DATE<\/span> <span class=\"token operator\">&#8211;<\/span> <span class=\"token keyword\">INTERVAL<\/span> <span class=\"token string\">&#039;2 days&#039;<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    RAISE NOTICE <span class=\"token string\">&#039;Orders processed at %&#039;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token function\">NOW<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">END<\/span><span class=\"token punctuation\">;<\/span><br \/>\n$$<span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">&#8212; \u8c03\u7528\u5b58\u50a8\u8fc7\u7a0b<\/span><br \/>\n<span class=\"token keyword\">CALL<\/span> process_orders<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<h4>4.4 \u5206\u533a\u8868<\/h4>\n<p><span class=\"token comment\">&#8212; \u521b\u5efa\u5206\u533a\u8868<\/span><br \/>\n<span class=\"token keyword\">CREATE<\/span> <span class=\"token keyword\">TABLE<\/span> orders_partitioned <span class=\"token punctuation\">(<\/span><br \/>\n    order_id <span class=\"token keyword\">SERIAL<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    user_id <span class=\"token keyword\">INTEGER<\/span> <span class=\"token operator\">NOT<\/span> <span class=\"token boolean\">NULL<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    product_name <span class=\"token keyword\">VARCHAR<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">100<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    price <span class=\"token keyword\">DECIMAL<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">10<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">2<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    created_at <span class=\"token keyword\">TIMESTAMP<\/span> <span class=\"token keyword\">WITH<\/span> <span class=\"token keyword\">TIME<\/span> ZONE <span class=\"token keyword\">DEFAULT<\/span> <span class=\"token keyword\">CURRENT_TIMESTAMP<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token keyword\">PRIMARY<\/span> <span class=\"token keyword\">KEY<\/span> <span class=\"token punctuation\">(<\/span>order_id<span class=\"token punctuation\">,<\/span> created_at<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">PARTITION<\/span> <span class=\"token keyword\">BY<\/span> RANGE <span class=\"token punctuation\">(<\/span>created_at<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">&#8212; \u521b\u5efa\u5206\u533a<\/span><br \/>\n<span class=\"token keyword\">CREATE<\/span> <span class=\"token keyword\">TABLE<\/span> orders_2024_q1 <span class=\"token keyword\">PARTITION<\/span> <span class=\"token keyword\">OF<\/span> orders_partitioned<br \/>\n    <span class=\"token keyword\">FOR<\/span> <span class=\"token keyword\">VALUES<\/span> <span class=\"token keyword\">FROM<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token string\">&#039;2024-01-01&#039;<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">TO<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token string\">&#039;2024-04-01&#039;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token keyword\">CREATE<\/span> <span class=\"token keyword\">TABLE<\/span> orders_2024_q2 <span class=\"token keyword\">PARTITION<\/span> <span class=\"token keyword\">OF<\/span> orders_partitioned<br \/>\n    <span class=\"token keyword\">FOR<\/span> <span class=\"token keyword\">VALUES<\/span> <span class=\"token keyword\">FROM<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token string\">&#039;2024-04-01&#039;<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">TO<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token string\">&#039;2024-07-01&#039;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token keyword\">CREATE<\/span> <span class=\"token keyword\">TABLE<\/span> orders_2024_q3 <span class=\"token keyword\">PARTITION<\/span> <span class=\"token keyword\">OF<\/span> orders_partitioned<br \/>\n    <span class=\"token keyword\">FOR<\/span> <span class=\"token keyword\">VALUES<\/span> <span class=\"token keyword\">FROM<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token string\">&#039;2024-07-01&#039;<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">TO<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token string\">&#039;2024-10-01&#039;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token keyword\">CREATE<\/span> <span class=\"token keyword\">TABLE<\/span> orders_2024_q4 <span class=\"token keyword\">PARTITION<\/span> <span class=\"token keyword\">OF<\/span> orders_partitioned<br \/>\n    <span class=\"token keyword\">FOR<\/span> <span class=\"token keyword\">VALUES<\/span> <span class=\"token keyword\">FROM<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token string\">&#039;2024-10-01&#039;<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">TO<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token string\">&#039;2025-01-01&#039;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">&#8212; \u67e5\u770b\u5206\u533a<\/span><br \/>\n<span class=\"token keyword\">SELECT<\/span> <span class=\"token operator\">*<\/span> <span class=\"token keyword\">FROM<\/span> pg_partitions <span class=\"token keyword\">WHERE<\/span> tablename <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#039;orders_partitioned&#039;<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<hr \/>\n<h3>5. \u6027\u80fd\u4f18\u5316<\/h3>\n<h4>5.1 \u67e5\u8be2\u4f18\u5316<\/h4>\n<h5>\u4f7f\u7528 EXPLAIN \u5206\u6790<\/h5>\n<p><span class=\"token comment\">&#8212; \u57fa\u672c\u5206\u6790<\/span><br \/>\n<span class=\"token keyword\">EXPLAIN<\/span> <span class=\"token keyword\">SELECT<\/span> <span class=\"token operator\">*<\/span> <span class=\"token keyword\">FROM<\/span> users <span class=\"token keyword\">WHERE<\/span> email <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#039;test&#064;example.com&#039;<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">&#8212; \u8be6\u7ec6\u5206\u6790&#xff08;\u5305\u542b\u5b9e\u9645\u6267\u884c\u65f6\u95f4&#xff09;<\/span><br \/>\n<span class=\"token keyword\">EXPLAIN<\/span> <span class=\"token keyword\">ANALYZE<\/span> <span class=\"token keyword\">SELECT<\/span> <span class=\"token operator\">*<\/span> <span class=\"token keyword\">FROM<\/span> users <span class=\"token keyword\">WHERE<\/span> email <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#039;test&#064;example.com&#039;<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">&#8212; \u683c\u5f0f\u5316\u8f93\u51fa<\/span><br \/>\n<span class=\"token keyword\">EXPLAIN<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">ANALYZE<\/span><span class=\"token punctuation\">,<\/span> BUFFERS<span class=\"token punctuation\">,<\/span> FORMAT JSON<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token keyword\">SELECT<\/span> <span class=\"token operator\">*<\/span> <span class=\"token keyword\">FROM<\/span> users <span class=\"token keyword\">WHERE<\/span> email <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#039;test&#064;example.com&#039;<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">&#8212; \u5e38\u89c1\u95ee\u9898\u8bc6\u522b<\/span><br \/>\n<span class=\"token keyword\">EXPLAIN<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">ANALYZE<\/span><span class=\"token punctuation\">,<\/span> VERBOSE<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token keyword\">SELECT<\/span> u<span class=\"token punctuation\">.<\/span><span class=\"token operator\">*<\/span><span class=\"token punctuation\">,<\/span> o<span class=\"token punctuation\">.<\/span><span class=\"token operator\">*<\/span><br \/>\n<span class=\"token keyword\">FROM<\/span> users u<br \/>\n<span class=\"token keyword\">JOIN<\/span> orders o <span class=\"token keyword\">ON<\/span> u<span class=\"token punctuation\">.<\/span>id <span class=\"token operator\">&#061;<\/span> o<span class=\"token punctuation\">.<\/span>user_id<br \/>\n<span class=\"token keyword\">WHERE<\/span> u<span class=\"token punctuation\">.<\/span>is_active <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">TRUE<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<h5>\u5e38\u89c1\u4f18\u5316\u6280\u5de7<\/h5>\n<p><span class=\"token comment\">&#8212; 1. \u907f\u514d SELECT *<\/span><br \/>\n<span class=\"token keyword\">SELECT<\/span> id<span class=\"token punctuation\">,<\/span> username<span class=\"token punctuation\">,<\/span> email <span class=\"token keyword\">FROM<\/span> users <span class=\"token keyword\">WHERE<\/span> is_active <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">TRUE<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">&#8212; 2. \u4f7f\u7528\u5408\u9002\u7684 JOIN \u7c7b\u578b<\/span><br \/>\n<span class=\"token comment\">&#8212; \u4f18\u5148\u4f7f\u7528 INNER JOIN<\/span><br \/>\n<span class=\"token keyword\">SELECT<\/span> <span class=\"token operator\">*<\/span> <span class=\"token keyword\">FROM<\/span> users u<br \/>\n<span class=\"token keyword\">INNER<\/span> <span class=\"token keyword\">JOIN<\/span> orders o <span class=\"token keyword\">ON<\/span> u<span class=\"token punctuation\">.<\/span>id <span class=\"token operator\">&#061;<\/span> o<span class=\"token punctuation\">.<\/span>user_id<span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">&#8212; 3. \u6279\u91cf\u64cd\u4f5c<\/span><br \/>\n<span class=\"token comment\">&#8212; \u4f7f\u7528 COPY \u66ff\u4ee3\u591a\u6761 INSERT<\/span><br \/>\nCOPY users <span class=\"token keyword\">FROM<\/span> STDIN <span class=\"token keyword\">WITH<\/span> CSV<span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">&#8212; 4. \u4f7f\u7528 CTE \u66ff\u4ee3\u5b50\u67e5\u8be2&#xff08;\u590d\u6742\u67e5\u8be2&#xff09;<\/span><br \/>\n<span class=\"token keyword\">WITH<\/span> active_users <span class=\"token keyword\">AS<\/span> <span class=\"token punctuation\">(<\/span><br \/>\n    <span class=\"token keyword\">SELECT<\/span> id <span class=\"token keyword\">FROM<\/span> users <span class=\"token keyword\">WHERE<\/span> is_active <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">TRUE<\/span><br \/>\n<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token keyword\">SELECT<\/span> <span class=\"token operator\">*<\/span> <span class=\"token keyword\">FROM<\/span> orders <span class=\"token keyword\">WHERE<\/span> user_id <span class=\"token operator\">IN<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">SELECT<\/span> id <span class=\"token keyword\">FROM<\/span> active_users<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">&#8212; 5. \u5408\u7406\u4f7f\u7528 LIMIT<\/span><br \/>\n<span class=\"token keyword\">SELECT<\/span> <span class=\"token operator\">*<\/span> <span class=\"token keyword\">FROM<\/span> large_table <span class=\"token keyword\">ORDER<\/span> <span class=\"token keyword\">BY<\/span> id <span class=\"token keyword\">LIMIT<\/span> <span class=\"token number\">100<\/span> <span class=\"token keyword\">OFFSET<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<h4>5.2 \u914d\u7f6e\u4f18\u5316<\/h4>\n<p><span class=\"token comment\">&#8212; \u67e5\u770b\u5f53\u524d\u914d\u7f6e<\/span><br \/>\n<span class=\"token keyword\">SHOW<\/span> shared_buffers<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">SHOW<\/span> work_mem<span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">&#8212; \u52a8\u6001\u8c03\u6574&#xff08;\u4f1a\u8bdd\u7ea7\u522b&#xff09;<\/span><br \/>\n<span class=\"token keyword\">SET<\/span> work_mem <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#039;8MB&#039;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">SET<\/span> maintenance_work_mem <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#039;128MB&#039;<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">&#8212; \u67e5\u770b\u6570\u636e\u5e93\u7edf\u8ba1<\/span><br \/>\n<span class=\"token keyword\">SELECT<\/span> <span class=\"token operator\">*<\/span> <span class=\"token keyword\">FROM<\/span> pg_stat_database<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">SELECT<\/span> <span class=\"token operator\">*<\/span> <span class=\"token keyword\">FROM<\/span> pg_stat_user_tables<span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">&#8212; \u67e5\u770b\u6162\u67e5\u8be2<\/span><br \/>\n<span class=\"token keyword\">SELECT<\/span> <span class=\"token operator\">*<\/span> <span class=\"token keyword\">FROM<\/span> pg_stat_activity<br \/>\n<span class=\"token keyword\">WHERE<\/span> state <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#039;active&#039;<\/span><br \/>\n<span class=\"token operator\">AND<\/span> query_start <span class=\"token operator\">&lt;<\/span> <span class=\"token function\">NOW<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span> <span class=\"token keyword\">INTERVAL<\/span> <span class=\"token string\">&#039;5 minutes&#039;<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<h4>5.3 \u7d22\u5f15\u7ef4\u62a4<\/h4>\n<p><span class=\"token comment\">&#8212; \u67e5\u770b\u7d22\u5f15\u4f7f\u7528\u60c5\u51b5<\/span><br \/>\n<span class=\"token keyword\">SELECT<\/span><br \/>\n    indexrelname<span class=\"token punctuation\">,<\/span><br \/>\n    idx_scan<span class=\"token punctuation\">,<\/span><br \/>\n    idx_tup_read<span class=\"token punctuation\">,<\/span><br \/>\n    idx_tup_fetch<br \/>\n<span class=\"token keyword\">FROM<\/span> pg_stat_user_indexes<br \/>\n<span class=\"token keyword\">ORDER<\/span> <span class=\"token keyword\">BY<\/span> idx_scan <span class=\"token keyword\">DESC<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">&#8212; \u67e5\u627e\u672a\u4f7f\u7528\u7684\u7d22\u5f15<\/span><br \/>\n<span class=\"token keyword\">SELECT<\/span><br \/>\n    schemaname<span class=\"token punctuation\">,<\/span><br \/>\n    tablename<span class=\"token punctuation\">,<\/span><br \/>\n    indexname<span class=\"token punctuation\">,<\/span><br \/>\n    idx_scan<br \/>\n<span class=\"token keyword\">FROM<\/span> pg_stat_user_indexes<br \/>\n<span class=\"token keyword\">WHERE<\/span> idx_scan <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><br \/>\n<span class=\"token operator\">AND<\/span> indexname <span class=\"token operator\">NOT<\/span> <span class=\"token operator\">LIKE<\/span> <span class=\"token string\">&#039;%pkey%&#039;<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">&#8212; \u91cd\u5efa\u7d22\u5f15<\/span><br \/>\nREINDEX <span class=\"token keyword\">INDEX<\/span> idx_users_email<span class=\"token punctuation\">;<\/span><br \/>\nREINDEX <span class=\"token keyword\">TABLE<\/span> users<span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">&#8212; \u5206\u6790\u8868\u7edf\u8ba1<\/span><br \/>\n<span class=\"token keyword\">ANALYZE<\/span> users<span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">&#8212; VACUUM \u6e05\u7406<\/span><br \/>\nVACUUM users<span class=\"token punctuation\">;<\/span><br \/>\nVACUUM <span class=\"token keyword\">FULL<\/span> users<span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">&#8212; \u5b8c\u5168\u6e05\u7406&#xff08;\u4f1a\u9501\u8868&#xff09;<\/span><\/p>\n<hr \/>\n<h3>6. \u4f01\u4e1a\u7ea7\u90e8\u7f72\u4e0e\u7ef4\u62a4<\/h3>\n<h4>6.1 \u5907\u4efd\u4e0e\u6062\u590d<\/h4>\n<p><span class=\"token comment\"># \u903b\u8f91\u5907\u4efd<\/span><br \/>\npg_dump <span class=\"token parameter variable\">-U<\/span> postgres <span class=\"token parameter variable\">-d<\/span> my_database <span class=\"token parameter variable\">-f<\/span> backup.sql<\/p>\n<p><span class=\"token comment\"># \u5907\u4efd\u7279\u5b9a\u8868<\/span><br \/>\npg_dump <span class=\"token parameter variable\">-U<\/span> postgres <span class=\"token parameter variable\">-d<\/span> my_database <span class=\"token parameter variable\">-t<\/span> <span class=\"token function\">users<\/span> <span class=\"token parameter variable\">-t<\/span> orders <span class=\"token parameter variable\">-f<\/span> tables_backup.sql<\/p>\n<p><span class=\"token comment\"># \u81ea\u5b9a\u4e49\u683c\u5f0f\u5907\u4efd&#xff08;\u63a8\u8350&#xff0c;\u652f\u6301\u5e76\u884c\u6062\u590d&#xff09;<\/span><br \/>\npg_dump <span class=\"token parameter variable\">-U<\/span> postgres <span class=\"token parameter variable\">-d<\/span> my_database <span class=\"token parameter variable\">-Fc<\/span> <span class=\"token parameter variable\">-f<\/span> backup.dump<\/p>\n<p><span class=\"token comment\"># \u5e76\u884c\u5907\u4efd<\/span><br \/>\npg_dump <span class=\"token parameter variable\">-U<\/span> postgres <span class=\"token parameter variable\">-d<\/span> my_database <span class=\"token parameter variable\">-j<\/span> <span class=\"token number\">4<\/span> <span class=\"token parameter variable\">-Fc<\/span> <span class=\"token parameter variable\">-f<\/span> backup.dump<\/p>\n<p><span class=\"token comment\"># \u5168\u5e93\u5907\u4efd&#xff08;\u5305\u542b\u6240\u6709\u6570\u636e\u5e93&#xff09;<\/span><br \/>\npg_dumpall <span class=\"token parameter variable\">-U<\/span> postgres <span class=\"token parameter variable\">-f<\/span> all_databases.sql<\/p>\n<p><span class=\"token comment\"># \u6062\u590d\u5907\u4efd<\/span><br \/>\npg_restore <span class=\"token parameter variable\">-U<\/span> postgres <span class=\"token parameter variable\">-d<\/span> my_database <span class=\"token parameter variable\">-Fc<\/span> backup.dump<\/p>\n<p><span class=\"token comment\"># \u5e76\u884c\u6062\u590d<\/span><br \/>\npg_restore <span class=\"token parameter variable\">-U<\/span> postgres <span class=\"token parameter variable\">-d<\/span> my_database <span class=\"token parameter variable\">-j<\/span> <span class=\"token number\">4<\/span> <span class=\"token parameter variable\">-Fc<\/span> backup.dump<\/p>\n<h5>\u5b9a\u65f6\u5907\u4efd\u811a\u672c<\/h5>\n<p><span class=\"token shebang important\">#!\/bin\/bash<\/span><br \/>\n<span class=\"token comment\"># backup.sh<\/span><\/p>\n<p><span class=\"token assign-left variable\">BACKUP_DIR<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;\/backups\/postgresql&#034;<\/span><br \/>\n<span class=\"token assign-left variable\">DATE<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token variable\"><span class=\"token variable\">$(<\/span><span class=\"token function\">date<\/span> &#043;%Y%m%d_%H%M%S<span class=\"token variable\">)<\/span><\/span><br \/>\n<span class=\"token assign-left variable\">BACKUP_FILE<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;<span class=\"token variable\">$BACKUP_DIR<\/span>\/backup_<span class=\"token variable\">$DATE<\/span>.dump&#034;<\/span><\/p>\n<p><span class=\"token comment\"># \u521b\u5efa\u5907\u4efd\u76ee\u5f55<\/span><br \/>\n<span class=\"token function\">mkdir<\/span> <span class=\"token parameter variable\">-p<\/span> <span class=\"token variable\">$BACKUP_DIR<\/span><\/p>\n<p><span class=\"token comment\"># \u6267\u884c\u5907\u4efd<\/span><br \/>\npg_dump <span class=\"token parameter variable\">-U<\/span> postgres <span class=\"token parameter variable\">-d<\/span> production_db <span class=\"token parameter variable\">-Fc<\/span> <span class=\"token parameter variable\">-f<\/span> <span class=\"token variable\">$BACKUP_FILE<\/span><\/p>\n<p><span class=\"token comment\"># \u5220\u96647\u5929\u524d\u7684\u5907\u4efd<\/span><br \/>\n<span class=\"token function\">find<\/span> <span class=\"token variable\">$BACKUP_DIR<\/span> <span class=\"token parameter variable\">-name<\/span> <span class=\"token string\">&#034;backup_*.dump&#034;<\/span> <span class=\"token parameter variable\">-mtime<\/span> &#043;7 <span class=\"token parameter variable\">-delete<\/span><\/p>\n<p><span class=\"token comment\"># \u8bb0\u5f55\u65e5\u5fd7<\/span><br \/>\n<span class=\"token builtin class-name\">echo<\/span> <span class=\"token string\">&#034;Backup completed: <span class=\"token variable\">$BACKUP_FILE<\/span>&#034;<\/span> <span class=\"token operator\">&gt;&gt;<\/span> \/var\/log\/pg_backup.log<\/p>\n<h4>6.2 \u9ad8\u53ef\u7528\u67b6\u6784<\/h4>\n<h5>\u6d41\u590d\u5236\u914d\u7f6e<\/h5>\n<p># \u4e3b\u5e93\u914d\u7f6e (postgresql.conf)<br \/>\nwal_level &#061; replica<br \/>\nmax_wal_senders &#061; 10<br \/>\nwal_keep_size &#061; 1024<br \/>\nsynchronous_commit &#061; on<\/p>\n<p># \u4e3b\u5e93\u8ba4\u8bc1 (pg_hba.conf)<br \/>\nhost replication replicator 192.168.1.0\/24 scram-sha-256<\/p>\n<p><span class=\"token comment\"># \u4ece\u5e93\u521d\u59cb\u5316<\/span><br \/>\npg_basebackup <span class=\"token parameter variable\">-h<\/span> master_host <span class=\"token parameter variable\">-U<\/span> replicator <span class=\"token parameter variable\">-D<\/span> \/var\/lib\/postgresql\/data <span class=\"token parameter variable\">-Fp<\/span> <span class=\"token parameter variable\">-Xs<\/span> <span class=\"token parameter variable\">-P<\/span> <span class=\"token parameter variable\">-R<\/span><\/p>\n<p><span class=\"token comment\"># \u4ece\u5e93\u914d\u7f6e (postgresql.auto.conf)<\/span><br \/>\nprimary_conninfo <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#039;host&#061;master_host port&#061;5432 user&#061;replicator password&#061;xxx&#039;<\/span><\/p>\n<h5>\u903b\u8f91\u590d\u5236<\/h5>\n<p><span class=\"token comment\">&#8212; \u4e3b\u5e93&#xff1a;\u521b\u5efa\u53d1\u5e03<\/span><br \/>\n<span class=\"token keyword\">ALTER<\/span> SYSTEM <span class=\"token keyword\">SET<\/span> wal_level <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#039;logical&#039;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">CREATE<\/span> PUBLICATION my_publication <span class=\"token keyword\">FOR<\/span> <span class=\"token keyword\">TABLE<\/span> users<span class=\"token punctuation\">,<\/span> orders<span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">&#8212; \u4ece\u5e93&#xff1a;\u521b\u5efa\u8ba2\u9605<\/span><br \/>\n<span class=\"token keyword\">CREATE<\/span> SUBSCRIPTION my_subscription<br \/>\nCONNECTION <span class=\"token string\">&#039;host&#061;master_host dbname&#061;my_database user&#061;replicator password&#061;xxx&#039;<\/span><br \/>\nPUBLICATION my_publication<span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">&#8212; \u67e5\u770b\u8ba2\u9605\u72b6\u6001<\/span><br \/>\n<span class=\"token keyword\">SELECT<\/span> <span class=\"token operator\">*<\/span> <span class=\"token keyword\">FROM<\/span> pg_stat_subscription<span class=\"token punctuation\">;<\/span><\/p>\n<h4>6.3 \u76d1\u63a7\u4e0e\u544a\u8b66<\/h4>\n<h5>\u76d1\u63a7\u67e5\u8be2<\/h5>\n<p><span class=\"token comment\">&#8212; \u8fde\u63a5\u6570\u76d1\u63a7<\/span><br \/>\n<span class=\"token keyword\">SELECT<\/span><br \/>\n    state<span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token function\">COUNT<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">*<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">as<\/span> count<br \/>\n<span class=\"token keyword\">FROM<\/span> pg_stat_activity<br \/>\n<span class=\"token keyword\">GROUP<\/span> <span class=\"token keyword\">BY<\/span> state<span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">&#8212; \u957f\u4e8b\u52a1\u68c0\u6d4b<\/span><br \/>\n<span class=\"token keyword\">SELECT<\/span><br \/>\n    pid<span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token function\">now<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span> pg_stat_activity<span class=\"token punctuation\">.<\/span>query_start <span class=\"token keyword\">AS<\/span> duration<span class=\"token punctuation\">,<\/span><br \/>\n    query<span class=\"token punctuation\">,<\/span><br \/>\n    state<br \/>\n<span class=\"token keyword\">FROM<\/span> pg_stat_activity<br \/>\n<span class=\"token keyword\">WHERE<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token function\">now<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span> pg_stat_activity<span class=\"token punctuation\">.<\/span>query_start<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&gt;<\/span> <span class=\"token keyword\">interval<\/span> <span class=\"token string\">&#039;5 minutes&#039;<\/span><br \/>\n<span class=\"token operator\">AND<\/span> state <span class=\"token operator\">!&#061;<\/span> <span class=\"token string\">&#039;idle&#039;<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">&#8212; \u8868\u7a7a\u95f4\u4f7f\u7528<\/span><br \/>\n<span class=\"token keyword\">SELECT<\/span><br \/>\n    schemaname<span class=\"token punctuation\">,<\/span><br \/>\n    tablename<span class=\"token punctuation\">,<\/span><br \/>\n    pg_size_pretty<span class=\"token punctuation\">(<\/span>pg_total_relation_size<span class=\"token punctuation\">(<\/span>schemaname<span class=\"token operator\">||<\/span><span class=\"token string\">&#039;.&#039;<\/span><span class=\"token operator\">||<\/span>tablename<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">AS<\/span> size<br \/>\n<span class=\"token keyword\">FROM<\/span> pg_tables<br \/>\n<span class=\"token keyword\">ORDER<\/span> <span class=\"token keyword\">BY<\/span> pg_total_relation_size<span class=\"token punctuation\">(<\/span>schemaname<span class=\"token operator\">||<\/span><span class=\"token string\">&#039;.&#039;<\/span><span class=\"token operator\">||<\/span>tablename<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">DESC<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">&#8212; \u6570\u636e\u5e93\u5927\u5c0f<\/span><br \/>\n<span class=\"token keyword\">SELECT<\/span><br \/>\n    datname<span class=\"token punctuation\">,<\/span><br \/>\n    pg_size_pretty<span class=\"token punctuation\">(<\/span>pg_database_size<span class=\"token punctuation\">(<\/span>datname<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">as<\/span> size<br \/>\n<span class=\"token keyword\">FROM<\/span> pg_database<br \/>\n<span class=\"token keyword\">ORDER<\/span> <span class=\"token keyword\">BY<\/span> pg_database_size<span class=\"token punctuation\">(<\/span>datname<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">DESC<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">&#8212; \u9501\u76d1\u63a7<\/span><br \/>\n<span class=\"token keyword\">SELECT<\/span><br \/>\n    l<span class=\"token punctuation\">.<\/span>pid<span class=\"token punctuation\">,<\/span><br \/>\n    l<span class=\"token punctuation\">.<\/span><span class=\"token keyword\">mode<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    l<span class=\"token punctuation\">.<\/span>granted<span class=\"token punctuation\">,<\/span><br \/>\n    a<span class=\"token punctuation\">.<\/span>query<br \/>\n<span class=\"token keyword\">FROM<\/span> pg_locks l<br \/>\n<span class=\"token keyword\">JOIN<\/span> pg_stat_activity a <span class=\"token keyword\">ON<\/span> l<span class=\"token punctuation\">.<\/span>pid <span class=\"token operator\">&#061;<\/span> a<span class=\"token punctuation\">.<\/span>pid<br \/>\n<span class=\"token keyword\">WHERE<\/span> <span class=\"token operator\">NOT<\/span> l<span class=\"token punctuation\">.<\/span>granted<span class=\"token punctuation\">;<\/span><\/p>\n<h5>Prometheus &#043; Grafana \u76d1\u63a7<\/h5>\n<p><span class=\"token comment\"># docker-compose.yml<\/span><br \/>\n<span class=\"token key atrule\">version<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#039;3.8&#039;<\/span><br \/>\n<span class=\"token key atrule\">services<\/span><span class=\"token punctuation\">:<\/span><br \/>\n  <span class=\"token key atrule\">postgres<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token key atrule\">image<\/span><span class=\"token punctuation\">:<\/span> postgres<span class=\"token punctuation\">:<\/span><span class=\"token number\">15<\/span><br \/>\n    <span class=\"token key atrule\">environment<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token key atrule\">POSTGRES_PASSWORD<\/span><span class=\"token punctuation\">:<\/span> secure_password<br \/>\n    <span class=\"token key atrule\">ports<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> <span class=\"token string\">&#034;5432:5432&#034;<\/span><br \/>\n    <span class=\"token key atrule\">volumes<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> pgdata<span class=\"token punctuation\">:<\/span>\/var\/lib\/postgresql\/data<\/p>\n<p>  <span class=\"token key atrule\">postgres_exporter<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token key atrule\">image<\/span><span class=\"token punctuation\">:<\/span> prometheuscommunity\/postgres<span class=\"token punctuation\">&#8211;<\/span>exporter<br \/>\n    <span class=\"token key atrule\">environment<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token key atrule\">DATA_SOURCE_NAME<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;postgresql:\/\/postgres:secure_password&#064;postgres:5432\/postgres?sslmode&#061;disable&#034;<\/span><br \/>\n    <span class=\"token key atrule\">ports<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> <span class=\"token string\">&#034;9187:9187&#034;<\/span><br \/>\n    <span class=\"token key atrule\">depends_on<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> postgres<\/p>\n<p>  <span class=\"token key atrule\">prometheus<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token key atrule\">image<\/span><span class=\"token punctuation\">:<\/span> prom\/prometheus<br \/>\n    <span class=\"token key atrule\">volumes<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> .\/prometheus.yml<span class=\"token punctuation\">:<\/span>\/etc\/prometheus\/prometheus.yml<br \/>\n    <span class=\"token key atrule\">ports<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> <span class=\"token string\">&#034;9090:9090&#034;<\/span><\/p>\n<p>  <span class=\"token key atrule\">grafana<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token key atrule\">image<\/span><span class=\"token punctuation\">:<\/span> grafana\/grafana<br \/>\n    <span class=\"token key atrule\">ports<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> <span class=\"token string\">&#034;3000:3000&#034;<\/span><br \/>\n    <span class=\"token key atrule\">environment<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> GF_SECURITY_ADMIN_PASSWORD&#061;admin<\/p>\n<p><span class=\"token key atrule\">volumes<\/span><span class=\"token punctuation\">:<\/span><br \/>\n  <span class=\"token key atrule\">pgdata<\/span><span class=\"token punctuation\">:<\/span><\/p>\n<h4>6.4 \u5b89\u5168\u914d\u7f6e<\/h4>\n<p><span class=\"token comment\">&#8212; \u521b\u5efa\u53ea\u8bfb\u7528\u6237<\/span><br \/>\n<span class=\"token keyword\">CREATE<\/span> ROLE readonly_role<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">GRANT<\/span> <span class=\"token keyword\">CONNECT<\/span> <span class=\"token keyword\">ON<\/span> <span class=\"token keyword\">DATABASE<\/span> my_database <span class=\"token keyword\">TO<\/span> readonly_role<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">GRANT<\/span> <span class=\"token keyword\">USAGE<\/span> <span class=\"token keyword\">ON<\/span> <span class=\"token keyword\">SCHEMA<\/span> <span class=\"token keyword\">public<\/span> <span class=\"token keyword\">TO<\/span> readonly_role<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">GRANT<\/span> <span class=\"token keyword\">SELECT<\/span> <span class=\"token keyword\">ON<\/span> <span class=\"token keyword\">ALL<\/span> <span class=\"token keyword\">TABLES<\/span> <span class=\"token operator\">IN<\/span> <span class=\"token keyword\">SCHEMA<\/span> <span class=\"token keyword\">public<\/span> <span class=\"token keyword\">TO<\/span> readonly_role<span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token keyword\">CREATE<\/span> <span class=\"token keyword\">USER<\/span> readonly_user <span class=\"token keyword\">WITH<\/span> PASSWORD <span class=\"token string\">&#039;secure_password&#039;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">GRANT<\/span> readonly_role <span class=\"token keyword\">TO<\/span> readonly_user<span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">&#8212; \u521b\u5efa\u8bfb\u5199\u7528\u6237<\/span><br \/>\n<span class=\"token keyword\">CREATE<\/span> ROLE readwrite_role<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">GRANT<\/span> <span class=\"token keyword\">CONNECT<\/span> <span class=\"token keyword\">ON<\/span> <span class=\"token keyword\">DATABASE<\/span> my_database <span class=\"token keyword\">TO<\/span> readwrite_role<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">GRANT<\/span> <span class=\"token keyword\">USAGE<\/span> <span class=\"token keyword\">ON<\/span> <span class=\"token keyword\">SCHEMA<\/span> <span class=\"token keyword\">public<\/span> <span class=\"token keyword\">TO<\/span> readwrite_role<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">GRANT<\/span> <span class=\"token keyword\">SELECT<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">INSERT<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">UPDATE<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">DELETE<\/span> <span class=\"token keyword\">ON<\/span> <span class=\"token keyword\">ALL<\/span> <span class=\"token keyword\">TABLES<\/span> <span class=\"token operator\">IN<\/span> <span class=\"token keyword\">SCHEMA<\/span> <span class=\"token keyword\">public<\/span> <span class=\"token keyword\">TO<\/span> readwrite_role<span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token keyword\">CREATE<\/span> <span class=\"token keyword\">USER<\/span> readwrite_user <span class=\"token keyword\">WITH<\/span> PASSWORD <span class=\"token string\">&#039;secure_password&#039;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">GRANT<\/span> readwrite_role <span class=\"token keyword\">TO<\/span> readwrite_user<span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">&#8212; \u884c\u7ea7\u5b89\u5168\u7b56\u7565<\/span><br \/>\n<span class=\"token keyword\">ALTER<\/span> <span class=\"token keyword\">TABLE<\/span> orders <span class=\"token keyword\">ENABLE<\/span> <span class=\"token keyword\">ROW<\/span> <span class=\"token keyword\">LEVEL<\/span> SECURITY<span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token keyword\">CREATE<\/span> POLICY user_orders <span class=\"token keyword\">ON<\/span> orders<br \/>\n<span class=\"token keyword\">FOR<\/span> <span class=\"token keyword\">ALL<\/span><br \/>\n<span class=\"token keyword\">USING<\/span> <span class=\"token punctuation\">(<\/span>user_id <span class=\"token operator\">&#061;<\/span> current_setting<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#039;app.current_user_id&#039;<\/span><span class=\"token punctuation\">)<\/span>::<span class=\"token keyword\">integer<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">&#8212; \u542f\u7528 SSL<\/span><br \/>\n<span class=\"token comment\">&#8212; postgresql.conf<\/span><br \/>\nssl <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">on<\/span><br \/>\nssl_cert_file <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#039;\/path\/to\/server.crt&#039;<\/span><br \/>\nssl_key_file <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#039;\/path\/to\/server.key&#039;<\/span><\/p>\n<hr \/>\n<h3>7. \u6700\u4f73\u5b9e\u8df5<\/h3>\n<h4>7.1 \u5f00\u53d1\u89c4\u8303<\/h4>\n<h5>\u547d\u540d\u89c4\u8303<\/h5>\n<p><span class=\"token comment\">&#8212; \u8868\u540d&#xff1a;\u5c0f\u5199 &#043; \u4e0b\u5212\u7ebf&#xff0c;\u590d\u6570\u5f62\u5f0f<\/span><br \/>\n<span class=\"token keyword\">CREATE<\/span> <span class=\"token keyword\">TABLE<\/span> users <span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">CREATE<\/span> <span class=\"token keyword\">TABLE<\/span> order_items <span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">&#8212; \u5217\u540d&#xff1a;\u5c0f\u5199 &#043; \u4e0b\u5212\u7ebf<\/span><br \/>\n<span class=\"token keyword\">CREATE<\/span> <span class=\"token keyword\">TABLE<\/span> users <span class=\"token punctuation\">(<\/span><br \/>\n    user_id <span class=\"token keyword\">SERIAL<\/span> <span class=\"token keyword\">PRIMARY<\/span> <span class=\"token keyword\">KEY<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    username <span class=\"token keyword\">VARCHAR<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">50<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    created_at <span class=\"token keyword\">TIMESTAMP<\/span><br \/>\n<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">&#8212; \u7d22\u5f15\u540d&#xff1a;idx_\u8868\u540d_\u5217\u540d<\/span><br \/>\n<span class=\"token keyword\">CREATE<\/span> <span class=\"token keyword\">INDEX<\/span> idx_users_email <span class=\"token keyword\">ON<\/span> users<span class=\"token punctuation\">(<\/span>email<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">CREATE<\/span> <span class=\"token keyword\">INDEX<\/span> idx_orders_user_id <span class=\"token keyword\">ON<\/span> orders<span class=\"token punctuation\">(<\/span>user_id<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">&#8212; \u5916\u952e\u540d&#xff1a;fk_\u8868\u540d_\u5f15\u7528\u8868\u540d<\/span><br \/>\n<span class=\"token keyword\">ALTER<\/span> <span class=\"token keyword\">TABLE<\/span> orders <span class=\"token keyword\">ADD<\/span> <span class=\"token keyword\">CONSTRAINT<\/span> fk_orders_users<br \/>\n<span class=\"token keyword\">FOREIGN<\/span> <span class=\"token keyword\">KEY<\/span> <span class=\"token punctuation\">(<\/span>user_id<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">REFERENCES<\/span> users<span class=\"token punctuation\">(<\/span>id<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">&#8212; \u68c0\u67e5\u7ea6\u675f\u540d&#xff1a;chk_\u8868\u540d_\u6761\u4ef6<\/span><br \/>\n<span class=\"token keyword\">ALTER<\/span> <span class=\"token keyword\">TABLE<\/span> orders <span class=\"token keyword\">ADD<\/span> <span class=\"token keyword\">CONSTRAINT<\/span> chk_orders_quantity<br \/>\n<span class=\"token keyword\">CHECK<\/span> <span class=\"token punctuation\">(<\/span>quantity <span class=\"token operator\">&gt;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<h5>\u7c7b\u578b\u9009\u62e9<\/h5>\n<p><span class=\"token comment\">&#8212; \u4f18\u5148\u4f7f\u7528 SERIAL \u6216 GENERATED ALWAYS AS IDENTITY<\/span><br \/>\n<span class=\"token keyword\">CREATE<\/span> <span class=\"token keyword\">TABLE<\/span> users <span class=\"token punctuation\">(<\/span><br \/>\n    id GENERATED ALWAYS <span class=\"token keyword\">AS<\/span> <span class=\"token keyword\">IDENTITY<\/span> <span class=\"token keyword\">PRIMARY<\/span> <span class=\"token keyword\">KEY<\/span><span class=\"token punctuation\">,<\/span>  <span class=\"token comment\">&#8212; \u63a8\u8350<\/span><br \/>\n    <span class=\"token comment\">&#8212; \u6216 id SERIAL PRIMARY KEY<\/span><br \/>\n    username <span class=\"token keyword\">VARCHAR<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">50<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">NOT<\/span> <span class=\"token boolean\">NULL<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    email <span class=\"token keyword\">VARCHAR<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">255<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">NOT<\/span> <span class=\"token boolean\">NULL<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    is_active <span class=\"token keyword\">BOOLEAN<\/span> <span class=\"token keyword\">DEFAULT<\/span> <span class=\"token boolean\">TRUE<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    price <span class=\"token keyword\">DECIMAL<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">10<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">2<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span>  <span class=\"token comment\">&#8212; \u91d1\u989d\u4f7f\u7528 DECIMAL<\/span><br \/>\n    created_at TIMESTAMPTZ <span class=\"token keyword\">DEFAULT<\/span> <span class=\"token function\">NOW<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token keyword\">data<\/span> JSONB  <span class=\"token comment\">&#8212; \u7075\u6d3b\u6570\u636e\u4f7f\u7528 JSONB<\/span><br \/>\n<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<h4>7.2 \u6027\u80fd\u6700\u4f73\u5b9e\u8df5<\/h4>\n<p><span class=\"token comment\">&#8212; 1. \u5408\u7406\u4f7f\u7528\u7d22\u5f15<\/span><br \/>\n<span class=\"token comment\">&#8212; \u4e3a WHERE\u3001JOIN\u3001ORDER BY \u7684\u5217\u521b\u5efa\u7d22\u5f15<\/span><br \/>\n<span class=\"token comment\">&#8212; \u907f\u514d\u8fc7\u5ea6\u7d22\u5f15&#xff0c;\u5f71\u54cd\u5199\u5165\u6027\u80fd<\/span><\/p>\n<p><span class=\"token comment\">&#8212; 2. \u6279\u91cf\u64cd\u4f5c<\/span><br \/>\n<span class=\"token comment\">&#8212; \u4f7f\u7528 COPY \u547d\u4ee4\u6279\u91cf\u5bfc\u5165<\/span><br \/>\n<span class=\"token comment\">&#8212; \u4f7f\u7528 INSERT &#8230; VALUES (&#8230;), (&#8230;), &#8230; \u6279\u91cf\u63d2\u5165<\/span><\/p>\n<p><span class=\"token comment\">&#8212; 3. \u5206\u9875\u4f18\u5316<\/span><br \/>\n<span class=\"token comment\">&#8212; \u4f7f\u7528\u6e38\u6807\u6216 keyset \u5206\u9875\u4ee3\u66ff OFFSET<\/span><br \/>\n<span class=\"token keyword\">SELECT<\/span> <span class=\"token operator\">*<\/span> <span class=\"token keyword\">FROM<\/span> orders<br \/>\n<span class=\"token keyword\">WHERE<\/span> id <span class=\"token operator\">&gt;<\/span> last_id<br \/>\n<span class=\"token keyword\">ORDER<\/span> <span class=\"token keyword\">BY<\/span> id<br \/>\n<span class=\"token keyword\">LIMIT<\/span> <span class=\"token number\">100<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">&#8212; 4. \u907f\u514d\u9501\u7ade\u4e89<\/span><br \/>\n<span class=\"token comment\">&#8212; \u4f7f\u7528 SKIP LOCKED \u5904\u7406\u961f\u5217<\/span><br \/>\n<span class=\"token keyword\">SELECT<\/span> <span class=\"token operator\">*<\/span> <span class=\"token keyword\">FROM<\/span> job_queue<br \/>\n<span class=\"token keyword\">WHERE<\/span> <span class=\"token keyword\">status<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#039;pending&#039;<\/span><br \/>\n<span class=\"token keyword\">ORDER<\/span> <span class=\"token keyword\">BY<\/span> created_at<br \/>\n<span class=\"token keyword\">LIMIT<\/span> <span class=\"token number\">1<\/span><br \/>\n<span class=\"token keyword\">FOR<\/span> <span class=\"token keyword\">UPDATE<\/span> SKIP LOCKED<span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">&#8212; 5. \u4f7f\u7528\u8fde\u63a5\u6c60<\/span><br \/>\n<span class=\"token comment\">&#8212; \u63a8\u8350\u4f7f\u7528 PgBouncer \u6216\u5e94\u7528\u5c42\u8fde\u63a5\u6c60<\/span><\/p>\n<h4>7.3 \u8fd0\u7ef4\u6700\u4f73\u5b9e\u8df5<\/h4>\n<p><span class=\"token comment\"># 1. \u5b9a\u671f\u7ef4\u62a4<\/span><br \/>\n<span class=\"token comment\"># \u6bcf\u5468\u6267\u884c VACUUM ANALYZE<\/span><br \/>\nvacuumdb <span class=\"token parameter variable\">&#8211;all<\/span> <span class=\"token parameter variable\">&#8211;analyze<\/span><\/p>\n<p><span class=\"token comment\"># 2. \u76d1\u63a7\u78c1\u76d8\u7a7a\u95f4<\/span><br \/>\n<span class=\"token function\">df<\/span> <span class=\"token parameter variable\">-h<\/span><br \/>\nSELECT pg_size_pretty<span class=\"token punctuation\">(<\/span>pg_database_size<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#039;my_database&#039;<\/span><span class=\"token punctuation\">))<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\"># 3. \u68c0\u67e5\u590d\u5236\u5ef6\u8fdf<\/span><br \/>\nSELECT<br \/>\n    client_addr,<br \/>\n    state,<br \/>\n    sent_lsn,<br \/>\n    write_lsn,<br \/>\n    replay_lag<br \/>\nFROM pg_stat_replication<span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\"># 4. \u65e5\u5fd7\u7ba1\u7406<\/span><br \/>\n<span class=\"token comment\"># postgresql.conf<\/span><br \/>\nlog_destination <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#039;stderr&#039;<\/span><br \/>\nlogging_collector <span class=\"token operator\">&#061;<\/span> on<br \/>\nlog_directory <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#039;pg_log&#039;<\/span><br \/>\nlog_filename <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#039;postgresql-%Y-%m-%d.log&#039;<\/span><br \/>\nlog_rotation_age <span class=\"token operator\">&#061;<\/span> 1d<br \/>\nlog_rotation_size <span class=\"token operator\">&#061;<\/span> 100MB<\/p>\n","protected":false},"excerpt":{"rendered":"<p>PostgreSQL \u4ece\u96f6\u5230\u4f01\u4e1a\u7ea7\u5b8c\u5168\u6307\u5357 &#x1f4da; \u672c\u6587\u6863\u6db5\u76d6 PostgreSQL \u6570\u636e\u5e93\u4ece\u5165\u95e8\u57fa\u7840\u5230\u4f01\u4e1a\u7ea7\u5e94\u7528\u7684\u5b8c\u6574\u77e5\u8bc6\u4f53\u7cfb &#x1f3af; \u9002\u5408\u5f00\u53d1\u8005\u3001DBA\u3001\u67b6\u6784\u5e08\u7b49\u4e0d\u540c\u89d2\u8272\u7684\u5b66\u4e60\u9700\u6c42 &#x1f4d1; \u76ee\u5f55<br \/>\nPostgreSQL \u7b80\u4ecb\u5b89\u88c5\u4e0e\u914d\u7f6e\u57fa\u7840\u64cd\u4f5c\u9ad8\u7ea7\u7279\u6027\u6027\u80fd\u4f18\u5316\u4f01\u4e1a\u7ea7\u90e8\u7f72\u4e0e\u7ef4\u62a4\u6700\u4f73\u5b9e\u8df5 1. PostgreSQL \u7b80\u4ecb<br \/>\n1.1 \u4ec0\u4e48\u662f PostgreSQL<br \/>\nPostgreSQL \u662f\u4e00\u4e2a\u529f\u80fd\u5f3a\u5927\u7684 \u5f00\u6e90\u5bf9\u8c61-\u5173\u7cfb\u6570\u636e\u5e93\u7cfb\u7edf&#xff0c;<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[954,100],"topic":[],"class_list":["post-100761","post","type-post","status-publish","format-standard","hentry","category-server","tag-postgresql","tag-100"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v20.3 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>PostgreSQL \u4ece\u96f6\u5230\u4f01\u4e1a\u7ea7\u5b8c\u5168\u6307\u5357 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.wsisp.com\/helps\/100761.html\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"PostgreSQL \u4ece\u96f6\u5230\u4f01\u4e1a\u7ea7\u5b8c\u5168\u6307\u5357 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\" \/>\n<meta property=\"og:description\" content=\"PostgreSQL \u4ece\u96f6\u5230\u4f01\u4e1a\u7ea7\u5b8c\u5168\u6307\u5357 &#x1f4da; \u672c\u6587\u6863\u6db5\u76d6 PostgreSQL \u6570\u636e\u5e93\u4ece\u5165\u95e8\u57fa\u7840\u5230\u4f01\u4e1a\u7ea7\u5e94\u7528\u7684\u5b8c\u6574\u77e5\u8bc6\u4f53\u7cfb &#x1f3af; \u9002\u5408\u5f00\u53d1\u8005\u3001DBA\u3001\u67b6\u6784\u5e08\u7b49\u4e0d\u540c\u89d2\u8272\u7684\u5b66\u4e60\u9700\u6c42 &#x1f4d1; \u76ee\u5f55 PostgreSQL \u7b80\u4ecb\u5b89\u88c5\u4e0e\u914d\u7f6e\u57fa\u7840\u64cd\u4f5c\u9ad8\u7ea7\u7279\u6027\u6027\u80fd\u4f18\u5316\u4f01\u4e1a\u7ea7\u90e8\u7f72\u4e0e\u7ef4\u62a4\u6700\u4f73\u5b9e\u8df5 1. PostgreSQL \u7b80\u4ecb 1.1 \u4ec0\u4e48\u662f PostgreSQL PostgreSQL \u662f\u4e00\u4e2a\u529f\u80fd\u5f3a\u5927\u7684 \u5f00\u6e90\u5bf9\u8c61-\u5173\u7cfb\u6570\u636e\u5e93\u7cfb\u7edf&#xff0c;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.wsisp.com\/helps\/100761.html\" \/>\n<meta property=\"og:site_name\" content=\"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\" \/>\n<meta property=\"article:published_time\" content=\"2026-09-05T01:16:59+00:00\" \/>\n<meta name=\"author\" content=\"admin\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"admin\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"11 \u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/100761.html\",\"url\":\"https:\/\/www.wsisp.com\/helps\/100761.html\",\"name\":\"PostgreSQL \u4ece\u96f6\u5230\u4f01\u4e1a\u7ea7\u5b8c\u5168\u6307\u5357 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\",\"isPartOf\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/#website\"},\"datePublished\":\"2026-09-05T01:16:59+00:00\",\"dateModified\":\"2026-09-05T01:16:59+00:00\",\"author\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/100761.html#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.wsisp.com\/helps\/100761.html\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/100761.html#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.wsisp.com\/helps\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"PostgreSQL \u4ece\u96f6\u5230\u4f01\u4e1a\u7ea7\u5b8c\u5168\u6307\u5357\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#website\",\"url\":\"https:\/\/www.wsisp.com\/helps\/\",\"name\":\"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\",\"description\":\"\u9999\u6e2f\u670d\u52a1\u5668_\u9999\u6e2f\u4e91\u670d\u52a1\u5668\u8d44\u8baf_\u670d\u52a1\u5668\u5e2e\u52a9\u6587\u6863_\u670d\u52a1\u5668\u6559\u7a0b\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.wsisp.com\/helps\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"zh-Hans\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41\",\"name\":\"admin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery\",\"contentUrl\":\"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery\",\"caption\":\"admin\"},\"sameAs\":[\"http:\/\/wp.wsisp.com\"],\"url\":\"https:\/\/www.wsisp.com\/helps\/author\/admin\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"PostgreSQL \u4ece\u96f6\u5230\u4f01\u4e1a\u7ea7\u5b8c\u5168\u6307\u5357 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.wsisp.com\/helps\/100761.html","og_locale":"zh_CN","og_type":"article","og_title":"PostgreSQL \u4ece\u96f6\u5230\u4f01\u4e1a\u7ea7\u5b8c\u5168\u6307\u5357 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","og_description":"PostgreSQL \u4ece\u96f6\u5230\u4f01\u4e1a\u7ea7\u5b8c\u5168\u6307\u5357 &#x1f4da; \u672c\u6587\u6863\u6db5\u76d6 PostgreSQL \u6570\u636e\u5e93\u4ece\u5165\u95e8\u57fa\u7840\u5230\u4f01\u4e1a\u7ea7\u5e94\u7528\u7684\u5b8c\u6574\u77e5\u8bc6\u4f53\u7cfb &#x1f3af; \u9002\u5408\u5f00\u53d1\u8005\u3001DBA\u3001\u67b6\u6784\u5e08\u7b49\u4e0d\u540c\u89d2\u8272\u7684\u5b66\u4e60\u9700\u6c42 &#x1f4d1; \u76ee\u5f55 PostgreSQL \u7b80\u4ecb\u5b89\u88c5\u4e0e\u914d\u7f6e\u57fa\u7840\u64cd\u4f5c\u9ad8\u7ea7\u7279\u6027\u6027\u80fd\u4f18\u5316\u4f01\u4e1a\u7ea7\u90e8\u7f72\u4e0e\u7ef4\u62a4\u6700\u4f73\u5b9e\u8df5 1. PostgreSQL \u7b80\u4ecb 1.1 \u4ec0\u4e48\u662f PostgreSQL PostgreSQL \u662f\u4e00\u4e2a\u529f\u80fd\u5f3a\u5927\u7684 \u5f00\u6e90\u5bf9\u8c61-\u5173\u7cfb\u6570\u636e\u5e93\u7cfb\u7edf&#xff0c;","og_url":"https:\/\/www.wsisp.com\/helps\/100761.html","og_site_name":"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","article_published_time":"2026-09-05T01:16:59+00:00","author":"admin","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"admin","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"11 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.wsisp.com\/helps\/100761.html","url":"https:\/\/www.wsisp.com\/helps\/100761.html","name":"PostgreSQL \u4ece\u96f6\u5230\u4f01\u4e1a\u7ea7\u5b8c\u5168\u6307\u5357 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","isPartOf":{"@id":"https:\/\/www.wsisp.com\/helps\/#website"},"datePublished":"2026-09-05T01:16:59+00:00","dateModified":"2026-09-05T01:16:59+00:00","author":{"@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41"},"breadcrumb":{"@id":"https:\/\/www.wsisp.com\/helps\/100761.html#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.wsisp.com\/helps\/100761.html"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.wsisp.com\/helps\/100761.html#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.wsisp.com\/helps"},{"@type":"ListItem","position":2,"name":"PostgreSQL \u4ece\u96f6\u5230\u4f01\u4e1a\u7ea7\u5b8c\u5168\u6307\u5357"}]},{"@type":"WebSite","@id":"https:\/\/www.wsisp.com\/helps\/#website","url":"https:\/\/www.wsisp.com\/helps\/","name":"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","description":"\u9999\u6e2f\u670d\u52a1\u5668_\u9999\u6e2f\u4e91\u670d\u52a1\u5668\u8d44\u8baf_\u670d\u52a1\u5668\u5e2e\u52a9\u6587\u6863_\u670d\u52a1\u5668\u6559\u7a0b","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.wsisp.com\/helps\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"zh-Hans"},{"@type":"Person","@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41","name":"admin","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/image\/","url":"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery","contentUrl":"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery","caption":"admin"},"sameAs":["http:\/\/wp.wsisp.com"],"url":"https:\/\/www.wsisp.com\/helps\/author\/admin"}]}},"_links":{"self":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts\/100761","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/comments?post=100761"}],"version-history":[{"count":0,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts\/100761\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/media?parent=100761"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/categories?post=100761"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/tags?post=100761"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/topic?post=100761"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}