一、数据库与模式管理

1. CREATE DATABASE — 创建数据库

-- 创建数据库,指定编码和属主
CREATE DATABASE mydb WITH ENCODING 'UTF8' OWNER = uxdb;
-- 使用不同的语言环境创建
CREATE DATABASE music2 LC_COLLATE 'sv_SE.iso885915' LC_CTYPE 'sv_SE.iso885915' 
    ENCODING LATIN9 TEMPLATE template0;

2. DROP DATABASE — 删除数据库

DROP DATABASE mydb;
DROP DATABASE IF EXISTS mydb;  -- 存在则删除,避免报错

3. CREATE SCHEMA — 创建模式

CREATE SCHEMA myschema;
CREATE SCHEMA myschema AUTHORIZATION uxdb;  -- 指定属主

4. DROP SCHEMA — 删除模式

DROP SCHEMA myschema;
DROP SCHEMA myschema CASCADE;  -- 级联删除模式及其所有对象

5. SET SEARCH_PATH — 设置模式搜索路径

SET search_path TO myschema, public;

二、表与存储模型管理

6. CREATE TABLE — 创建标准表

CREATE TABLE products (
    product_no   integer,
    name         text,
    price        numeric,
    created_at   timestamp DEFAULT CURRENT_TIMESTAMP
);

7. DROP TABLE — 删除表

DROP TABLE products;
DROP TABLE IF EXISTS products;  -- 存在则删除
DROP TABLE products CASCADE;    -- 级联删除依赖对象

8. ALTER TABLE — 修改表结构

-- 添加列
ALTER TABLE products ADD COLUMN description text;
-- 删除列
ALTER TABLE products DROP COLUMN description;
-- 修改列数据类型
ALTER TABLE products ALTER COLUMN price TYPE decimal(10,2);
-- 重命名列
ALTER TABLE products RENAME COLUMN price TO unit_price;
-- 重命名表
ALTER TABLE products RENAME TO merchandise;
-- 设置/删除默认值
ALTER TABLE products ALTER COLUMN price SET DEFAULT 0.00;
ALTER TABLE products ALTER COLUMN price DROP DEFAULT;
-- 添加/删除非空约束
ALTER TABLE products ALTER COLUMN name SET NOT NULL;
ALTER TABLE products ALTER COLUMN name DROP NOT NULL;

9. TRUNCATE — 快速清空表

TRUNCATE TABLE products;
TRUNCATE TABLE products CASCADE;  -- 级联清空相关表

10. CREATE TABLE ... PARTITION BY — 创建分区表

-- 创建分区主表(按RANGE范围分区)
CREATE TABLE measurement (
    city_id     int NOT NULL,
    logdate     date NOT NULL,
    peaktemp    int,
    unitsales   int
) PARTITION BY RANGE (logdate);

-- 创建分区(按月)
CREATE TABLE measurement_y2006m02 PARTITION OF measurement
    FOR VALUES FROM ('2006-02-01') TO ('2006-03-01');
CREATE TABLE measurement_y2006m03 PARTITION OF measurement
    FOR VALUES FROM ('2006-03-01') TO ('2006-04-01');

-- 列表分区示例
CREATE TABLE log_par (
    id serial,
    user_id int4,
    create_time timestamp(0) without time zone
) PARTITION BY RANGE(create_time);

-- 创建分区并指定表空间
CREATE TABLE measurement_y2007m12 PARTITION OF measurement
    FOR VALUES FROM ('2007-12-01') TO ('2008-01-01')
    TABLESPACE fasttablespace;

11. CREATE GLOBAL TEMPORARY TABLE — 创建全局临时表

-- 全局临时表(数据在会话期间可见)
CREATE GLOBAL TEMPORARY TABLE temp_orders (
    order_id    NUMBER,
    order_date  DATE,
    amount      NUMBER(10,2)
) ON COMMIT PRESERVE ROWS;  -- 提交事务后保留数据

-- 会话级临时表(默认)
CREATE TEMP TABLE temp_data (
    id int,
    name text
);

