---
title: 约束与限制
description: "在特性配置前，请先了解OmniRuntime中各特性的使用限制。"
url: https://www.hikunpeng.com/document/detail/zh/kunpengboostkithistory/2300/bds/kunpengbds_omniruntime_20_0009.html
sourcePath: /source/zh/kunpengboostkithistory/2300/bds/kunpengbds_omniruntime_20_0009.html
indexId: e65fcdcf871ec35c6be81f9adacd487ec2f081c59b881447a5fc68fbe1f16bbd78
---
# 约束与限制

在特性配置前，请先了解OmniRuntime中各特性的使用限制。

#### OmniData算子下推约束与限制

- 数值类型进行计算时如果发生越界，OmniData算子下推会抛出数值越界异常。
- 字符串类型比较时，常量必须被英文单引号包含。例如：select * from table where char = '123'。
- 不支持DECIMAL(38,38)数据类型。
- 不支持TIMESTAMP数据类型，走原生计算流程。
- 不支持对事务表的算子下推，走原生计算流程。
- 不支持对分桶表的算子下推，走原生计算流程。
- 必须保证数据表的ANALYZE为最新，否则下推选择率判断不准确。


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

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


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

- 针对Spark引擎，OmniMV物化视图不支持重写或者提取OmniMV物化视图的场景规则如  表1
所示。
- 针对ClickHouse引擎，OmniMV物化视图不支持重写或者提取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。 |


#### OmniShuffle约束与限制

OmniShuffle特性暂不支持公有云场景、多租户场景使用，不支持公网直接对系统访问。


#### OmniAdvisor参数调优约束与限制

- 解析Spark任务日志的时候，需要开启HistoryServer。解析Tez任务日志的时候，需要开启TimelineServer。
- 任务日志里面关于SQL的信息不能做加密处理，否则解析不到SQL相关的信息，不能进行后续的采样调优。
- 运行Spark任务的时候需要在参数列表中添加--name $name来指定任务的名称；运行Hive Tez任务的时候，需要添加--hiveconf hive.session.id=$name来指定Tez任务的名称。一般情况下，任务的名称作为唯一的标识，后续采样的时候，需要指定任务名称来进行参数采样。
- 当前只支持对Spark、Hive Tez引擎的任务日志解析，因此也只支持Spark、Hive Tez引擎的端到端参数调优。
- 当前只支持调优Spark/Tez SQL任务，暂不支持调优Spark APP任务。
- Spark、Hive Tez引擎的参数列表可以在spark_config.xml或者hive_config.xml中配置，但是当前只支持配置int、float和boolean类型的组件参数，系统JVM和OS相关的参数暂不支持。


#### OmniHBaseGSI全局二级索引约束与限制

使用场景限制

- 索引表不支持容灾。
- 索引数据不支持滚动升级。
- 禁止直接对索引表和索引元数据表执行DISABLE、DROP、MODIFY和TRUNCATE操作。
- 索引DDL操作支持修改索引状态、删除索引、创建索引；不支持修改索引定义，如需修改，请先删除后重新创建。
- 需要保证HBase各个节点系统时间同步。
- 在数据写入过程中不保证数据表和索引表数据实时同步，但是返回客户端写入成功后数据表和索引表数据可见。

索引创建约束

- 索引名需要符合正则要求，不支持其他字符。正则要求支持的字符为：[a-zA-Z_0-9-.]。
- 数据表必须存在，要创建的索引表名不能被占用。
- 索引表不支持多版本。不支持在多版本（VERSION>1）的数据表上创建索引，且索引表的版本VERSION=1。
- 不建议为单个数据表创建过多索引，索引数量过多会造成存储成本较高，写入耗时大。因此建议单个数据表的索引个数不超过5个。如果需创建超过5个索引，请新增配置参数“hbase.gsi.max.index.count.per.table”，设置值大于“5”，并重启HBase使配置生效。

- 索引名长度不能超过18个字符。不建议使用过长的索引名。

- 不支持为索引表创建索引。不支持嵌套创建多个索引，索引表仅用于加速查询，不承担数据表功能。
- 不支持创建可以被已有索引覆盖的索引。
  新建索引时，如果之前已存在的索引能够完全覆盖新建的索引（即创建的索引是已有索引的前序子集），则无法创建此索引，重复功能的索引会造成存储浪费。例如，以下操作将无法创建索引2，但是可以创建索引3。

  创建数据表：create 't1','cf1'

  创建索引1：hbase com.huawei.boostkit.hindex.mapreduce.GlobalTableIndexer -Dtablename.to.index='t1' -Dindexspecs.to.add='idx1=>cf1:[q1],[q2]'

  创建索引2：hbase com.huawei.boostkit.hindex.mapreduce.GlobalTableIndexer -Dtablename.to.index='t1' -Dindexspecs.to.add='idx2=>cf1:[q1]'

  创建索引3：hbase com.huawei.boostkit.hindex.mapreduce.GlobalTableIndexer -Dtablename.to.index='t1' -Dindexspecs.to.add='idx3=>cf1:[q2]'

- 不支持在不同数据表上创建同名索引。
- 创建索引时，需要保持RegionServer节点稳定，不能下线节点。
- 数据表有关联索引表正在创建时（处于BUILDING状态），写入数据表请求会失败，应避免在创建索引时写入数据。

索引数据写入约束

- 索引数据生成仅支持Put/Delete接口，使用其他方式（Increment、Append、Bulkload等）写入数据表时不会生成对应索引
- 索引列数据定义为String类型时，要避免写入\x00和\x01两个特殊字符（特殊不可见字符）。
- 向主表中写入覆盖列或索引列数据时，不支持指定时间戳。
- 索引表数据时间戳不继承主表时间戳。

索引查询约束

- 使用索引加速查询时索引的状态必须为ACTIVE。
- 使用索引表加速查询数据表时，仅支持使用SingleColumnValueFilter的scan查询操作，且指定的过滤列需要包括索引列。
- 一次查询最多能命中一个索引，不支持多索引联合查询。

- 查询结果若命中二级索引，结果的排序与直接命中主表不一致。
- 命中二级索引时，SingleColumnValueFilter过滤器有以下限制：过滤任意列时，latestVersionOnly属性默认为true，且不可更改；过滤索引列时，filterIfMissing属性默认为true，且不可更改。
- 使用索引表加速查询数据表时，支持scan操作设置caching、limit、cacheblocks属性；若设置reversed、raw、startRow和stopRow属性，则不会使用索引表加速查询；其他属性设置不生效。
