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

Databricks中Redshift查询性能慢于客户端问题及优化说明

小数据集Redshift-Databricks查询提速方案及问题上报依据

问题背景

相同SQL查询在Redshift客户端DBeaver中仅需约5分钟即可返回800行结果,但通过Databricks的Spark Redshift连接器执行时耗时长达14分钟,流程卡在Waiting for Redshift to unload intermediate data under s3环节,推测瓶颈在于Redshift将查询结果写入S3临时桶的过程。

提速方案及上报依据

1. 优化SQL查询逻辑,消除全表扫描风险

原查询中对hit_time_gmt_ts字段反复调用TO_TIMESTAMP进行过滤,这会导致Redshift无法利用该字段上的索引(若存在),被迫执行全表扫描后再做转换过滤,即使最终结果集很小,底层扫描的数据量也可能极大。

  • 优化后的SQL:
    select 
      to_char(TO_TIMESTAMP(hit_time_gmt_ts, 'DD-Mon-YYYY HH24:MI:SS'),'YYYYMMDD') as hit_time_gmt_dt_key,
      post_visid_combined,
      visit_return_count,
      event_list  
    from cnds.omni_hit_data_cn_v            
    where 
      hit_time_gmt_ts >= TO_CHAR('2024-07-01'::timestamp, 'DD-Mon-YYYY HH24:MI:SS') 
      and hit_time_gmt_ts < TO_CHAR('2025-01-01'::timestamp, 'DD-Mon-YYYY HH24:MI:SS')            
      and post_campaign ~ '(^EM.*_T_.*)((NEWCA)|(NCA)).*'
    
  • 依据:将日期条件转换为hit_time_gmt_ts原生格式过滤,让Redshift可以使用字段索引(若存在),大幅减少扫描数据量,加快查询执行和S3卸载速度。

2. 调整Spark Redshift连接器参数,优化S3卸载流程

  • 开启自动压缩:在Spark读取配置中添加.option("unload_s3_auto_compression", "true"),压缩后可显著降低S3文件大小,减少数据传输与写入耗时。
  • 控制卸载文件规格:添加.option("extracopyoptions", "DELIMITER '|' GZIP")(配合压缩),或通过maxfilesize参数指定单文件大小,避免生成过多小文件或超大文件,提升S3读写效率。
  • 依据:Redshift卸载数据到S3时,压缩能大幅降低IO量;合理的文件大小可减少S3请求次数,提升整体传输效率。

3. 检查S3临时桶的网络与权限配置

  • 确认S3临时桶(RS_tempDir)与Redshift集群处于同一AWS区域(当前Redshift在us-east-1,需确保S3桶也在该区域),跨区域传输会带来显著延迟。
  • 验证Redshift集群的IAM角色是否拥有S3临时桶的完整读写权限,权限不足可能导致隐性重试等待。
  • 依据:AWS跨区域数据传输存在带宽限制与延迟,同区域访问S3速度可提升数倍;权限问题会导致Redshift写入S3时反复重试,拉长等待时间。

4. 小数据集场景改用JDBC直连方式

针对仅800行的小数据集,可绕过Redshift Unload到S3的流程,直接通过JDBC读取结果:

df = (spark.read
  .format("jdbc")
  .option("url", RS_jdbcUrl)
  .option("dbtable", f"({query}) as temp_table")
  .option("user", RS_username)
  .option("password", RS_password)
  .load()
)
  • 依据:Unload到S3的流程专为大数据集批量传输设计,小数据集下JDBC直连可省去S3写入与读取的中间环节,直接缩短整体耗时。

问题上报核心依据

  1. 执行链路差异:DBeaver直接从Redshift拉取结果,而Databricks采用Unload到S3再读取的链路,新增的S3写入环节成为性能瓶颈,该环节效率由Redshift卸载能力、S3配置共同决定。
  2. 原SQL性能缺陷:函数包装过滤字段导致全表扫描,是Redshift执行缓慢进而拖累Databricks流程的根源,即使结果集小,底层扫描的数据量也远超预期。
  3. 连接器配置优化空间:当前使用的Spark Redshift连接器未开启压缩等关键优化参数,导致S3传输效率低下。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 05:13:19