12. CREATE TABLE ... WITH (orientation=column) — 创建列存表

-- 创建普通列存表
CREATE TABLE table_name (id int, name text, age int)
    WITH (orientation=column, appendonly=true);

-- 创建带约束的列存表
CREATE TABLE products (
    product_no int,
    name text,
    price numeric CONSTRAINT positive_price CHECK (price > 0)
) WITH (orientation=column, appendonly=true);

-- 创建带压缩的列存表
CREATE TABLE tbl_col_compressed (
    id int, name text, age int
) WITH (
    orientation=column,
    appendonly=true,
    compresstype=zlib,
    compresslevel=5
);
-- compresstype可选zlib或RLE_TYPE,compresslevel: zlib为1~9,RLE_TYPE为1~4

13. COMMENT — 添加注释

COMMENT ON TABLE products IS '产品信息表';
COMMENT ON COLUMN products.price IS '产品单价,单位:元';
COMMENT ON INDEX idx_products_price IS '按价格查询的索引';

三、完整性约束

14. PRIMARY KEY — 主键约束

-- 建表时定义
CREATE TABLE products (product_no integer PRIMARY KEY, name text);
-- 单独添加
ALTER TABLE products ADD PRIMARY KEY (product_no);

15. FOREIGN KEY — 外键约束

-- 建表时定义
CREATE TABLE orders (
    order_id integer PRIMARY KEY,
    product_no integer REFERENCES products(product_no)
);
-- 单独添加(含级联删除)
ALTER TABLE orders ADD CONSTRAINT fk_product
    FOREIGN KEY (product_no) REFERENCES products(product_no) ON DELETE CASCADE;

16. UNIQUE — 唯一约束

ALTER TABLE products ADD CONSTRAINT unique_name UNIQUE (name);

17. CHECK — 检查约束

ALTER TABLE products ADD CONSTRAINT price_positive CHECK (price > 0);

18. DEFAULT — 默认值约束

CREATE TABLE users (
    id serial,
    status text DEFAULT 'active',
    created_at timestamp DEFAULT CURRENT_TIMESTAMP
);

19. ALTER TABLE ... DROP CONSTRAINT — 删除约束

ALTER TABLE products DROP CONSTRAINT unique_name;
ALTER TABLE products DROP CONSTRAINT price_positive;

四、序列与自增列

20. CREATE SEQUENCE — 创建序列

CREATE SEQUENCE product_seq START 1000 INCREMENT 1;
CREATE SEQUENCE order_seq START 1 INCREMENT 1 MINVALUE 1 MAXVALUE 99999;

21. ALTER SEQUENCE / setval() — 修改/设置序列值

ALTER SEQUENCE product_seq RESTART WITH 2000;
SELECT setval('product_seq', 2000);        -- 设置当前值
SELECT setval('product_seq', 2000, true);  -- 设置当前值并立即生效

22. DROP SEQUENCE — 删除序列

DROP SEQUENCE product_seq;
DROP SEQUENCE IF EXISTS product_seq;

五、索引高级管理

23. CREATE INDEX — 创建普通索引

CREATE INDEX idx_products_price ON products (price);

24. CREATE UNIQUE INDEX — 创建唯一索引

CREATE UNIQUE INDEX idx_products_no ON products (product_no);

25. CREATE INDEX CONCURRENTLY — 在线创建索引

-- 不阻塞读写操作,适用于生产环境
CREATE INDEX CONCURRENTLY idx_products_price ON products (price);

26. CREATE INDEX ... ON (function) — 创建函数索引

-- 基于表达式/函数的索引
CREATE INDEX idx_lower_name ON products (LOWER(name));
-- 部分索引(只索引满足条件的行)
CREATE INDEX idx_active_products ON products (price) WHERE status = 'active';

27. DROP INDEX — 删除索引

DROP INDEX idx_products_price;
DROP INDEX IF EXISTS idx_products_price;

28. REINDEX — 重建索引

