查询常见问题
构建物化视图失败:fail to allocate memory
修改 be.conf
中的memory_limitation_per_thread_for_schema_change
。
该参数表示单个 schema change 任务允许占用的最大内存,默认大小 2G。修改完成后,需重启 BE 使配置生效。
StarRocks 会缓存查询结果吗?
StarRocks 不直接缓存最终查询结果。从 2.5 版本开始,StarRocks 会将多阶段聚合查询的第一阶段聚合的中间结果缓存在 Query Cache 里,后续查询可以复用之前缓存的结果,加速计算。Query Cache 占用所在 BE 的内存。更多信息,参见 Query Cache。
当字段为NULL时,除了is null, 其他所有的计算结果都是false
标准 SQL 中 null 和其他表达式计算结果都是null。
StarRocks有decode函数吗?
StarRocks 不支持 Oracle 中的 decode 函数,StarRocks 语法兼容 MySQL,可以使用case when。
StarRocks的主键覆盖是立刻生效的吗?还是说要等后台慢慢合并数据?
StarRocks 的后台合并参考 Google 的 MESA 模型,有两层 compaction,会后台策略触发合并。如果没有合并完成,查询时会合并,但是读出来只会有一个最新的版本,不存在「导入后数据读不到最新版本」的情况。
StarRocks 存储 utf8mb4 的字符,会不会被截断或者乱码?
MySQL的 utf8mb4 是标准的 UTF-8,StarRocks 可以完全兼容。
[Schema change] alter table 时显示:table's state is not normal
ALTER TABLE 是异步操作,如果之前有 ALTER TABLE 操作还没完成,可以通过如下语句查看 ALTER 状态。
show tablet from lineitem where State="ALTER";
执行时间与数据量大小有关系,一般是分钟级别,建议 ALTER 过程中停止数据导入,导入会降低 ALTER 速度。
[Hive外部表查询问题] 查询 Hive 外部表时报错获取分区失败
问题描述
查询 Hive 外部表时具体报错信息:
get partition detail failed: com.starrocks.common.DdlException: get hive partition meta data failed: java.net.UnknownHostException:hadooptest(具体hdfs-ha的名字)
解决方案
将core-site.xml
和hdfs-site.xml
文件拷贝到 fe/conf
和 be/conf
中即可,然后重启 FE 和 BE。
问题原因
获取配置单元分区元数据失败。
大表查询结果慢,没有谓词下推
多张大表关联时,旧 planner有时没有自动谓词下推,比如:
A JOIN B ON A.col1=B.col1 JOIN C on B.col1=C.col1 where A.col1='北京',
可以更改为:
A JOIN B ON A.col1=B.col1 JOIN C on A.col1=C.col1 where A.col1='北京',
或者升级到较新版本并开启 CBO 功能,会有此类谓词下推操作,优化查询性能。
查询报错 planner use long time 3000 remaining task num 1
解决方案
查看fe.gc
日志确认该 问题是否是多并发引起的full gc。
如果查看后台监控和日志初步判断有频繁gc,可参考两个方案:
- 让sqlclient同时访问多个FE去做负载均衡。
- 修改
fe.conf
中jvm8g
为16g(更大内存,减少 full gc 影响)。修改后需重启FE。
当A基数很小时,select B from tbl order by A limit 10查询结果每次不一样
解决方案:
使用select B from tbl order by A,B limit 10
,将B也进行排序就能保证结果一致。
问题原因
上面的SQL只能保证A是有序的,并不能保证每次查询出来的B顺序是一致的,MySQL能保证这点因为它是单机数据库,而StarRocks是分布式数据库,底层表数据存储是sharding的。A的数据分布在多台机器上,每次查询多台机器返回的顺序可能不同,就会导致每次B顺序不一致。
select * 和 select 的列效率差距过大
select * 和 select 时具体列效率差距会很大,这时应该去排查profile,看 MERGE 的具体信息。
- 确认是否是存储层聚合消耗的时间过长。
- 确认是否指标列有很多,需要对几百万行的几百列进行聚合。
MERGE:
- aggr: 26s270ms
- sort: 15s551ms
目前 DELETE 中不支持嵌套函数
目前不支持类似如下的嵌套:DELETE from test_new WHERE to_days(now())-to_days(publish_time) >7;
。这里'to_days(now())'属于嵌套。