更新时间:2023-09-14 GMT+08:00
分享

建议

HQL编写之隐式类型转换

查询语句使用字段的值做过滤时,不建议通过Hive自身的隐式类型转换来编写HQL。因为隐式类型转换不利于代码的阅读和移植。

建议示例:

select * from default.tbl_src where id = 10001;
select * from default.tbl_src where name = 'TestName';

不建议示例:

select * from default.tbl_src where id = '10001';
select * from default.tbl_src where name = TestName; 

表tbl_src的id字段为Int类型,name字段为String类型

HQL编写之对象名称长度

HQL的对象名称,包括表名、字段名、视图名、索引名等,其长度建议不要超过30个字节。

Oracle中任何对象名称长度不允许超过30个字节,超过时会报错。为了兼容Oracle,对对象的名称进行了限制,不允许超过30个字节。

太长不利于阅读、维护、移植。

HQL编写之记录个数统计

统计某个表所有的记录个数,建议使用“select count(1) from table_name”。

统计某个表某个字段有效的记录个数,建议使用“select count(column_name) from tbale_name”。

JDBC超时限制

Hive提供的JDBC实现有超时限制,默认是5分钟,用户可以通过java.sql.DriverManager.setLoginTimeout(int seconds)设置,seconds的单位为秒。

Hive并发编译SQL

给HiveServer配置参数hive.driver.parallel.compilation=true并且重启HiveServer,可以使得HiveServer支持多个Session之间并发编译SQL。

在默认情况下,HiveServer是关闭并发编译SQL的,这意味着HiveServer只能串行的编译SQL,当有大量的执行时间短的SQL时,会影响整体性能。例如执行大量Analyse操作时,开启并发编译可以极大提高性能。

建Hive分区表策略

当某个表的目录下有海量的数据,使用Hive进行操作时,会搜索这个表的所有文件,这会非常耗时。如果知道这些数据的某些特征,可以事先将其分裂存放到hive的不同目录下,在查询时就可以在where子句中对这些特征进行过滤,那么对数据的操作就只会在符合条件的子目录下进行,其他不符合条件的目录就不会被读取。这种将表中数据分散到子目录的方式就是分区表。

因此建分区表的前提是表存在大量的数据或者未来存放大量数据,否则将会导致文件系统中产生大量的小文件。建议满足如下条件可以建立分区表:

  • 表中的数据按照时间维度导入,且每个时间周期内数据大于32M,此时可以将时间字段作为分区字段建立分区表。
  • 表的总大小未来预计大于10G时,可以建立分区表。

增加高斯DB备节点查询成功率

在备库上执行查询时,经常会出现如下错误:

由于备库从主库同步数据时发现备库执行了耗时较长的SQL,会主动将SQL取消,SQL最长执行时间默认为30s。此问题需要在高斯备节点执行如下语句:

su ommdba
gs_guc reload -c "hot_standby_feedback=on"

这个参数的设置是有利有弊,好处就是减少了冲突,缺点就是由于主库的清理需要等待备库的事务结束,那么在频繁更新的场景下,可能造成主库数据膨胀。因此只建议在备库上执行不频繁且耗时段的SQL。

分享:

    相关文档

    相关产品