REINDEX INDEX idx_products_price;   -- 重建单个索引
REINDEX TABLE products;             -- 重建表上所有索引
REINDEX DATABASE mydb;              -- 重建整个数据库的索引

六、视图与物化视图

29. CREATE VIEW — 创建视图

CREATE VIEW cheap_products AS
SELECT product_no, name, price FROM products WHERE price < 10;

30. CREATE OR REPLACE VIEW — 创建或替换视图

CREATE OR REPLACE VIEW cheap_products AS
SELECT product_no, name, price, category FROM products WHERE price < 10;

31. CREATE MATERIALIZED VIEW — 创建物化视图

CREATE MATERIALIZED VIEW product_summary AS
SELECT category, COUNT(*) AS cnt, AVG(price) AS avg_price
FROM products GROUP BY category;

32. REFRESH MATERIALIZED VIEW — 刷新物化视图

REFRESH MATERIALIZED VIEW product_summary;
REFRESH MATERIALIZED VIEW CONCURRENTLY product_summary;  -- 不阻塞查询

33. DROP VIEW — 删除视图

DROP VIEW cheap_products;
DROP VIEW IF EXISTS cheap_products;
DROP MATERIALIZED VIEW product_summary;

七、外部数据集成(异构数据库互联)

34. CREATE SERVER — 创建外部数据服务器

-- 创建连接远程Oracle的外部服务器
CREATE SERVER orcl_server FOREIGN DATA WRAPPER oracle_fdw
    OPTIONS (host '192.168.1.100', port '1521', dbname 'ORCL');

35. CREATE FOREIGN TABLE — 创建外部表

-- 映射远程Oracle数据库中的表
CREATE FOREIGN TABLE remote_products (
    product_no integer,
    name       text,
    price      numeric
) SERVER orcl_server OPTIONS (table_name 'PRODUCTS');
-- 外部表支持SELECT、INSERT、UPDATE、DELETE等操作
-- 创建数据库链接(Oracle兼容语法)
CREATE DATABASE LINK dblink1
    CONNECT TO uxdb IDENTIFIED BY 'password'
    USING 'host=192.168.1.101 port=5432 dbname=otherdb';

-- 通过dblink查询远程表
SELECT * FROM remote_table@dblink1;

-- 通过dblink进行DML操作
INSERT INTO remote_table@dblink1 (id, name) VALUES (1, 'test');
UPDATE remote_table@dblink1 SET name = 'updated' WHERE id = 1;

37. DROP SERVER / FOREIGN TABLE — 删除外部对象

DROP FOREIGN TABLE remote_products;
DROP SERVER orcl_server;
DROP DATABASE LINK dblink1;

八、数据操纵语言 DML

38. INSERT — 插入数据

INSERT INTO products (product_no, name, price) VALUES (1, 'Cheese', 9.99);
-- 多行插入
INSERT INTO products (product_no, name, price) VALUES
    (2, 'Milk', 2.50), (3, 'Bread', 3.20);

39. UPDATE — 更新数据

UPDATE products SET price = 10.99 WHERE product_no = 1;
UPDATE products SET price = price * 1.1 WHERE price < 5;

40. DELETE — 删除数据

DELETE FROM products WHERE product_no = 1;
DELETE FROM products WHERE price < 1;

41. INSERT ... ON CONFLICT — 有则更新无则插入

INSERT INTO products (product_no, name, price)
VALUES (1, 'Cheese', 11.99)
ON CONFLICT (product_no) DO UPDATE SET price = EXCLUDED.price;

42. RETURNING — DML操作后返回数据

INSERT INTO products (product_no, name, price) VALUES (4, 'Butter', 4.50)
    RETURNING *;
UPDATE products SET price = price * 1.1 WHERE price < 5 RETURNING *;
DELETE FROM products WHERE price < 1 RETURNING *;

九、数据查询语言 DQL

43. SELECT — 基础查询

SELECT * FROM products;
SELECT name, price FROM products;
SELECT 1 + 1 AS result;

44. WHERE — 条件过滤

