数据库管理 managing-databases

数据库管理技能专注于指导PostgreSQL、DuckDB、Parquet和PGVector的架构决策,用于设计数据库模式、选择存储策略、优化查询性能、调整维护配置、实施向量搜索,并诊断OLTP、OLAP和相似性搜索工作负载中的性能问题。关键词:数据库管理,PostgreSQL,DuckDB,Parquet,PGVector,架构设计,性能优化,数据工程。

数据工程 0 次安装 0 次浏览 更新于 3/5/2026

名称: 管理数据库 描述: 指导PostgreSQL、DuckDB、Parquet和PGVector的数据库架构决策。用于设计模式、选择存储策略、优化查询、调整维护、配置向量搜索或诊断OLTP、OLAP和相似性搜索工作负载的性能问题。

数据库管理

决策指导PostgreSQL、DuckDB和Parquet在混合存储架构中的应用。

目录

  • 何时使用哪种数据库
  • PostgreSQL快速参考
  • DuckDB快速参考
  • Parquet快速参考
  • PGVector快速参考
  • 跨数据库约定
  • 性能调试检查清单

何时使用哪种数据库

工作负载 使用 为什么
事务性(CRUD、用户、会话) PostgreSQL ACID、行级锁、索引
分析性(聚合、扫描) DuckDB 列式、向量化、并行
数据存储/交换 Parquet 压缩、列式、便携
元数据 + 关系 PostgreSQL 外键、约束
临时探索 DuckDB 在Parquet上快速,无需ETL
时间序列点查找 PostgreSQL + 分区 分区修剪 + 索引
时间序列分析 DuckDB on Parquet 扫描性能
向量相似性搜索 PostgreSQL + PGVector HNSW/IVFFlat索引、混合搜索
RAG / 语义搜索 PostgreSQL + PGVector 嵌入 + 元数据在同一DB中

混合模式示例:

  • PostgreSQL: 事务数据、关系、用户(元数据)
  • DuckDB + Parquet: 分析内容、聚合、时间序列

PostgreSQL快速参考

用于: 元数据、关系、OLTP工作负载、任何需要ACID的情况。

关键决策:

  • 分区表大于100M行或有保留要求
  • 索引WHERE/JOIN子句中的列,不是所有列
  • 为高变动表调整autovacuum

参见 references/postgres-architecture.md 维护模式。 参见 references/postgres-querying.md 高级查询技术。

DuckDB快速参考

用于: 分析、聚合、Parquet查询、数据探索。

关键决策:

  • 优先使用Parquet文件而非CSV(10-100倍更快)
  • 让DuckDB自动并行化;不要微观优化
  • 对于远程数据,增加线程数超过CPU核心数

参见 references/duckdb-architecture.md 存储和并行。 参见 references/duckdb-querying.md DuckDB特定SQL功能。

Parquet快速参考

用于: 存储分析数据、数据交换、列式压缩。

关键决策:

  • 目标文件大小128MB-1GB
  • 按低到中等基数列分区(日期、区域)
  • 按用于筛选的列排序以更好修剪

参见 references/parquet-architecture.md 文件设计。 参见 references/parquet-querying.md 查询优化。

PGVector快速参考

用于: 相似性搜索、RAG应用、语义搜索、推荐。

关键决策:

  • HNSW用于低延迟、高召回(默认选择)
  • IVFFlat用于内存受限或批量更新数据
  • 使用迭代扫描进行筛选查询
  • 考虑混合搜索(向量 + 关键词)以提高8-15%准确率

参见 references/pgvector-architecture.md 索引配置。 参见 references/pgvector-querying.md 混合搜索和筛选。

跨数据库约定

命名

约定 示例 适用于
蛇形表名 dataset_jobs 所有
蛇形列名 created_at 所有
单数表名 datasetdatasets PostgreSQL
复数集合 datasets/ 目录 Parquet文件

规范化决策

模式 何时规范化 何时反规范化
查找表 PostgreSQL,频繁更改 DuckDB/Parquet,静态数据
重复值 PostgreSQL,存储重要 Parquet,压缩处理它
查询时连接 PostgreSQL,复杂关系 Parquet,为分析预连接

时间戳

  • 始终存储为UTC
  • PostgreSQL: TIMESTAMPTZ
  • Parquet: TIMESTAMP with isAdjustedToUTC=true
  • DuckDB: 正确读取两者

性能调试检查清单

PostgreSQL慢查询

  1. 运行 EXPLAIN (ANALYZE, BUFFERS) 在查询上
  2. 检查大表上的顺序扫描
  3. 验证筛选/连接列上存在索引
  4. 检查 pg_stat_user_tables 膨胀(死元组)
  5. 如果看到磁盘排序,审查 work_mem

DuckDB慢查询

  1. 检查是否读取CSV而非Parquet
  2. 验证没有对远程数据做 SELECT *
  3. 检查线程数匹配工作负载
  4. 寻找不必要的类型转换

Parquet慢读取

  1. 验证谓词下推工作(检查查询计划)
  2. 检查文件大小(太小=开销,太大=无并行)
  3. 确认数据按筛选列排序
  4. 寻找高基数分区键(太多小文件)

PGVector慢搜索

  1. 验证索引存在并使用(EXPLAIN)
  2. 检查 ef_search (HNSW) 或 probes (IVFFlat) 设置
  3. 为筛选查询启用迭代扫描
  4. 检查IVFFlat召回是否降级(如果大量更新,重建索引)
  5. 考虑常用筛选的部分索引