Calcite在嵌套多层包含where条件的sql语句时优化器OOM

classic Classic list List threaded Threaded
10 messages Options
Reply | Threaded
Open this post in threaded view
|

Calcite在嵌套多层包含where条件的sql语句时优化器OOM

jun su
hi all,

环境: flink-1.9.2 flink table planner
现象: 代码一直在 VolcanoPlanner.findBestExp()方法中出不来, 直到OOM

  发现在嵌套4层时 findBestExp方法中while(true)会循环3w多次后成功退出, 嵌套5层会达到几十万级别, 导致进程OOM
-----------------------------------------------
代码:

fbTableEnv.registerTableSource("source",orcTableSource)

val select = fbTableEnv.sqlQuery("select
Auth_Roles,Target_UserSid,Thread_ID,access_path,action from source ")

fbTableEnv.registerTable("selectTable",select)

val t1 = fbTableEnv.sqlQuery("select
Auth_Roles,Target_UserSid,Thread_ID,access_path,action from selectTable
where Auth_Roles like 'a%'")
fbTableEnv.registerTable("t1",t1)

val t2 = fbTableEnv.sqlQuery("select
Auth_Roles,Target_UserSid,Thread_ID,access_path,action from t1 where
Target_UserSid= 'b'")
fbTableEnv.registerTable("t2",t2)

val t3 = fbTableEnv.sqlQuery("select
Auth_Roles,Target_UserSid,Thread_ID,access_path,action from t2 where
Thread_ID= 'c'")
fbTableEnv.registerTable("t3",t3)

val t4 = fbTableEnv.sqlQuery("select
Auth_Roles,Target_UserSid,Thread_ID,access_path,action from t3 where
access_path= 'd'")
fbTableEnv.registerTable("t4",t4)

val t5 = fbTableEnv.sqlQuery("select
Auth_Roles,Target_UserSid,Thread_ID,access_path,action from t4 where
action= 'e'")



--
Best,
Jun Su
Reply | Threaded
Open this post in threaded view
|

Re: Calcite在嵌套多层包含where条件的sql语句时优化器OOM

godfrey he
blink planner 有这个问题吗?

jun su <[hidden email]> 于2020年9月22日周二 下午3:27写道:

> hi all,
>
> 环境: flink-1.9.2 flink table planner
> 现象: 代码一直在 VolcanoPlanner.findBestExp()方法中出不来, 直到OOM
>
>   发现在嵌套4层时 findBestExp方法中while(true)会循环3w多次后成功退出, 嵌套5层会达到几十万级别, 导致进程OOM
> -----------------------------------------------
> 代码:
>
> fbTableEnv.registerTableSource("source",orcTableSource)
>
> val select = fbTableEnv.sqlQuery("select
> Auth_Roles,Target_UserSid,Thread_ID,access_path,action from source ")
>
> fbTableEnv.registerTable("selectTable",select)
>
> val t1 = fbTableEnv.sqlQuery("select
> Auth_Roles,Target_UserSid,Thread_ID,access_path,action from selectTable
> where Auth_Roles like 'a%'")
> fbTableEnv.registerTable("t1",t1)
>
> val t2 = fbTableEnv.sqlQuery("select
> Auth_Roles,Target_UserSid,Thread_ID,access_path,action from t1 where
> Target_UserSid= 'b'")
> fbTableEnv.registerTable("t2",t2)
>
> val t3 = fbTableEnv.sqlQuery("select
> Auth_Roles,Target_UserSid,Thread_ID,access_path,action from t2 where
> Thread_ID= 'c'")
> fbTableEnv.registerTable("t3",t3)
>
> val t4 = fbTableEnv.sqlQuery("select
> Auth_Roles,Target_UserSid,Thread_ID,access_path,action from t3 where
> access_path= 'd'")
> fbTableEnv.registerTable("t4",t4)
>
> val t5 = fbTableEnv.sqlQuery("select
> Auth_Roles,Target_UserSid,Thread_ID,access_path,action from t4 where
> action= 'e'")
>
>
>
> --
> Best,
> Jun Su
>
Reply | Threaded
Open this post in threaded view
|

Re: Calcite在嵌套多层包含where条件的sql语句时优化器OOM

jun su
hi godfrey,
    我用了最新代码的blink没这个问题,  我看代码flink是先用hep然后进valcano, 而blink貌似没用hep,
我将hep代码注释后valcano的迭代次数会大幅减少, 语句嵌套10层基本在4000次左右能获取最佳方案,我再debug看下原因

godfrey he <[hidden email]> 于2020年9月22日周二 下午8:58写道:

> blink planner 有这个问题吗?
>
> jun su <[hidden email]> 于2020年9月22日周二 下午3:27写道:
>
> > hi all,
> >
> > 环境: flink-1.9.2 flink table planner
> > 现象: 代码一直在 VolcanoPlanner.findBestExp()方法中出不来, 直到OOM
> >
> >   发现在嵌套4层时 findBestExp方法中while(true)会循环3w多次后成功退出, 嵌套5层会达到几十万级别, 导致进程OOM
> > -----------------------------------------------
> > 代码:
> >
> > fbTableEnv.registerTableSource("source",orcTableSource)
> >
> > val select = fbTableEnv.sqlQuery("select
> > Auth_Roles,Target_UserSid,Thread_ID,access_path,action from source ")
> >
> > fbTableEnv.registerTable("selectTable",select)
> >
> > val t1 = fbTableEnv.sqlQuery("select
> > Auth_Roles,Target_UserSid,Thread_ID,access_path,action from selectTable
> > where Auth_Roles like 'a%'")
> > fbTableEnv.registerTable("t1",t1)
> >
> > val t2 = fbTableEnv.sqlQuery("select
> > Auth_Roles,Target_UserSid,Thread_ID,access_path,action from t1 where
> > Target_UserSid= 'b'")
> > fbTableEnv.registerTable("t2",t2)
> >
> > val t3 = fbTableEnv.sqlQuery("select
> > Auth_Roles,Target_UserSid,Thread_ID,access_path,action from t2 where
> > Thread_ID= 'c'")
> > fbTableEnv.registerTable("t3",t3)
> >
> > val t4 = fbTableEnv.sqlQuery("select
> > Auth_Roles,Target_UserSid,Thread_ID,access_path,action from t3 where
> > access_path= 'd'")
> > fbTableEnv.registerTable("t4",t4)
> >
> > val t5 = fbTableEnv.sqlQuery("select
> > Auth_Roles,Target_UserSid,Thread_ID,access_path,action from t4 where
> > action= 'e'")
> >
> >
> >
> > --
> > Best,
> > Jun Su
> >
>


--
Best,
Jun Su
Reply | Threaded
Open this post in threaded view
|

Re: Calcite在嵌套多层包含where条件的sql语句时优化器OOM

jun su
hi godfrey,

        刚看了下, blink应该也会用hep , 上文说错了

jun su <[hidden email]> 于2020年9月23日周三 上午9:19写道:

> hi godfrey,
>     我用了最新代码的blink没这个问题,  我看代码flink是先用hep然后进valcano, 而blink貌似没用hep,
> 我将hep代码注释后valcano的迭代次数会大幅减少, 语句嵌套10层基本在4000次左右能获取最佳方案,我再debug看下原因
>
> godfrey he <[hidden email]> 于2020年9月22日周二 下午8:58写道:
>
>> blink planner 有这个问题吗?
>>
>> jun su <[hidden email]> 于2020年9月22日周二 下午3:27写道:
>>
>> > hi all,
>> >
>> > 环境: flink-1.9.2 flink table planner
>> > 现象: 代码一直在 VolcanoPlanner.findBestExp()方法中出不来, 直到OOM
>> >
>> >   发现在嵌套4层时 findBestExp方法中while(true)会循环3w多次后成功退出, 嵌套5层会达到几十万级别, 导致进程OOM
>> > -----------------------------------------------
>> > 代码:
>> >
>> > fbTableEnv.registerTableSource("source",orcTableSource)
>> >
>> > val select = fbTableEnv.sqlQuery("select
>> > Auth_Roles,Target_UserSid,Thread_ID,access_path,action from source ")
>> >
>> > fbTableEnv.registerTable("selectTable",select)
>> >
>> > val t1 = fbTableEnv.sqlQuery("select
>> > Auth_Roles,Target_UserSid,Thread_ID,access_path,action from selectTable
>> > where Auth_Roles like 'a%'")
>> > fbTableEnv.registerTable("t1",t1)
>> >
>> > val t2 = fbTableEnv.sqlQuery("select
>> > Auth_Roles,Target_UserSid,Thread_ID,access_path,action from t1 where
>> > Target_UserSid= 'b'")
>> > fbTableEnv.registerTable("t2",t2)
>> >
>> > val t3 = fbTableEnv.sqlQuery("select
>> > Auth_Roles,Target_UserSid,Thread_ID,access_path,action from t2 where
>> > Thread_ID= 'c'")
>> > fbTableEnv.registerTable("t3",t3)
>> >
>> > val t4 = fbTableEnv.sqlQuery("select
>> > Auth_Roles,Target_UserSid,Thread_ID,access_path,action from t3 where
>> > access_path= 'd'")
>> > fbTableEnv.registerTable("t4",t4)
>> >
>> > val t5 = fbTableEnv.sqlQuery("select
>> > Auth_Roles,Target_UserSid,Thread_ID,access_path,action from t4 where
>> > action= 'e'")
>> >
>> >
>> >
>> > --
>> > Best,
>> > Jun Su
>> >
>>
>
>
> --
> Best,
> Jun Su
>


--
Best,
Jun Su
Reply | Threaded
Open this post in threaded view
|

Re: Calcite在嵌套多层包含where条件的sql语句时优化器OOM

godfrey he
Hi Jun,

可能是old planner缺少一些rule导致遇到了corner case,
blink planner之前解过一些类似的案例。

jun su <[hidden email]> 于2020年9月23日周三 上午9:53写道:

> hi godfrey,
>
>         刚看了下, blink应该也会用hep , 上文说错了
>
> jun su <[hidden email]> 于2020年9月23日周三 上午9:19写道:
>
> > hi godfrey,
> >     我用了最新代码的blink没这个问题,  我看代码flink是先用hep然后进valcano, 而blink貌似没用hep,
> > 我将hep代码注释后valcano的迭代次数会大幅减少, 语句嵌套10层基本在4000次左右能获取最佳方案,我再debug看下原因
> >
> > godfrey he <[hidden email]> 于2020年9月22日周二 下午8:58写道:
> >
> >> blink planner 有这个问题吗?
> >>
> >> jun su <[hidden email]> 于2020年9月22日周二 下午3:27写道:
> >>
> >> > hi all,
> >> >
> >> > 环境: flink-1.9.2 flink table planner
> >> > 现象: 代码一直在 VolcanoPlanner.findBestExp()方法中出不来, 直到OOM
> >> >
> >> >   发现在嵌套4层时 findBestExp方法中while(true)会循环3w多次后成功退出, 嵌套5层会达到几十万级别,
> 导致进程OOM
> >> > -----------------------------------------------
> >> > 代码:
> >> >
> >> > fbTableEnv.registerTableSource("source",orcTableSource)
> >> >
> >> > val select = fbTableEnv.sqlQuery("select
> >> > Auth_Roles,Target_UserSid,Thread_ID,access_path,action from source ")
> >> >
> >> > fbTableEnv.registerTable("selectTable",select)
> >> >
> >> > val t1 = fbTableEnv.sqlQuery("select
> >> > Auth_Roles,Target_UserSid,Thread_ID,access_path,action from
> selectTable
> >> > where Auth_Roles like 'a%'")
> >> > fbTableEnv.registerTable("t1",t1)
> >> >
> >> > val t2 = fbTableEnv.sqlQuery("select
> >> > Auth_Roles,Target_UserSid,Thread_ID,access_path,action from t1 where
> >> > Target_UserSid= 'b'")
> >> > fbTableEnv.registerTable("t2",t2)
> >> >
> >> > val t3 = fbTableEnv.sqlQuery("select
> >> > Auth_Roles,Target_UserSid,Thread_ID,access_path,action from t2 where
> >> > Thread_ID= 'c'")
> >> > fbTableEnv.registerTable("t3",t3)
> >> >
> >> > val t4 = fbTableEnv.sqlQuery("select
> >> > Auth_Roles,Target_UserSid,Thread_ID,access_path,action from t3 where
> >> > access_path= 'd'")
> >> > fbTableEnv.registerTable("t4",t4)
> >> >
> >> > val t5 = fbTableEnv.sqlQuery("select
> >> > Auth_Roles,Target_UserSid,Thread_ID,access_path,action from t4 where
> >> > action= 'e'")
> >> >
> >> >
> >> >
> >> > --
> >> > Best,
> >> > Jun Su
> >> >
> >>
> >
> >
> > --
> > Best,
> > Jun Su
> >
>
>
> --
> Best,
> Jun Su
>
Reply | Threaded
Open this post in threaded view
|

Re: Calcite在嵌套多层包含where条件的sql语句时优化器OOM

jun su
hi godfrey,
    方便说下是哪些rule fix了这个问题么? 我对这个比较好奇 , 想看下是什么原因导致的

godfrey he <[hidden email]> 于2020年9月23日周三 上午10:09写道:

> Hi Jun,
>
> 可能是old planner缺少一些rule导致遇到了corner case,
> blink planner之前解过一些类似的案例。
>
> jun su <[hidden email]> 于2020年9月23日周三 上午9:53写道:
>
> > hi godfrey,
> >
> >         刚看了下, blink应该也会用hep , 上文说错了
> >
> > jun su <[hidden email]> 于2020年9月23日周三 上午9:19写道:
> >
> > > hi godfrey,
> > >     我用了最新代码的blink没这个问题,  我看代码flink是先用hep然后进valcano, 而blink貌似没用hep,
> > > 我将hep代码注释后valcano的迭代次数会大幅减少, 语句嵌套10层基本在4000次左右能获取最佳方案,我再debug看下原因
> > >
> > > godfrey he <[hidden email]> 于2020年9月22日周二 下午8:58写道:
> > >
> > >> blink planner 有这个问题吗?
> > >>
> > >> jun su <[hidden email]> 于2020年9月22日周二 下午3:27写道:
> > >>
> > >> > hi all,
> > >> >
> > >> > 环境: flink-1.9.2 flink table planner
> > >> > 现象: 代码一直在 VolcanoPlanner.findBestExp()方法中出不来, 直到OOM
> > >> >
> > >> >   发现在嵌套4层时 findBestExp方法中while(true)会循环3w多次后成功退出, 嵌套5层会达到几十万级别,
> > 导致进程OOM
> > >> > -----------------------------------------------
> > >> > 代码:
> > >> >
> > >> > fbTableEnv.registerTableSource("source",orcTableSource)
> > >> >
> > >> > val select = fbTableEnv.sqlQuery("select
> > >> > Auth_Roles,Target_UserSid,Thread_ID,access_path,action from source
> ")
> > >> >
> > >> > fbTableEnv.registerTable("selectTable",select)
> > >> >
> > >> > val t1 = fbTableEnv.sqlQuery("select
> > >> > Auth_Roles,Target_UserSid,Thread_ID,access_path,action from
> > selectTable
> > >> > where Auth_Roles like 'a%'")
> > >> > fbTableEnv.registerTable("t1",t1)
> > >> >
> > >> > val t2 = fbTableEnv.sqlQuery("select
> > >> > Auth_Roles,Target_UserSid,Thread_ID,access_path,action from t1 where
> > >> > Target_UserSid= 'b'")
> > >> > fbTableEnv.registerTable("t2",t2)
> > >> >
> > >> > val t3 = fbTableEnv.sqlQuery("select
> > >> > Auth_Roles,Target_UserSid,Thread_ID,access_path,action from t2 where
> > >> > Thread_ID= 'c'")
> > >> > fbTableEnv.registerTable("t3",t3)
> > >> >
> > >> > val t4 = fbTableEnv.sqlQuery("select
> > >> > Auth_Roles,Target_UserSid,Thread_ID,access_path,action from t3 where
> > >> > access_path= 'd'")
> > >> > fbTableEnv.registerTable("t4",t4)
> > >> >
> > >> > val t5 = fbTableEnv.sqlQuery("select
> > >> > Auth_Roles,Target_UserSid,Thread_ID,access_path,action from t4 where
> > >> > action= 'e'")
> > >> >
> > >> >
> > >> >
> > >> > --
> > >> > Best,
> > >> > Jun Su
> > >> >
> > >>
> > >
> > >
> > > --
> > > Best,
> > > Jun Su
> > >
> >
> >
> > --
> > Best,
> > Jun Su
> >
>


--
Best,
Jun Su
Reply | Threaded
Open this post in threaded view
|

Re: Calcite在嵌套多层包含where条件的sql语句时优化器OOM

godfrey he
例如 calc merge rule,还有calc,agg等其他相关rule,点比较散。得具体看

jun su <[hidden email]> 于2020年9月23日周三 上午10:22写道:

> hi godfrey,
>     方便说下是哪些rule fix了这个问题么? 我对这个比较好奇 , 想看下是什么原因导致的
>
> godfrey he <[hidden email]> 于2020年9月23日周三 上午10:09写道:
>
> > Hi Jun,
> >
> > 可能是old planner缺少一些rule导致遇到了corner case,
> > blink planner之前解过一些类似的案例。
> >
> > jun su <[hidden email]> 于2020年9月23日周三 上午9:53写道:
> >
> > > hi godfrey,
> > >
> > >         刚看了下, blink应该也会用hep , 上文说错了
> > >
> > > jun su <[hidden email]> 于2020年9月23日周三 上午9:19写道:
> > >
> > > > hi godfrey,
> > > >     我用了最新代码的blink没这个问题,  我看代码flink是先用hep然后进valcano, 而blink貌似没用hep,
> > > > 我将hep代码注释后valcano的迭代次数会大幅减少, 语句嵌套10层基本在4000次左右能获取最佳方案,我再debug看下原因
> > > >
> > > > godfrey he <[hidden email]> 于2020年9月22日周二 下午8:58写道:
> > > >
> > > >> blink planner 有这个问题吗?
> > > >>
> > > >> jun su <[hidden email]> 于2020年9月22日周二 下午3:27写道:
> > > >>
> > > >> > hi all,
> > > >> >
> > > >> > 环境: flink-1.9.2 flink table planner
> > > >> > 现象: 代码一直在 VolcanoPlanner.findBestExp()方法中出不来, 直到OOM
> > > >> >
> > > >> >   发现在嵌套4层时 findBestExp方法中while(true)会循环3w多次后成功退出, 嵌套5层会达到几十万级别,
> > > 导致进程OOM
> > > >> > -----------------------------------------------
> > > >> > 代码:
> > > >> >
> > > >> > fbTableEnv.registerTableSource("source",orcTableSource)
> > > >> >
> > > >> > val select = fbTableEnv.sqlQuery("select
> > > >> > Auth_Roles,Target_UserSid,Thread_ID,access_path,action from source
> > ")
> > > >> >
> > > >> > fbTableEnv.registerTable("selectTable",select)
> > > >> >
> > > >> > val t1 = fbTableEnv.sqlQuery("select
> > > >> > Auth_Roles,Target_UserSid,Thread_ID,access_path,action from
> > > selectTable
> > > >> > where Auth_Roles like 'a%'")
> > > >> > fbTableEnv.registerTable("t1",t1)
> > > >> >
> > > >> > val t2 = fbTableEnv.sqlQuery("select
> > > >> > Auth_Roles,Target_UserSid,Thread_ID,access_path,action from t1
> where
> > > >> > Target_UserSid= 'b'")
> > > >> > fbTableEnv.registerTable("t2",t2)
> > > >> >
> > > >> > val t3 = fbTableEnv.sqlQuery("select
> > > >> > Auth_Roles,Target_UserSid,Thread_ID,access_path,action from t2
> where
> > > >> > Thread_ID= 'c'")
> > > >> > fbTableEnv.registerTable("t3",t3)
> > > >> >
> > > >> > val t4 = fbTableEnv.sqlQuery("select
> > > >> > Auth_Roles,Target_UserSid,Thread_ID,access_path,action from t3
> where
> > > >> > access_path= 'd'")
> > > >> > fbTableEnv.registerTable("t4",t4)
> > > >> >
> > > >> > val t5 = fbTableEnv.sqlQuery("select
> > > >> > Auth_Roles,Target_UserSid,Thread_ID,access_path,action from t4
> where
> > > >> > action= 'e'")
> > > >> >
> > > >> >
> > > >> >
> > > >> > --
> > > >> > Best,
> > > >> > Jun Su
> > > >> >
> > > >>
> > > >
> > > >
> > > > --
> > > > Best,
> > > > Jun Su
> > > >
> > >
> > >
> > > --
> > > Best,
> > > Jun Su
> > >
> >
>
>
> --
> Best,
> Jun Su
>
Reply | Threaded
Open this post in threaded view
|

Re: Calcite在嵌套多层包含where条件的sql语句时优化器OOM

Danny Chan
In reply to this post by jun su
应该是碰到节点 cycle 引用了,导致优化 rule 一直重复重复触发,可以将 debug 日志打开,看下是哪个 rule 被频繁触发了,之前修过一个类似的问题[1],可以参考下

[1] https://issues.apache.org/jira/browse/CALCITE-3121

Best,
Danny Chan
在 2020年9月23日 +0800 AM10:23,jun su <[hidden email]>,写道:

> hi godfrey,
> 方便说下是哪些rule fix了这个问题么? 我对这个比较好奇 , 想看下是什么原因导致的
>
> godfrey he <[hidden email]> 于2020年9月23日周三 上午10:09写道:
>
> > Hi Jun,
> >
> > 可能是old planner缺少一些rule导致遇到了corner case,
> > blink planner之前解过一些类似的案例。
> >
> > jun su <[hidden email]> 于2020年9月23日周三 上午9:53写道:
> >
> > > hi godfrey,
> > >
> > > 刚看了下, blink应该也会用hep , 上文说错了
> > >
> > > jun su <[hidden email]> 于2020年9月23日周三 上午9:19写道:
> > >
> > > > hi godfrey,
> > > > 我用了最新代码的blink没这个问题, 我看代码flink是先用hep然后进valcano, 而blink貌似没用hep,
> > > > 我将hep代码注释后valcano的迭代次数会大幅减少, 语句嵌套10层基本在4000次左右能获取最佳方案,我再debug看下原因
> > > >
> > > > godfrey he <[hidden email]> 于2020年9月22日周二 下午8:58写道:
> > > >
> > > > > blink planner 有这个问题吗?
> > > > >
> > > > > jun su <[hidden email]> 于2020年9月22日周二 下午3:27写道:
> > > > >
> > > > > > hi all,
> > > > > >
> > > > > > 环境: flink-1.9.2 flink table planner
> > > > > > 现象: 代码一直在 VolcanoPlanner.findBestExp()方法中出不来, 直到OOM
> > > > > >
> > > > > > 发现在嵌套4层时 findBestExp方法中while(true)会循环3w多次后成功退出, 嵌套5层会达到几十万级别,
> > > 导致进程OOM
> > > > > > -----------------------------------------------
> > > > > > 代码:
> > > > > >
> > > > > > fbTableEnv.registerTableSource("source",orcTableSource)
> > > > > >
> > > > > > val select = fbTableEnv.sqlQuery("select
> > > > > > Auth_Roles,Target_UserSid,Thread_ID,access_path,action from source
> > ")
> > > > > >
> > > > > > fbTableEnv.registerTable("selectTable",select)
> > > > > >
> > > > > > val t1 = fbTableEnv.sqlQuery("select
> > > > > > Auth_Roles,Target_UserSid,Thread_ID,access_path,action from
> > > selectTable
> > > > > > where Auth_Roles like 'a%'")
> > > > > > fbTableEnv.registerTable("t1",t1)
> > > > > >
> > > > > > val t2 = fbTableEnv.sqlQuery("select
> > > > > > Auth_Roles,Target_UserSid,Thread_ID,access_path,action from t1 where
> > > > > > Target_UserSid= 'b'")
> > > > > > fbTableEnv.registerTable("t2",t2)
> > > > > >
> > > > > > val t3 = fbTableEnv.sqlQuery("select
> > > > > > Auth_Roles,Target_UserSid,Thread_ID,access_path,action from t2 where
> > > > > > Thread_ID= 'c'")
> > > > > > fbTableEnv.registerTable("t3",t3)
> > > > > >
> > > > > > val t4 = fbTableEnv.sqlQuery("select
> > > > > > Auth_Roles,Target_UserSid,Thread_ID,access_path,action from t3 where
> > > > > > access_path= 'd'")
> > > > > > fbTableEnv.registerTable("t4",t4)
> > > > > >
> > > > > > val t5 = fbTableEnv.sqlQuery("select
> > > > > > Auth_Roles,Target_UserSid,Thread_ID,access_path,action from t4 where
> > > > > > action= 'e'")
> > > > > >
> > > > > >
> > > > > >
> > > > > > --
> > > > > > Best,
> > > > > > Jun Su
> > > > > >
> > > > >
> > > >
> > > >
> > > > --
> > > > Best,
> > > > Jun Su
> > > >
> > >
> > >
> > > --
> > > Best,
> > > Jun Su
> > >
> >
>
>
> --
> Best,
> Jun Su
Reply | Threaded
Open this post in threaded view
|

Re: Calcite在嵌套多层包含where条件的sql语句时优化器OOM

jun su
hi danny & godfrey

    看debug日志99%是CalcMergeRule , 我看blink用的是FlinkCalcMergeRule ,
在matches方法里加了些对none-deterministic表达式的过滤,,
于是我将CalcMergeRule替换成FlinkCalcMergeRule, 并在FlinkRuleSets里做了更新 ,
重跑后debug日志是99%是更新过的FlinkCalcMergeRule

Danny Chan <[hidden email]> 于2020年9月23日周三 下午12:32写道:

> 应该是碰到节点 cycle 引用了,导致优化 rule 一直重复重复触发,可以将 debug 日志打开,看下是哪个 rule
> 被频繁触发了,之前修过一个类似的问题[1],可以参考下
>
> [1] https://issues.apache.org/jira/browse/CALCITE-3121
>
> Best,
> Danny Chan
> 在 2020年9月23日 +0800 AM10:23,jun su <[hidden email]>,写道:
> > hi godfrey,
> > 方便说下是哪些rule fix了这个问题么? 我对这个比较好奇 , 想看下是什么原因导致的
> >
> > godfrey he <[hidden email]> 于2020年9月23日周三 上午10:09写道:
> >
> > > Hi Jun,
> > >
> > > 可能是old planner缺少一些rule导致遇到了corner case,
> > > blink planner之前解过一些类似的案例。
> > >
> > > jun su <[hidden email]> 于2020年9月23日周三 上午9:53写道:
> > >
> > > > hi godfrey,
> > > >
> > > > 刚看了下, blink应该也会用hep , 上文说错了
> > > >
> > > > jun su <[hidden email]> 于2020年9月23日周三 上午9:19写道:
> > > >
> > > > > hi godfrey,
> > > > > 我用了最新代码的blink没这个问题, 我看代码flink是先用hep然后进valcano, 而blink貌似没用hep,
> > > > > 我将hep代码注释后valcano的迭代次数会大幅减少, 语句嵌套10层基本在4000次左右能获取最佳方案,我再debug看下原因
> > > > >
> > > > > godfrey he <[hidden email]> 于2020年9月22日周二 下午8:58写道:
> > > > >
> > > > > > blink planner 有这个问题吗?
> > > > > >
> > > > > > jun su <[hidden email]> 于2020年9月22日周二 下午3:27写道:
> > > > > >
> > > > > > > hi all,
> > > > > > >
> > > > > > > 环境: flink-1.9.2 flink table planner
> > > > > > > 现象: 代码一直在 VolcanoPlanner.findBestExp()方法中出不来, 直到OOM
> > > > > > >
> > > > > > > 发现在嵌套4层时 findBestExp方法中while(true)会循环3w多次后成功退出, 嵌套5层会达到几十万级别,
> > > > 导致进程OOM
> > > > > > > -----------------------------------------------
> > > > > > > 代码:
> > > > > > >
> > > > > > > fbTableEnv.registerTableSource("source",orcTableSource)
> > > > > > >
> > > > > > > val select = fbTableEnv.sqlQuery("select
> > > > > > > Auth_Roles,Target_UserSid,Thread_ID,access_path,action from
> source
> > > ")
> > > > > > >
> > > > > > > fbTableEnv.registerTable("selectTable",select)
> > > > > > >
> > > > > > > val t1 = fbTableEnv.sqlQuery("select
> > > > > > > Auth_Roles,Target_UserSid,Thread_ID,access_path,action from
> > > > selectTable
> > > > > > > where Auth_Roles like 'a%'")
> > > > > > > fbTableEnv.registerTable("t1",t1)
> > > > > > >
> > > > > > > val t2 = fbTableEnv.sqlQuery("select
> > > > > > > Auth_Roles,Target_UserSid,Thread_ID,access_path,action from t1
> where
> > > > > > > Target_UserSid= 'b'")
> > > > > > > fbTableEnv.registerTable("t2",t2)
> > > > > > >
> > > > > > > val t3 = fbTableEnv.sqlQuery("select
> > > > > > > Auth_Roles,Target_UserSid,Thread_ID,access_path,action from t2
> where
> > > > > > > Thread_ID= 'c'")
> > > > > > > fbTableEnv.registerTable("t3",t3)
> > > > > > >
> > > > > > > val t4 = fbTableEnv.sqlQuery("select
> > > > > > > Auth_Roles,Target_UserSid,Thread_ID,access_path,action from t3
> where
> > > > > > > access_path= 'd'")
> > > > > > > fbTableEnv.registerTable("t4",t4)
> > > > > > >
> > > > > > > val t5 = fbTableEnv.sqlQuery("select
> > > > > > > Auth_Roles,Target_UserSid,Thread_ID,access_path,action from t4
> where
> > > > > > > action= 'e'")
> > > > > > >
> > > > > > >
> > > > > > >
> > > > > > > --
> > > > > > > Best,
> > > > > > > Jun Su
> > > > > > >
> > > > > >
> > > > >
> > > > >
> > > > > --
> > > > > Best,
> > > > > Jun Su
> > > > >
> > > >
> > > >
> > > > --
> > > > Best,
> > > > Jun Su
> > > >
> > >
> >
> >
> > --
> > Best,
> > Jun Su
>


--
Best,
Jun Su
Reply | Threaded
Open this post in threaded view
|

Re: Calcite在嵌套多层包含where条件的sql语句时优化器OOM

Leonard Xu
Hi
>    看debug日志99%是CalcMergeRule , 我看blink用的是FlinkCalcMergeRule ,
> 在matches方法里加了些对none-deterministic表达式的过滤,,
> 于是我将CalcMergeRule替换成FlinkCalcMergeRule, 并在FlinkRuleSets里做了更新 ,
> 重跑后debug日志是99%是更新过的FlinkCalcMergeRule

虽然debug日志看是CalcMergeRule一直在触发,但替换CalcMergeRule后也没有改变,
推测是其他rule引起的。 有特别的需要要使用old planner吗?old planner 社区计划在1.12里会被废弃了。

祝好
Leonard





>> 应该是碰到节点 cycle 引用了,导致优化 rule 一直重复重复触发,可以将 debug 日志打开,看下是哪个 rule
>> 被频繁触发了,之前修过一个类似的问题[1],可以参考下
>>
>> [1] https://issues.apache.org/jira/browse/CALCITE-3121
>>
>> Best,
>> Danny Chan
>> 在 2020年9月23日 +0800 AM10:23,jun su <[hidden email]>,写道:
>>> hi godfrey,
>>> 方便说下是哪些rule fix了这个问题么? 我对这个比较好奇 , 想看下是什么原因导致的
>>>
>>> godfrey he <[hidden email]> 于2020年9月23日周三 上午10:09写道:
>>>
>>>> Hi Jun,
>>>>
>>>> 可能是old planner缺少一些rule导致遇到了corner case,
>>>> blink planner之前解过一些类似的案例。
>>>>
>>>> jun su <[hidden email]> 于2020年9月23日周三 上午9:53写道:
>>>>
>>>>> hi godfrey,
>>>>>
>>>>> 刚看了下, blink应该也会用hep , 上文说错了
>>>>>
>>>>> jun su <[hidden email]> 于2020年9月23日周三 上午9:19写道:
>>>>>
>>>>>> hi godfrey,
>>>>>> 我用了最新代码的blink没这个问题, 我看代码flink是先用hep然后进valcano, 而blink貌似没用hep,
>>>>>> 我将hep代码注释后valcano的迭代次数会大幅减少, 语句嵌套10层基本在4000次左右能获取最佳方案,我再debug看下原因
>>>>>>
>>>>>> godfrey he <[hidden email]> 于2020年9月22日周二 下午8:58写道:
>>>>>>
>>>>>>> blink planner 有这个问题吗?
>>>>>>>
>>>>>>> jun su <[hidden email]> 于2020年9月22日周二 下午3:27写道:
>>>>>>>
>>>>>>>> hi all,
>>>>>>>>
>>>>>>>> 环境: flink-1.9.2 flink table planner
>>>>>>>> 现象: 代码一直在 VolcanoPlanner.findBestExp()方法中出不来, 直到OOM
>>>>>>>>
>>>>>>>> 发现在嵌套4层时 findBestExp方法中while(true)会循环3w多次后成功退出, 嵌套5层会达到几十万级别,
>>>>> 导致进程OOM
>>>>>>>> -----------------------------------------------
>>>>>>>> 代码:
>>>>>>>>
>>>>>>>> fbTableEnv.registerTableSource("source",orcTableSource)
>>>>>>>>
>>>>>>>> val select = fbTableEnv.sqlQuery("select
>>>>>>>> Auth_Roles,Target_UserSid,Thread_ID,access_path,action from
>> source
>>>> ")
>>>>>>>>
>>>>>>>> fbTableEnv.registerTable("selectTable",select)
>>>>>>>>
>>>>>>>> val t1 = fbTableEnv.sqlQuery("select
>>>>>>>> Auth_Roles,Target_UserSid,Thread_ID,access_path,action from
>>>>> selectTable
>>>>>>>> where Auth_Roles like 'a%'")
>>>>>>>> fbTableEnv.registerTable("t1",t1)
>>>>>>>>
>>>>>>>> val t2 = fbTableEnv.sqlQuery("select
>>>>>>>> Auth_Roles,Target_UserSid,Thread_ID,access_path,action from t1
>> where
>>>>>>>> Target_UserSid= 'b'")
>>>>>>>> fbTableEnv.registerTable("t2",t2)
>>>>>>>>
>>>>>>>> val t3 = fbTableEnv.sqlQuery("select
>>>>>>>> Auth_Roles,Target_UserSid,Thread_ID,access_path,action from t2
>> where
>>>>>>>> Thread_ID= 'c'")
>>>>>>>> fbTableEnv.registerTable("t3",t3)
>>>>>>>>
>>>>>>>> val t4 = fbTableEnv.sqlQuery("select
>>>>>>>> Auth_Roles,Target_UserSid,Thread_ID,access_path,action from t3
>> where
>>>>>>>> access_path= 'd'")
>>>>>>>> fbTableEnv.registerTable("t4",t4)
>>>>>>>>
>>>>>>>> val t5 = fbTableEnv.sqlQuery("select
>>>>>>>> Auth_Roles,Target_UserSid,Thread_ID,access_path,action from t4
>> where
>>>>>>>> action= 'e'")
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> --
>>>>>>>> Best,
>>>>>>>> Jun Su
>>>>>>>>
>>>>>>>
>>>>>>
>>>>>>
>>>>>> --
>>>>>> Best,
>>>>>> Jun Su
>>>>>>
>>>>>
>>>>>
>>>>> --
>>>>> Best,
>>>>> Jun Su
>>>>>
>>>>
>>>
>>>
>>> --
>>> Best,
>>> Jun Su
>>
>
>
> --
> Best,
> Jun Su