PostgreSQL数据库学习知识点大全(终)

简介: 教程来源 https://app-ac8abncezqpt.appmiaoda.com 系统介绍PostgreSQL监控诊断(活动会话、慢查、锁阻塞、缓存命中率、表膨胀)、自动清理调优、常用扩展(PostGIS/hstore/pgcrypto等)、性能工具(pgBadger/pgbouncer)及PG 16新特性(并行VACUUM、JSON_TABLE、增量排序等),助力高效运维与深度优化。

十一、监控与诊断

11.1 系统视图

-- 查看活动会话
SELECT 
    pid,
    usename,
    application_name,
    client_addr,
    state,
    query,
    query_start,
    state_change,
    wait_event_type,
    wait_event
FROM pg_stat_activity
WHERE state != 'idle';

-- 查看表统计
SELECT 
    schemaname,
    tablename,
    n_live_tup AS live_tuples,
    n_dead_tup AS dead_tuples,
    last_vacuum,
    last_autovacuum,
    last_analyze,
    last_autoanalyze
FROM pg_stat_user_tables
ORDER BY n_dead_tup DESC;

-- 查看索引统计
SELECT 
    schemaname,
    tablename,
    indexname,
    idx_scan,
    idx_tup_read,
    idx_tup_fetch
FROM pg_stat_user_indexes
ORDER BY idx_scan;

-- 查看数据库大小
SELECT 
    datname,
    pg_database_size(datname) AS size_bytes,
    pg_size_pretty(pg_database_size(datname)) AS size_pretty
FROM pg_database
ORDER BY pg_database_size(datname) DESC;

-- 查看表大小
SELECT 
    tablename,
    pg_size_pretty(pg_table_size(tablename)) AS table_size,
    pg_size_pretty(pg_indexes_size(tablename)) AS indexes_size,
    pg_size_pretty(pg_total_relation_size(tablename)) AS total_size
FROM pg_tables
WHERE schemaname = 'public'
ORDER BY pg_total_relation_size(tablename) DESC;

-- 查看WAL信息
SELECT 
    pg_current_wal_lsn(),
    pg_walfile_name(pg_current_wal_lsn());

-- 查看数据库活动
SELECT 
    datname,
    numbackends,
    xact_commit,
    xact_rollback,
    blks_read,
    blks_hit
FROM pg_stat_database;

11.2 性能诊断

-- 查看慢查询
SELECT 
    query,
    calls,
    total_time / 1000 AS total_seconds,
    mean_time / 1000 AS mean_ms,
    max_time / 1000 AS max_ms,
    rows
FROM pg_stat_statements
ORDER BY total_time DESC
LIMIT 20;

-- 启用pg_stat_statements
-- 在postgresql.conf中添加
shared_preload_libraries = 'pg_stat_statements'
pg_stat_statements.track = all

-- 重置统计
SELECT pg_stat_statements_reset();

-- 查看缓存命中率
SELECT 
    datname,
    blks_hit,
    blks_read,
    CASE 
        WHEN blks_hit + blks_read = 0 THEN 0
        ELSE blks_hit * 100.0 / (blks_hit + blks_read)
    END AS cache_hit_ratio
FROM pg_stat_database
WHERE datname NOT IN ('template0', 'template1');

-- 查看表膨胀
SELECT 
    schemaname,
    tablename,
    n_live_tup,
    n_dead_tup,
    ROUND(100.0 * n_dead_tup / NULLIF(n_live_tup + n_dead_tup, 0), 2) AS dead_tuple_ratio
FROM pg_stat_user_tables
WHERE n_dead_tup > 1000
ORDER BY dead_tuple_ratio DESC;

-- 查看阻塞锁
SELECT 
    blocked.pid AS blocked_pid,
    blocked.query AS blocked_query,
    blocking.pid AS blocking_pid,
    blocking.query AS blocking_query
FROM pg_stat_activity blocked
JOIN pg_stat_activity blocking 
    ON blocked.pid = ANY(pg_blocking_pids(blocked.pid))
WHERE blocked.wait_event_type = 'Lock';

11.3 自动清理