SELECT * FROM products WHERE price > 5;
SELECT * FROM products WHERE price BETWEEN 5 AND 10 AND name LIKE 'C%';

45. ORDER BY — 排序

SELECT * FROM products ORDER BY price DESC;
SELECT * FROM products ORDER BY price DESC, name ASC;

46. SELECT DISTINCT — 去重查询

SELECT DISTINCT name FROM products;
SELECT DISTINCT name, price FROM products;

47. LIMIT / OFFSET — 分页查询

SELECT * FROM products LIMIT 10;                 -- 第一页
SELECT * FROM products OFFSET 5 LIMIT 10;       -- 第二页

48. GROUP BY — 分组聚合

SELECT price, COUNT(*) FROM products GROUP BY price;
SELECT AVG(price), MAX(price), MIN(price) FROM products;

49. HAVING — 分组后条件过滤

SELECT price, COUNT(*) FROM products
GROUP BY price HAVING COUNT(*) > 1;

50. JOIN — 多表连接

-- 内连接
SELECT o.id, c.name FROM orders o
JOIN customers c ON o.customer_id = c.id;
-- 左连接
SELECT c.name, o.id FROM customers c
LEFT JOIN orders o ON c.id = o.customer_id;
-- 自连接
SELECT a.name AS employee, b.name AS manager
FROM employees a LEFT JOIN employees b ON a.manager_id = b.id;

51. 子查询

-- WHERE子查询
SELECT * FROM products WHERE price > (SELECT AVG(price) FROM products);
-- EXISTS子查询
SELECT * FROM products p
WHERE EXISTS (SELECT 1 FROM orders o WHERE o.product_no = p.product_no);
-- IN子查询
SELECT * FROM products WHERE product_no IN (SELECT product_no FROM orders);

52. UNION / INTERSECT / EXCEPT — 集合操作

SELECT name FROM products UNION SELECT name FROM old_products;        -- 合并去重
SELECT name FROM products UNION ALL SELECT name FROM old_products;    -- 保留重复
SELECT product_no FROM products INTERSECT SELECT product_no FROM orders;  -- 交集
SELECT product_no FROM products EXCEPT SELECT product_no FROM discontinued; -- 差集

53. COALESCE / NULLIF — 空值处理

SELECT name, COALESCE(price, 0) AS price FROM products;  -- NULL替换为0
SELECT NULLIF(price, 0) FROM products;  -- price为0时返回NULL

54. LIKE / ILIKE — 模糊匹配

SELECT * FROM products WHERE name LIKE 'Che%';     -- 以Che开头,区分大小写
SELECT * FROM products WHERE name ILIKE 'che%';    -- 以che开头,不区分大小写
SELECT * FROM products WHERE name LIKE '%es%';     -- 包含es

55. 正则表达式

SELECT * FROM products WHERE regexp_like(name, '^[A-Z]');    -- 正则匹配
SELECT regexp_substr(name, '[A-Z][a-z]+') FROM products;     -- 正则提取
SELECT regexp_replace(description, 'old', 'new') FROM products; -- 正则替换

56. CASE — 条件表达式

SELECT name, price,
    CASE
        WHEN price < 5 THEN 'Cheap'
        WHEN price < 20 THEN 'Medium'
        ELSE 'Expensive'
    END AS category
FROM products;

十、高级SQL分析与层次查询

57. 窗口函数

-- 排名函数
SELECT name, price,
    RANK() OVER (ORDER BY price DESC) AS rank,
    DENSE_RANK() OVER (ORDER BY price DESC) AS dense_rank,
    ROW_NUMBER() OVER (ORDER BY price DESC) AS row_num
FROM products;
-- 分区内排名
SELECT name, category, price,
    RANK() OVER (PARTITION BY category ORDER BY price DESC) AS rank_in_category
FROM products;
-- 累计聚合
SELECT name, price,
    SUM(price) OVER (ORDER BY product_no) AS cumulative_sum
FROM products;

58. WITH (CTE) — 公共表表达式

