---
title: 约束与限制
description: "1. 当前UDF插件仅支持Simple UDF，用于执行基于Hive UDF框架编写的UDF函数。"
url: https://www.hikunpeng.com/document/detail/zh/kunpengboostkithistory/230RC2/bds/kunpengbds_omniruntime_20_0009.html
sourcePath: /source/zh/kunpengboostkithistory/230RC2/bds/kunpengbds_omniruntime_20_0009.html
indexId: 1e0e06c8b977bccf97655a4dc525fed21b8e34c97d6b8e13f73a4b5ba35211bf80
---
# 约束与限制

#### OmniOperator算子加速约束与限制

1. 当前UDF插件仅支持Simple UDF，用于执行基于Hive UDF框架编写的UDF函数。
2. 当前支持的Decimal数据类型规格包含64位和128位，如若超过128位的表示范围，则会抛出异常或者返回null，可能会产生和引擎原生行为不相同的场景，如SUM、AVG聚合等，若中间结果超出Decimal 128位，引擎原生正常执行，OmniOperator算子加速则根据配置抛出异常或者返回null。这里建议如果字段需要进行AVG运算且存在累加结果过大的可能，请使用Double等其他类型存储。
3. 不同的负载所需内存配置不一样，例如TPC-DS 3TB数据集，SparkExtension推荐配置下，堆外内存配置不低于30GB，99条所有SQL可成功运行，运行过程中日志可能出现MEM_CAP_EXCEEDED但不影响最终功能，建议适当增大堆外内存配置。如果堆外内存配置过低，SQL执行结果可能不正确。


#### OmniMV物化视图不支持重写（或者提取物化视图）的场景规则

针对Spark引擎，OmniMV物化视图不支持重写或者提取物化视图的场景规则如表1所示。

针对ClickHouse引擎，OmniMV物化视图不支持重写或者提取物化视图的场景规则如表2所示


**表1 Spark SQL引擎不支持重写或提取视图的场景规则**

| 场景 | 规则 | 说明 |
| --- | --- | --- |
| 不支持重写 | 基本规则 | 查询需要的数据，视图无法满足，不支持重写。例如：查询：c1>=2，视图：c1>2，不支持重写。 IN、LIKE需要查询和视图条件完全匹配，不满足则不支持重写。例如：查询：in(2,3) ，视图： in(1,2,3)，不支持重写。 查询SQL中已经使用了视图，不支持重写。 |
| 不支持重写 | Join规则 | 只支持Inner\-Join类型的重写，其他类型的Join在大部分场景下不支持重写。例如Outer\-Join类型，只有当查询和视图完全一致时，才可以重写。 通过isValidPlan检查当前匹配的查询和视图的逻辑计划树是否满足最小单元的要求，只包含以下类型算子，不满足则不支持重写。 LogicalRelation HiveTableRelation Project Filter Join SubqueryAlias |
| 不支持重写 | Aggregate规则 | 视图逻辑计划树根节点必须是Aggregate算子。像order by、having的根节点是Sort、Filter，这种视图不支持重写。 查询和视图逻辑计划树匹配，两边根节点都必须是Aggregate算子，然后会通过isValidPlan检查子树是否满足最小单元的要求，不满足则不支持重写。 查询中出现了视图中不存在的聚合函数，不支持重写。 查询group by字段是视图group by字段的子集，只支持对以下聚合函数（不带distinct，min/max除外）rollUp，不满足则不支持重写。 sum min max count |
| 不支持提取视图 | 查询逻辑过于单一或者过于复杂 | 不支持从单表查询中提取物化视图。 查询中如果出现了多层嵌套子查询，只支持从最内层子查询中提取视图，而不支持从外层子查询提取物化视图。 不支持从含有临时表的子查询中提取物化视图。 |


**表2 ClickHouse引擎不支持重写或者提取视图的场景规则**

| 场景 | 规则 | 说明 |
| --- | --- | --- |
| 不支持重写 | 引擎定义的规则 | Where必须是PROJECTION定义中GROUP BY的子集。 GROUP BY必须是PROJECTION定义中GROUP BY的子集。 SELECT必须是PROJECTION定义中SELECT的子集。 匹配多个PROJECTION的时候，选取读取part最少的。 返回的数据行小于基表总数。 查询覆盖的分区part超过一半。 |
| 不支持提取视图 | 查询逻辑过于单一或者过于复杂 | 可以创建Projection的子查询必须是对单表的查询，即其FROM子句中只有一个表，且必须有group by子句，其余场景暂不支持提取Projection。 |
