【已解决】SQL报错the depth of the expresion tree is too big, make it less than 600

Viewed 43

Doris2.1.5版本
SQL的where后面条件表达式很多,SQL报错:the depth of the expresion tree is too big, make it less than 600
应该是参数max_depth_of_expr_tree=600影响

问题
1、表达式树深度是指什么?
2、我应该参照什么去调整?
3、where后面一个and或者一个or深度加1吗?

image.png

1 Answers

1、表达式树深度的含义
表达式树深度通常指的是 SQL 查询中条件表达式所形成的逻辑树的深度。例如,一个简单的条件 column1 = value1 的表达式树深度相对较浅。但当有多个复杂的条件组合时,如 ((column1 = value1 AND column2 > value2) OR (column3 < value3 AND column4 = value4)) AND column5 = value5,这个表达式的逻辑结构就会形成一个较深的树状结构,其深度取决于条件的嵌套层数和复杂程度。

2、调整的参考依据
a. 分析查询需求:仔细审查 SQL 查询的业务逻辑,确定是否真的需要如此复杂的条件表达式。有时候可以通过优化业务逻辑或者数据模型来简化查询条件。
b. 数据分布和特征:了解数据的分布情况和特征,看是否可以通过添加合适的索引或者分区策略来减少条件表达式的复杂性。例如,如果某些条件经常一起出现,可以考虑创建复合索引。
c. 性能测试和监控:进行性能测试,观察不同表达式树深度下的查询性能变化。

3、关于 “where 后面一个 and 或者一个 or 深度加 1” 的问题
一般来说,每增加一个逻辑运算符(如 AND、OR)会增加表达式树的复杂度,但不一定严格地使深度加 1。具体的深度增加取决于整个表达式的结构和嵌套情况。如果新添加的条件只是简单地与现有条件并列,可能增加的深度相对较小;但如果是嵌套在复杂的条件中,可能会使深度增加较多。

通常如果报“the depth of the expresion tree is too big”,不建议调整参,而是优化sql,既然跑起来效率可能也不高,需要综合考虑业务需求、数据特征和性能要求,谨慎地调整表达式树深度相关的参数,并不断进行测试和优化,以确保查询的高效性和稳定性。