WITH expensive_products AS (
    SELECT * FROM products WHERE price > 100
)
SELECT * FROM expensive_products;

59. WITH RECURSIVE — 递归CTE

-- 递归查询:获取ID=7及其所有父节点
WITH RECURSIVE r AS (
    SELECT * FROM address WHERE id = 7
    UNION ALL
    SELECT address.* FROM address, r WHERE address.id = r.fatherid
)
SELECT * FROM r ORDER BY id;

60. CREATE RECURSIVE VIEW — 创建递归视图

-- 生成1到100的数字序列
CREATE RECURSIVE VIEW public.nums_1_100 (n) AS
    VALUES (1)
    UNION ALL
    SELECT n+1 FROM nums_1_100 WHERE n < 100;

61. CONNECT BY — Oracle风格层次查询

-- UXDB兼容Oracle的CONNECT BY语法
SELECT id, name, fatherid, LEVEL
FROM address
START WITH fatherid = 0
CONNECT BY PRIOR id = fatherid;

62. CAST — 数据类型转换

SELECT CAST(price AS varchar) FROM products;
SELECT price::varchar FROM products;
SELECT '2024-01-01'::date;

63. EXPLAIN — 查看SQL执行计划

EXPLAIN SELECT * FROM products WHERE price > 10;
EXPLAIN (ANALYZE, BUFFERS) SELECT * FROM products WHERE price > 10;

64. ANALYZE — 手动更新表统计信息

ANALYZE products;  -- 更新指定表统计信息
ANALYZE;           -- 更新当前数据库所有表统计信息

十一、全文检索

65. CREATE TEXT SEARCH CONFIGURATION — 创建全文检索配置

-- 安装中文分词扩展
CREATE EXTENSION zhparser;
-- 创建中文检索配置
CREATE TEXT SEARCH CONFIGURATION testzhcfg (PARSER = zhparser);
-- 增加标记映射
ALTER TEXT SEARCH CONFIGURATION testzhcfg
    ADD MAPPING FOR n,v,a,i,e,l WITH simple;

66. CREATE INDEX ... USING GIN — 创建GIN索引

-- 创建分词向量列
ALTER TABLE articles ADD COLUMN tsv_column tsvector;
UPDATE articles SET tsv_column = to_tsvector('testzhcfg', content);
-- 创建GIN索引加速全文检索
CREATE INDEX idx_tsv ON articles USING GIN (tsv_column);

67. @@ (tsquery) — 全文检索匹配

-- 全文检索查询
SELECT * FROM articles t
JOIN articles_ts s ON t.id = s.id
WHERE s.tsv_column @@ to_tsquery('testzhcfg', '搜索关键词');

-- 按相关度排序
SELECT content,
    ts_rank_cd(to_tsvector('testzhcfg', content),
               to_tsquery('testzhcfg', '关键词')) AS rank
FROM articles
ORDER BY rank DESC LIMIT 5;

十二、事务、并发与预备语句

68. BEGIN / COMMIT / ROLLBACK — 事务控制

BEGIN;
UPDATE products SET price = price * 1.1;
COMMIT;   -- 提交事务
-- 或 ROLLBACK;  -- 回滚事务

69. SAVEPOINT — 设置与回滚到保存点

BEGIN;
UPDATE products SET price = 10 WHERE product_no = 1;
SAVEPOINT sp1;
UPDATE products SET price = 20 WHERE product_no = 2;
ROLLBACK TO SAVEPOINT sp1;  -- 回滚到保存点,保留之前的更改
COMMIT;

70. SET TRANSACTION ISOLATION LEVEL — 设置隔离级别

SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

71. LOCK — 显式锁表

LOCK TABLE products IN ACCESS EXCLUSIVE MODE;
LOCK TABLE products IN ROW SHARE MODE;

72. PREPARE / EXECUTE / DEALLOCATE — 预备语句

PREPARE get_product(int) AS SELECT * FROM products WHERE product_no = $1;
EXECUTE get_product(1);
DEALLOCATE get_product;
DEALLOCATE ALL;  -- 释放所有预备语句