-- 查看自动清理配置
SELECT name, setting, unit, short_desc
FROM pg_settings
WHERE name LIKE '%autovacuum%';

-- 调整自动清理参数
ALTER SYSTEM SET autovacuum = on;
ALTER SYSTEM SET autovacuum_naptime = '1min';
ALTER SYSTEM SET autovacuum_vacuum_threshold = 50;
ALTER SYSTEM SET autovacuum_vacuum_scale_factor = 0.2;
ALTER SYSTEM SET autovacuum_analyze_threshold = 50;
ALTER SYSTEM SET autovacuum_analyze_scale_factor = 0.1;
SELECT pg_reload_conf();

-- 手动清理
VACUUM (VERBOSE, ANALYZE) employees;
VACUUM FULL employees;  -- 锁定表,回收空间
ANALYZE employees;

-- 查看清理进度
SELECT 
    pid,
    datname,
    relid::regclass,
    phase,
    heap_blks_total,
    heap_blks_scanned,
    heap_blks_vacuumed,
    index_vacuum_count
FROM pg_stat_progress_vacuum;

十二、扩展与工具

12.1 常用扩展

-- 查看已安装扩展
SELECT * FROM pg_available_extensions;
SELECT * FROM pg_extension;

-- 创建扩展
CREATE EXTENSION IF NOT EXISTS hstore;  -- 键值存储
CREATE EXTENSION IF NOT EXISTS uuid-ossp;  -- UUID生成
CREATE EXTENSION IF NOT EXISTS pgcrypto;  -- 加密函数
CREATE EXTENSION IF NOT EXISTS tablefunc;  -- 交叉表
CREATE EXTENSION IF NOT EXISTS fuzzystrmatch;  -- 模糊匹配
CREATE EXTENSION IF NOT EXISTS citext;  -- 不区分大小写文本
CREATE EXTENSION IF NOT EXISTS ltree;  -- 树形结构
CREATE EXTENSION IF NOT EXISTS cube;  -- 多维立方体
CREATE EXTENSION IF NOT EXISTS earthdistance;  -- 地球距离计算

-- 使用uuid-ossp
SELECT uuid_generate_v4();
SELECT uuid_generate_v1();

-- 使用pgcrypto
SELECT crypt('password', gen_salt('bf'));
SELECT crypt('password', stored_hash) = stored_hash;

-- 使用hstore
CREATE TABLE products_hstore (id SERIAL, attributes HSTORE);
INSERT INTO products_hstore (attributes) VALUES ('"brand"=>"Dell", "ram"=>"16GB"');
SELECT attributes -> 'brand' FROM products_hstore;

-- 使用PostGIS(地理空间)
CREATE EXTENSION postgis;
CREATE TABLE locations (id SERIAL, name TEXT, geom GEOMETRY);
INSERT INTO locations (name, geom) VALUES 
('北京', ST_GeomFromText('POINT(116.4 39.9)', 4326));

SELECT ST_Distance(
    ST_GeomFromText('POINT(116.4 39.9)', 4326),
    ST_GeomFromText('POINT(121.5 31.2)', 4326)
);

12.2 性能调优工具

# pg_stat_statements - SQL统计
# 已在11.1中介绍

# pgBadger - 日志分析
pgbadger /var/log/postgresql/postgresql.log -o report.html

# pg_top - 实时监控
pg_top -d mydb

# pgbouncer - 连接池
# 配置 pgbouncer.ini
[databases]
mydb = host=localhost port=5432 dbname=mydb

[pgbouncer]
listen_port = 6432
listen_addr = 127.0.0.1
auth_type = md5
auth_file = /etc/pgbouncer/userlist.txt
pool_mode = transaction
max_client_conn = 1000
default_pool_size = 20

# pgcluu - 性能报告
pgcluu -d /var/lib/postgresql/16/main -o /tmp/pgcluu_report

# pg_activity - 实时活动监控
pg_activity -U postgres -d mydb

十三、PostgreSQL 16 新特性

13.1 性能改进

-- 并行查询增强
-- 设置并行度
SET max_parallel_workers_per_gather = 4;
SET parallel_setup_cost = 1000;
SET parallel_tuple_cost = 0.1;

