SQL常见问题

本节介绍执行 SQL 语句过程中常见的问题以及解决方法。

常见的 SQL 问题主要有以下几类:

  • 语法错误 "USER_ERROR" [30101]。
  • 查询超限 "QUERY_EXCEED_LIMIT"。
  • 查询超时 "Execution timeout"。
  • 内存不足 "memory is not enough"。
  • 查询报错"Packet for query is too large"。
  • 实时数据、表、列不可见。
  • LM 查询结果的注意事项。

语法错误 "USER_ERROR" [30101]

一般情况下,产生 "USER_ERROR" [30101] 语法错误的原因如下:

  • SQL 语句中使用了错误的函数或参数,尤其是时间函数与字符串函数等。函数和参数的详细信息,请参考系统运算符与函数
  • 数据类型不匹配,例如:错将数字类型字段与字符型字段进行了 JOIN 操作。
  • 语法不支持,例如:( count(distinct x) * y )

查询超限 "QUERY_EXCEED_LIMIT"

为保证数据库以稳定和高性能的状态运行、防止用户的某些不当查询占用过多的资源,AnalyticDB 对查询操作采取了一些限制,具体的限制项如下:

  • 查询默认不得超过100列。
  • 查询 IN 的个数默认不得超过50个。
  • 单分区扫描的行数默认不得超过一亿行。

当遇到 "QUERY_EXCEED_LIMIT" 报错时,您需要通过增加过滤条件、只选择必要的列等方式对 SQL 语句进行优化。如果优化 SQL 语句后仍不能解决问题,请提交工单给运维人员,请运维人员调整限制项的阈值。

查询超时 "Execution timeout"

ADB 查询的超时时限默认为60秒。一般情况下,产生 "Execution timeout" 的原因如下:

  • 数据严重倾斜。
  • 查询过于复杂。

当遇到 "Execution timeout" 报错时,您可检查相关表是否存在严重的数据倾斜、优化 SQL 语句,或在业务端调整业务逻辑。

内存不足 "memory is not enough"

一般情况下,产生内存不足 "memory is not enough" 的原因是某些复杂的查询耗尽了 CN 节点的内存。

当遇到 "memory is not enough" 报错时,您需要优化 SQL 语句。

查询报错"Packet for query is too large"

ADB的 SQL 语句默认不得超过1 MB,如果超过1 MB,则会产生 "Packet for query is too large" 报错。

当遇到 "Packet for query is too large" 报错时,您需要精简 SQL 语句。如果精简 SQL 语句后仍不能解决问题,请提交工单给运维人员。

实时数据、表、列不可见

当前,ADB新建表语句是异步过程,新建表并非即时可用。新建批量更新表后,需要导入一次数据才可用;新建实时更新表后,等待几秒后才可用。同样,新增列和新增的实时数据也不是实时可见的。

LM 查询结果注意事项

通过 LM 计算引擎查询时,如果是事实表 JOIN,则需要遵循 JOIN 四原则:

  • 参与 JOIN 的事实表在同一个表组中。
  • 参与 JOIN 的事实表具有相同的一级分区数。
  • 事实表 JOIN 时,关联条件(ON)中至少含有一个条件是事实表各自的分区列的等值关联条件。
  • 关联条件(ON)中的条件两端包含有效的HashMap索引。

如果子查询包含 group by,则确保 group by 列为分区列。

非分区列进行 group by 时,分组数不能超过1000,且不支持 having 条件;如果需要支持having 条件,则需要启用 MPP 计算引擎。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值