上一篇文章《doris数据库操作数字遇到的问题》是第一弹,文章结尾提到过doris不支持with语句,其实是因为我本身没找到精确利用的方式导致的。昨天因为客户现场有一个解析SQL的接口提示异常,所以就开始了长路漫漫的排查之旅。不外首先认可及改正一下本身的错误:
doris是支持with语法的!!!
doris是支持with语法的!!!
doris是支持with语法的!!!
1.先说说背景
客户现场有一套老的环境,有一个SQL可以正常执行,但导入到新环境后发现执行异常。现场的实施办理不了,就在群里反馈了这个问题,于是我把这个问题接办过来了。
这不接办还好,接办过来一看,好家伙,1000多行的SQL,各种with、case when、union和子查询,一看到这种SQL就没有动手的欲望了。因为对业务不懂,所以只能把SQL复制出来,把业务表导到开发环境一点点排查起来。
2.办理过程
2.1.分段执行方式
对于这种“又臭又长”的王妈妈裹脚,只能先接纳最笨的方法:分段执行。这里发现并办理了一个doris自带函数名错误的问题:date_add被写成了dateadd,导致提示以下错误
所以只能全局搜刮并更换了这个函数,再执行又发现了Unknown table的异常
又搜刮了一下这个“表”名,发现是跟在with语句后面的别名。然后想起了开头的那篇文章,还是认为是因为doris不支持with语句导致的。于是度娘了一下,发现doris是支持with语法的。其实度娘里也只有AI智能答复提到是支持的,其他内容都没啥资助,但详细怎么写又不明确。这下好了,要长脑筋了,开始百撕不得其姐了(bushi)
2.2.灵光乍现
以为办理无望的时候,发现AI智能答复的内容有点蹊跷
然后对比了下业务SQL
先试试将别名改成小写看看结果,固然,但是,就这么水灵灵的,居然成功了,然成功了,成功了,功了,了......
至于为什么,是否跟大小写敏感有关啥的,暂时不去穷究了。
2.3.程序执行遇新问题
还讲啥呢,直接把SQL复制到apifox里调用接口啊,自认为这下肯定成功把问题办理了,不出意外的话,还是出意外了
固然对于这个异常是真的度娘不出一点办理方案了,但定位根本就是SQL语法问题。追念了以前办理这类问题的履历,暂时先定位到解释上,把解释先去掉试试。
2.4.办理方案及方案优化
删除解释后,成功是成功了,但一个SQL执行器不支持写解释,就跟写java代码不能带解释一样,写多了到后面谁还记得那么多这是干什么用的。所以问题不能这么一刀切的办理(不能像jin'mo政策一样,管理不好就一刀切了再说)
于是,试了下在解释--后添加空格是可行的,大概将单行解释--,更换为多行解释/*xxxx*/也是可行的。但我们又不能要求实施这么去改,只能想办法加强我们代码的结实性和兼容性。于是在代码里加了个判定,如果有--时,就添加空格。
固然这种不是完全之策,也必要要求开发人员写SQL时候必要利用换行等,但目前来说已经够用了。
2.5.最后的问题
你们以为问题全都办理了,皆大欢乐?不好意思,实际往往会给你一个大逼斗,再嘲笑你一番。毕竟有些坑埋在那里,暂时为止没遇到不代表不存在。像这种1000多行的SQL,执行服从能有多低可想而知,代码利用的是动态数据源,每次毗连都会动态加载写好的配置,所以请看
其实就是毗连超时,被掐了。找了一下动态创建数据源的代码,发现了这么一行代码
- props.put("connectionProperties", "druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000;socketTimeout=3000;connectTimeout=1200");
复制代码 修改后
- props.put("connectionProperties", "druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000");
复制代码 最终全部问题都办理掉了,只是这SQL的执行服从就真的低,现场执行的返回时间是1.6min,暂时这样吧
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |