SQL 查询
本主题提供有关 SQL 的一些常见问题解答。
构建物化视图时出现“fail to allocate memory.” 错误
要解决此问题,请增加 be.conf 文件中 memory_limitation_per_thread_for_schema_change
参数的值。 此参数是指可为单个任务分配以更改模式的最大存储空间。 最大存储空间的默认值为 2 GB。
StarRocks 是否支持缓存查询结果?
StarRocks 不会直接缓存最终查询结果。 从 v2.5 开始,StarRocks 使用查询缓存功能来保存缓存中第一阶段聚合的中间结果。 在语义上与先前查询等效的新查询可以重用缓存的计算结果以加速计算。 查询缓存使用 BE 内存。 有关详细信息,请参见查询缓存。
当计算中包含 Null
时,除 ISNULL() 函数外,函数的计算结果均为 false
在标准 SQL 中,每个包含带有 NULL
值的操作数的计算都返回 NULL
。
StarRocks 是否支持 DECODE 函数?
StarRocks 不支持 Oracle 数据库的 DECODE 函数。 StarRocks 与 MySQL 兼容,因此您可以使用 CASE WHEN 语句。
将数据加载到 StarRocks 的主键表后,是否可以立即查询最新数据?
是。 StarRocks 以引用 Google Mesa 的方式合并数据。 在 StarRocks 中,BE 触发数据合并,它有两种压缩类型来合并数据。 如果数据合并未完成,则会在查询期间完成。 因此,您可以在数据加载后读取最新数据。
存储在 StarRocks 中的 utf8mb4 字符是否会被截断或显示乱码?
否。
运行 alter table
命令时出现“table's state is not normal”错误
发生此错误是因为先前的更改尚未完成。 您可以运行以下代码来检查先前更改的状态
show tablet from lineitem where State="ALTER";
花费在更改操作上的时间与数据量有关。 通常,更改可以在几分钟内完成。 我们建议您在更改表时停止将数据加载到 StarRocks 中,因为数据加载会降低更改完成的速度。
查询 Apache Hive 的外部表时出现“get partition detail failed: org.apache.doris.common.DdlException: get hive partition meta data failed: java.net.UnknownHostException”错误:hadooptest"
当无法获取 Apache Hive 分区的元数据时,会发生此错误。 要解决此问题,请将 core-sit.xml 和 hdfs-site.xml 复制到 fe.conf 文件和 be.conf 文件。
查询数据时出现“planner use long time 3000 remaining task num 1”错误
通常,发生此错误是由于完整的垃圾回收 (full GC),可以通过使用后端监控和 fe.gc 日志来检查。 要解决此问题,请执行以下操作之一
- 允许 SQL 的客户端同时访问多个前端 (FE),以分散负载。
- 在 fe.conf 文件中将 Java 虚拟机 (JVM) 的堆大小从 8 GB 更改为 16 GB,以增加内存并减少完整 GC 的影响。
当 A 列的基数很小时,select B from tbl order by A limit 10
的查询结果每次都不同
SQL 只能保证 A 列已排序,但不能保证每次查询 B 列的顺序都相同。 MySQL 可以保证 A 列和 B 列的顺序,因为它是一个独立的数据库。
StarRocks 是一个分布式数据库,其中存储在基础表中的数据采用分片模式。 A 列的数据分布在多台机器上,因此每次查询多台机器返回的 B 列的顺序可能不同,从而导致每次 B 的顺序不一致。 要解决此问题,请将 select B from tbl order by A limit 10
更改为 select B from tbl order by A,B limit 10
。
为什么 SELECT * 和 SELECT 之间的列效率存在很大差距?
要解决此问题,请检查配置文件并查看 MERGE 详细信息
-
检查存储层上的聚合是否花费了太多时间。
-
检查是否有太多指标列。 如果是这样,则聚合数百万行的数百列。
MERGE:
- aggr: 26s270ms
- sort: 15s551ms
DELETE 是否支持嵌套函数?
不支持嵌套函数,例如 DELETE from test_new WHERE to_days(now())-to_days(publish_time) >7;
中的 to_days(now())
。
当数据库中有数百个表时,如何提高数据库的使用效率?
要提高效率,请在连接到 MySQL 的客户端服务器时添加 -A
参数:mysql -uroot -h127.0.0.1 -P8867 -A
。 MySQL 的客户端服务器不预读取数据库信息。
如何减少 BE 日志和 FE 日志占用的磁盘空间?
调整日志级别和相应的参数。 有关详细信息,请参阅参数配置。
当我修改复制数时,出现“table *** is colocate table, cannot change replicationNum”错误
创建并置表时,需要设置 group
属性。 因此,您无法修改单个表的复制数。 您可以执行以下步骤来修改组中所有表的复制数
- 将组中所有表的
group_with
设置为empty
。 - 为组中的所有表设置适当的
replication_num
。 - 将
group_with
设置回其原始值。
将 VARCHAR 设置为最大值是否会影响存储?
VARCHAR 是一种可变长度数据类型,它具有指定的长度,可以根据实际数据长度进行更改。 创建表时指定不同的 varchar 长度对同一数据的查询性能几乎没有影响。
当我截断表时出现“create partititon timeout”错误
要截断表,您需要创建相应的分区,然后交换它们。 如果需要创建大量分区,则会发生此错误。 此外,如果有很多数据加载任务,则在压缩过程中锁将被长时间持有。 因此,在创建表时无法获取锁。 如果数据加载任务过多,请在 be.conf 文件中将 tablet_map_shard_size
设置为 512
以减少锁争用。
当我访问 Apache Hive 的外部表时,出现“Failed to specify server's Kerberos principal name”错误
将以下信息添加到 fe.conf 文件和 be.conf 文件中的 hdfs-site.xml
<property>
<name>dfs.namenode.kerberos.principal.pattern</name>
<value>*</value>
</property>
“2021-10”是 StarRocks 中的日期格式吗?
否。
“2021-10”可以用作分区字段吗?
否,使用函数将“2021-10”更改为“2021-10-01”,然后使用“2021-10-01”作为分区字段。
在哪里可以查询 StarRocks 数据库或表的大小?
您可以使用SHOW DATA 命令。
SHOW DATA;
显示当前数据库中所有表的数据大小和副本。
SHOW DATA FROM <db_name>.<table_name>;
显示指定数据库中指定表的数据大小、副本数和行数。