← 中文资源

简体中文版本

用 COPY 快速导出大表为 CSV

使用 COPY TO 通过服务端流式导出大表,比逐行 SELECT 快得多,适合夜间批量导出。

阅读英文原文

目标

夜间导出数百万行耗时数小时,因为脚本逐行取数。本配方改用 COPY 把查询结果直接以 CSV 流式写入文件,仅一次往返即可完成导出,并用表头与行数校验结果,同时处理 NULL 标记与编码,避免下游解析出错。

步骤要点

  1. 用 COPY 将查询结果以 CSV 格式流式输出到文件。
  2. 校验表头与行数是否与预期一致。
  3. 显式设置 NULL 标记以匹配下游预期。
  4. 强制客户端编码为 UTF-8 并验证。
psql -c "COPY (SELECT * FROM orders WHERE created_at >= now() - interval '1 day') \
  TO STDOUT WITH (FORMAT csv, HEADER true)" > orders_today.csv

排错提示

  • COPY 不做任意逐行转换,转换需写在查询里。
  • CSV 无法表达嵌套结构。
  • 大导出仍会占用服务端 I/O。

适用边界

  • 不适用于嵌套数据结构。
  • 仍需考虑服务端 I/O 压力。