十三、PL/SQL 服务器端编程

73. CREATE FUNCTION — 创建自定义函数

-- 基本函数
CREATE FUNCTION add(a integer, b integer) RETURNS integer AS $$
BEGIN
    RETURN a + b;
END;
$$ LANGUAGE plsql;

-- 返回表的函数
CREATE FUNCTION get_products_by_price(min_price numeric)
RETURNS TABLE(product_no integer, name text, price numeric) AS $$
BEGIN
    RETURN QUERY SELECT p.product_no, p.name, p.price
                 FROM products p WHERE p.price >= min_price;
END;
$$ LANGUAGE plsql;

74. CREATE PROCEDURE — 创建存储过程

CREATE PROCEDURE update_prices(percentage numeric) AS $$
BEGIN
    UPDATE products SET price = price * (1 + percentage / 100);
    COMMIT;
END;
$$ LANGUAGE plsql;

75. CREATE TRIGGER — 创建触发器

-- 先创建触发器函数
CREATE FUNCTION log_price_change() RETURNS TRIGGER AS $$
BEGIN
    INSERT INTO price_log (product_no, old_price, new_price, change_time)
    VALUES (OLD.product_no, OLD.price, NEW.price, NOW());
    RETURN NEW;
END;
$$ LANGUAGE plsql;

-- 创建触发器
CREATE TRIGGER trg_price_change
    AFTER UPDATE OF price ON products
    FOR EACH ROW
    EXECUTE FUNCTION log_price_change();

76. DROP FUNCTION / PROCEDURE / TRIGGER — 删除对应对象

DROP FUNCTION add(integer, integer);
DROP PROCEDURE update_prices(numeric);
DROP TRIGGER trg_price_change ON products;

77. CALL — 调用存储过程

CALL update_prices(10.0);

78. RETURNS TABLE — 函数返回结果集

CREATE FUNCTION get_active_products()
RETURNS TABLE(id integer, name text, price numeric) AS $$
BEGIN
    RETURN QUERY SELECT product_no, name, price
                 FROM products WHERE status = 'active';
END;
$$ LANGUAGE plsql;

79. OUT / INOUT 参数 — 定义函数输出参数

CREATE FUNCTION get_product_info(
    IN p_id integer,
    OUT p_name text,
    OUT p_price numeric
) AS $$
BEGIN
    SELECT name, price INTO p_name, p_price
    FROM products WHERE product_no = p_id;
END;
$$ LANGUAGE plsql;

十四、游标

80. DECLARE CURSOR — 声明游标

DECLARE product_cursor CURSOR FOR SELECT * FROM products WHERE price > 10;
-- 带WITH HOLD:事务提交后游标仍可使用
DECLARE product_cursor CURSOR WITH HOLD FOR SELECT * FROM products;

81. FETCH / MOVE — 提取/移动游标数据

FETCH NEXT FROM product_cursor;
FETCH PRIOR FROM product_cursor;
FETCH FIRST 10 FROM product_cursor;
MOVE NEXT FROM product_cursor;  -- 移动游标但不返回数据

82. CLOSE — 关闭游标

CLOSE product_cursor;

十五、安全权限与行级访问控制

83. CREATE ROLE / USER — 创建角色/用户

CREATE USER user1 WITH PASSWORD 'password123';
CREATE ROLE admin WITH LOGIN PASSWORD 'adminpass';

84. ALTER ROLE / USER — 修改用户属性

ALTER USER user1 WITH PASSWORD 'newpassword';
ALTER USER user1 VALID UNTIL '2025-12-31';

85. DROP ROLE / USER — 删除角色/用户

DROP USER user1;
DROP ROLE admin;

86. GRANT — 授予对象权限

GRANT SELECT ON products TO user1;
GRANT INSERT, UPDATE ON products TO user1;
GRANT ALL PRIVILEGES ON products TO user1;
GRANT USAGE ON SCHEMA myschema TO user1;

