名称: 管理数据库 描述: 指导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 |
所有 |
| 单数表名 | dataset 非 datasets |
PostgreSQL |
| 复数集合 | datasets/ 目录 |
Parquet文件 |
规范化决策
| 模式 | 何时规范化 | 何时反规范化 |
|---|---|---|
| 查找表 | PostgreSQL,频繁更改 | DuckDB/Parquet,静态数据 |
| 重复值 | PostgreSQL,存储重要 | Parquet,压缩处理它 |
| 查询时连接 | PostgreSQL,复杂关系 | Parquet,为分析预连接 |
时间戳
- 始终存储为UTC
- PostgreSQL:
TIMESTAMPTZ - Parquet:
TIMESTAMPwithisAdjustedToUTC=true - DuckDB: 正确读取两者
性能调试检查清单
PostgreSQL慢查询
- 运行
EXPLAIN (ANALYZE, BUFFERS)在查询上 - 检查大表上的顺序扫描
- 验证筛选/连接列上存在索引
- 检查
pg_stat_user_tables膨胀(死元组) - 如果看到磁盘排序,审查
work_mem
DuckDB慢查询
- 检查是否读取CSV而非Parquet
- 验证没有对远程数据做
SELECT * - 检查线程数匹配工作负载
- 寻找不必要的类型转换
Parquet慢读取
- 验证谓词下推工作(检查查询计划)
- 检查文件大小(太小=开销,太大=无并行)
- 确认数据按筛选列排序
- 寻找高基数分区键(太多小文件)
PGVector慢搜索
- 验证索引存在并使用(EXPLAIN)
- 检查
ef_search(HNSW) 或probes(IVFFlat) 设置 - 为筛选查询启用迭代扫描
- 检查IVFFlat召回是否降级(如果大量更新,重建索引)
- 考虑常用筛选的部分索引