You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何DuckDB查询S3/Parquet数据无法保存EXPLAIN ANALYZE分析信息?

DuckDB性能分析文件未生成问题修复

问题诊断

你当前代码依赖SET profiling_output和SET profiling_mode配合EXPLAIN ANALYZE生成性能分析文件但未成功,核心原因可能是:

  • DuckDB对CREATE TABLE AS这类DDL语句的EXPLAIN ANALYZE处理,不会自动触发profiling_output的文件写入
  • 部分版本的DuckDB中,自动输出性能分析结果到文件的逻辑存在兼容性问题

解决方案

改用手动获取性能分析结果并写入文件的方式,替代自动输出配置。修改后的代码如下:

import duckdb
import json
from dotenv import dotenv_values

# 加载环境变量
ENV = dotenv_values(".env")

# 配置参数
TAXI_COLOR = "yellow"
YEAR = 2023
PROFILE = True

dbfile = 'taxi_data.duckdb'
profile_file = 'query_profile.json'

s3_glob_path = f"s3://nyc-tlc/trip data/{TAXI_COLOR}_tripdata_{YEAR}*.parquet"

with duckdb.connect(database=dbfile) as con:
    # 加载S3扩展
    con.execute("INSTALL 'httpfs';")
    con.execute("LOAD 'httpfs';")

    # 设置AWS凭证
    con.execute("SET s3_region='us-east-1';")
    con.execute(f"SET s3_access_key_id = '{ENV['AWS_ACCESS_KEY_ID']}';")  
    con.execute(f"SET s3_secret_access_key = '{ENV['AWS_SECRET_ACCESS_KEY']}';")  

    # 启用性能分析模式
    if PROFILE:
        con.execute("SET profiling_mode='detailed'")

    # 执行查询
    tablename = f'{TAXI_COLOR}_tripdata_{YEAR}'
    ea = "EXPLAIN ANALYZE " if PROFILE else ""
    query = f""" {ea}CREATE OR REPLACE TABLE {tablename} AS
                SELECT * FROM read_parquet(['{s3_glob_path}'])
            """
    print(query)
    con.execute(query)

    # 手动获取并保存性能分析结果
    if PROFILE:
        profile_data = con.profile()
        with open(profile_file, 'w') as f:
            json.dump(profile_data, f, indent=2)

print(f"数据已保存到 {dbfile} 的 {tablename} 表中")
if PROFILE:
    print(f"性能分析结果已保存到 {profile_file}")

额外验证步骤

  • 检查当前工作目录的写入权限,确保程序能创建新文件
  • 确认使用的DuckDB版本≥0.9.0,旧版本对性能分析的支持不完善
  • 生成可视化报告:执行python -m duckdb.query_graph query_profile.json即可生成HTML分析页面

内容的提问来源于stack exchange,提问作者Max Power

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 13:43:10