87. REVOKE — 撤销权限

REVOKE SELECT ON products FROM user1;
REVOKE ALL PRIVILEGES ON products FROM user1;

88. ALTER DEFAULT PRIVILEGES — 修改默认权限

-- 预设:用户user1未来创建的表,自动授予user2查询权限
ALTER DEFAULT PRIVILEGES FOR USER user1 IN SCHEMA public
    GRANT SELECT ON TABLES TO user2;

89. CREATE POLICY — 创建行级安全策略

-- 启用行级安全
ALTER TABLE products ENABLE ROW LEVEL SECURITY;
-- 创建策略:用户只能看到自己部门的产品
CREATE POLICY user_products ON products
    USING (department = current_user);

90. ENABLE ROW LEVEL SECURITY — 启用/禁用行级安全

ALTER TABLE products ENABLE ROW LEVEL SECURITY;
ALTER TABLE products DISABLE ROW LEVEL SECURITY;

十六、数据批量导入导出

91. COPY — 服务端文件导入/导出

-- 从CSV导入
COPY products FROM '/path/to/products.csv' DELIMITER ',' CSV HEADER;
-- 导出到CSV
COPY products TO '/path/to/products.csv' DELIMITER ',' CSV HEADER;
-- 导出查询结果
COPY (SELECT * FROM products WHERE price > 10) TO '/path/to/expensive.csv' CSV;

92. \copy — 客户端本地文件导入/导出

-- psql客户端命令,文件在客户端本地
\copy products TO '/local/path/products.csv' CSV HEADER;
\copy products FROM '/local/path/products.csv' CSV HEADER;

十七、数据库运维与监控

93. VACUUM — 清理死元组

VACUUM products;              -- 清理指定表的死元组
VACUUM ANALYZE products;      -- 清理并更新统计信息
VACUUM FULL products;         -- 完全清理,回收更多空间(会锁表)

94. CHECKPOINT — 强制触发检查点

CHECKPOINT;  -- 将脏页刷入磁盘

95. CLUSTER — 按指定索引重排物理存储

CLUSTER products USING idx_products_price;  -- 按价格索引重排物理存储
CLUSTER products;  -- 使用之前已聚簇过的索引

96. 系统目录查询

-- 查看当前活动连接
SELECT pid, usename, application_name, client_addr, state, query
FROM pg_stat_activity;

-- 查看活跃查询
SELECT pid, usename, query, state, query_start
FROM pg_stat_activity WHERE state = 'active';

-- 查看当前锁
SELECT pid, locktype, relation::regclass, mode, granted
FROM pg_locks WHERE NOT granted;

-- 查看表大小
SELECT pg_size_pretty(pg_total_relation_size('products'));

97. 终止会话

-- 终止指定连接
SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE usename = 'user1';
-- 取消指定查询
SELECT pg_cancel_backend(pid) FROM pg_stat_activity WHERE pid = 12345;

十八、高可用与逻辑复制

98. CREATE PUBLICATION — 创建发布节点

-- 发布指定表
CREATE PUBLICATION my_publication FOR TABLE products, orders;
-- 发布所有表
CREATE PUBLICATION all_tables_publication FOR ALL TABLES;
-- 发布指定表的指定列
CREATE PUBLICATION partial_publication FOR TABLE products (product_no, name);

99. CREATE SUBSCRIPTION — 创建订阅节点

-- 订阅远程发布
CREATE SUBSCRIPTION my_subscription
    CONNECTION 'host=192.168.1.100 port=5432 dbname=mydb user=replication'
    PUBLICATION my_publication;

十九、系统级动态配置

100. ALTER SYSTEM — 修改全局系统配置

-- 修改共享缓冲区大小(部分参数需重启生效)
ALTER SYSTEM SET shared_buffers = '2GB';
-- 修改最大连接数
ALTER SYSTEM SET max_connections = 500;
-- 重新加载配置文件(使部分参数生效)
SELECT pg_reload_conf();
-- 查看当前配置
SHOW shared_buffers;