如何通过Redshift Data API程序化获取查询的总扫描数据指标?
获取Redshift查询的「总扫描数据」指标(非内部表查询方式)
目前Redshift Data API的DescribeStatement接口确实不直接返回「总扫描数据」,但可以通过以下两种程序化方式获取:
方式一:利用CloudWatch Metrics API
Redshift会将查询的扫描数据量作为指标推送到CloudWatch,你可以通过CloudWatch的GetMetricData API获取:
- 指标命名空间:
AWS/Redshift - 指标名称:
TotalScanBytes - 维度:需指定
ClusterIdentifier(集群ID)和QueryId(查询ID)
调用示例(Python):
import boto3 import datetime cloudwatch = boto3.client('cloudwatch') response = cloudwatch.get_metric_data( MetricDataQueries=[ { 'Id': 'scan_bytes', 'MetricStat': { 'Metric': { 'Namespace': 'AWS/Redshift', 'MetricName': 'TotalScanBytes', 'Dimensions': [ {'Name': 'ClusterIdentifier', 'Value': 'your-cluster-id'}, {'Name': 'QueryId', 'Value': 'your-query-id'} ] }, 'Period': 300, 'Stat': 'Sum' }, 'ReturnData': True } ], StartTime=datetime.datetime.utcnow() - datetime.timedelta(minutes=10), EndTime=datetime.datetime.utcnow() )
注意:需确保Lambda角色拥有cloudwatch:GetMetricData权限,且查询完成后指标会有1-5分钟的延迟。
方式二:使用Redshift Data API的GetQueryExecution接口
通过redshift-data客户端的GetQueryExecution接口,部分场景下会返回包含TotalScanBytes的QueryExecutionStatistics字段。
调用示例(Python):
import boto3 redshift_data = boto3.client('redshift-data') response = redshift_data.get_query_execution( QueryId='your-query-id' ) total_scan_bytes = response['QueryExecutionStatistics'].get('TotalScanBytes')
注意:该字段的返回依赖查询类型和Redshift版本,只读查询(如SELECT)通常会返回,DDL/DML可能不返回。
关键注意点
- 两种方式都需要先通过
DescribeStatement获取查询ID(Id字段) - CloudWatch方式覆盖所有查询类型,但延迟较高;GetQueryExecution方式更实时,但有场景限制
- 确保Lambda执行角色拥有对应API的调用权限
内容的提问来源于stack exchange,提问作者CustardBun
相关产品推荐
相关产品推荐

