
# Python UDF性能调优
Aura支持统计运行时的关键性能指标，根据性能指标，用户可以调整UDF运行时的资源规格和并行度。
#### UDF性能监控
使用explain performance可以打印UDF Actor运行的性能指标。如[图1]所示，统计了函数calculate_0311在每个DN所对应的UDF Actor的性能情况。下文以图中三行性能数据为例进行说明。
图1Python UDF Actor的性能指标统计   
![](https://support.huaweicloud.com/sqlref-aura-aidatalake/zh-cn_image_0000002671415210.png "点击放大")
- executor0000_es_group (UdfName:calculate_0311 time=10907.3 rows=152 loops=1 cpu=1.0U memory=4.0GB timeout=1000s)中：
  - executor0_es_group指的是DN ID。
  
  - UdfName表示执行UDF的名称。
  
  - time描述该UDF总运行时间。
  
  - rows表示在该DN上处理的数据量。
  
  - loops表示调用UDF的次数。
  
  - cpu表示该UDF执行时actor所申请的cpu大小，单位为U。
  
  - memory表示该UDF执行时actor所申请的memory大小，单位为GB。
  
  - timeout表示该UDF执行时actor单次batch的最大执行时长，单位为秒。超时则会报错。
   
- executor0000_es_group \[actor 0\](Summary: rows=152 bytes=42.11MB rtt=10804.3 execute=2041.0 setup=4003.0 send=4686.0 wait=1725.9 get=15.8 invoke=4748.0 close=1.8 terminate=1.9 serialize=63.1 deserialize=60.4) 描述的是第0个UDF Actor的信息，具体如下：
  - rows表示该actor上处理的数据量。
  
  - bytes表示该actor处理的数据量大小。
  
  - rtt表示内核发送数据到actor，以及actor接收处理数据的端到端时间。
  
  - execute表示该actor实际计算的有效时间。
  
  - setup表示该actor在初始化后，准备环境和装载udf代码的时间。
  
  - send表示从内核发送数据到该actor的时间。
  
  - wait表示内核等待actor返回数据的等待时间。
  
  - get表示内核获取actor数据成功获取数据的时间。
  
  - invoke表示拉起actor的时间。
  
  - close表示该actor关闭计算的时间。
  
  - terminate表示数据系统下线actor的耗时。
  
  - serialize表示对数据序列化的时间。
  
  - deserialize表示对数据反序列化的时间。
   
- executor0000_es_group \[actor 0\](Details: ip=10.42.0.103 rows=\[152, 152\] bytes=\[42.11MB, 42.11MB\] rtt=\[10804.3, 10804.3\] send=\[4686.0, 4686.0\] recv=\[49.0, 49.0\])统计信息中：
  - ip表示actor所在的ip地址。
  
  - rows表示actor执行的所有batch中最小行数和最大行数。
  
  - bytes表示actor执行的所有batch中数据大小最小值和最大值。
  
  - rtt表示actor执行的所有batch中端到端执行时间的最小值和最大值。
  
  - send表示actor执行的所有batch中从内核发送数据到该actor的最小值和最大值。
  
  - recv表示actor执行的所有batch中从python发送数据到内核接收的最小值和最大值。
   
如下图所示，Query Summary中统计了该查询中所有UDF Actor的汇总信息。
Actor total count表示当前query调用的所有actor数量。
图2Python UDF Actor数据流传输信息总览   
![](https://support.huaweicloud.com/sqlref-aura-aidatalake/zh-cn_image_0000002671255356.png "点击放大")
#### UDF下推优化
函数返回值中存在record类型，会导致函数无法下推到DN, 提示: Function xxx can not be shipped because return record。
例如:
```
select jsonb_each(data::jsonb) from table1;
```
如果需要支持下推, 则取消使用返回值为record类型的函数, 改为按需取值。
```
SELECT  data::jsonb ->>'car_model' AS car_model, data::jsonb ->>'color' AS color FROM  table1;
```