-- 增量排序
SET enable_incremental_sort = on;

-- 使用增量排序
EXPLAIN SELECT * FROM employees ORDER BY department_id, salary;

-- 聚合下推
SET enable_partitionwise_aggregate = on;

-- 提高预写日志性能
ALTER SYSTEM SET wal_sync_method = fdatasync;
ALTER SYSTEM SET wal_compression = on;

13.2 SQL/JSON支持

-- JSON_TABLE函数
SELECT *
FROM JSON_TABLE(
    '[{"id": 1, "name": "张三"}, {"id": 2, "name": "李四"}]',
    '$[*]' COLUMNS (
        id INT PATH '$.id',
        name TEXT PATH '$.name'
    )
) AS jt;

-- IS JSON 约束
CREATE TABLE products (
    id SERIAL PRIMARY KEY,
    data JSONB,
    CONSTRAINT data_is_json CHECK (data IS JSON)
);

13.3 其他新特性

-- 并行VACUUM
VACUUM (PARALLEL 4) employees;

-- 逻辑复制性能提升
-- 支持部分复制槽
-- 支持双向复制

-- 系统视图增强
-- pg_stat_io 视图
SELECT * FROM pg_stat_io;

-- pg_stat_subscription_stats
SELECT * FROM pg_stat_subscription_stats;

-- 冻结映射(Freeze Map)
-- 减少VACUUM开销

PostgreSQL的世界充满无限可能,愿本文成为你数据库学习之路上的重要指南。持续学习,深入实践,你一定能成为优秀的PostgreSQL数据库专家!
来源:
https://app-ac8abncezqpt.appmiaoda.com

相关文章
|
3天前
|
人工智能 JSON 机器人
让龙虾成为你的“公众号分身” | 阿里云服务器玩Openclaw
本文带你零成本玩转OpenClaw:学生认证白嫖6个月阿里云服务器,手把手配置飞书机器人、接入免费/高性价比AI模型(NVIDIA/通义),并打造微信公众号“全自动分身”——实时抓热榜、AI选题拆解、一键发布草稿,5分钟完成热点→文章全流程!
10550 52
让龙虾成为你的“公众号分身” | 阿里云服务器玩Openclaw
|
9天前
|
人工智能 JavaScript API
解放双手!OpenClaw Agent Browser全攻略(阿里云+本地部署+免费API+网页自动化场景落地)
“让AI聊聊天、写代码不难,难的是让它自己打开网页、填表单、查数据”——2026年,无数OpenClaw用户被这个痛点困扰。参考文章直击核心:当AI只能“纸上谈兵”,无法实际操控浏览器,就永远成不了真正的“数字员工”。而Agent Browser技能的出现,彻底打破了这一壁垒——它给OpenClaw装上“上网的手和眼睛”,让AI能像真人一样打开网页、点击按钮、填写表单、提取数据,24小时不间断完成网页自动化任务。
2369 5
|
23天前
|
人工智能 JavaScript Ubuntu
5分钟上手龙虾AI!OpenClaw部署(阿里云+本地)+ 免费多模型配置保姆级教程(MiniMax、Claude、阿里云百炼)
OpenClaw(昵称“龙虾AI”)作为2026年热门的开源个人AI助手,由PSPDFKit创始人Peter Steinberger开发,核心优势在于“真正执行任务”——不仅能聊天互动,还能自动处理邮件、管理日程、订机票、写代码等,且所有数据本地处理,隐私完全可控。它支持接入MiniMax、Claude、GPT等多类大模型,兼容微信、Telegram、飞书等主流聊天工具,搭配100+可扩展技能,成为兼顾实用性与隐私性的AI工具首选。
23945 121
|
3天前
|
人工智能 IDE API
2026年国内 Codex 安装教程和使用教程:GPT-5.4 完整指南
Codex已进化为AI编程智能体,不仅能补全代码,更能理解项目、自动重构、执行任务。本文详解国内安装、GPT-5.4接入、cc-switch中转配置及实战开发流程,助你从零掌握“描述需求→AI实现”的新一代工程范式。(239字)
2142 126

热门文章

最新文章