Trafodion/EsgynDB 性能优化求生指南
I. 建表
A. 主键/聚集键
Trafodion表按主键排序,若查询经常按某个字段做WHERE过滤,适合将此字段放置于主键/聚集键
注意事项:
(1) 主键字段长度应尽量短,如VARCHAR(100)字段就不适合放在主键
(2) 除非必须存储中文,否则对于字符类型,尽量用CHAR/VARCHAR(n BYTES),而非CHAR/VARCAHR(n CHARS) CHARACTER SET UTF8,因为会占用4X空间
(3) 若主键包含多个字段,为使MDAM更高效,将UEC低的字段放在前面
(4) 默认情况下,主键中的字段都应该非空,如果希望往主键字段插入空值,可以使用cqd ALLOW_NULLABLE_UNIQUE_KEY_CONSTRAINT ‘ON’实现
B. 分区
Trafodion建表时可以通过SALT USING N PARTITIONS语法对表进行预分区,适当的分区可以实现表数据的均衡分布、查询性能提升
注意事项:
(1) 分区数要根据节点数、磁盘数及表的数据量综合考量,不宜随意指定
(2) 对于小表(如<100万)可不分区;对于大表(如>1000万)可适当分区,分区数一般为节点数的n倍(n<=8),生产环境下,每个分区的数据在百万行级别较合适
(3) HBase不建议单台RegionServer中的Region个数太多,一般不超过1000
(4) 在满足(3)的前提下,适当增加大表的分区数可以在查询时启用更多ESP并发查询,有利于提升查询性能
C. 行格式
Trafodion有两种行格式-默认行格式及ALIGNED格式,ALIGNED格式在插入、查询场景性能更优,但对更新、删除操作会一定的负作用。Trafodion新版本中,默认的行格式为ALIGNED格式
D. HBase存储选项
由于每个Trafodion表是一个单独的HBase表,HBase层面调优主要涉及三个参数-COMPRESSION、DATA_BLOCKENCODING、MEMSTORE_FLUSH_SIZE,因此在Trafodion中建表一般会添加以下选项,
HBASE_OPTIONS (
DATA_BLOCK_ENCODING = ‘FAST_DIFF’,
COMPRESSION = ‘SNAPPY’,
MEMSTORE_FLUSH_SIZE = ‘1073741824’ )
E. 创建索引
Trafodion允许在表上创建索引,合适地索引可以提升查询性能,但会影响插入、更新及删除的性能。
注意事项:
(1) 索引也可以分区,一般情况下,创建索引使用和主表同样的分区方式,语法为:SALT LIKE TABLE
(2) 当主表有大量插入或更新操作时,不适宜在主表创建较多的索引
(3) 在某些场景,查询语句只涉及表中很少的几个字段时,可以在那几个字段上创建一个组合索引(Covering Index),可以避免回表
II. 数据加载
A. 数据加载类型
B. 持续加载
持续加载(Trickle Load)分为三种-UPSERT USING LOAD、UPSERT、INSERT
注意事项:
(1) 通常情况下,UPSERT USING LOAD快,其次是UPSERT,后是INSERT
(2) 数据加载的吞吐量与节点数成正比,节点越多,加载性能越高
(3) 可以使用cqd PARALLEL_NUM_ESPS ‘’开启ESP并发加载数据,并发数大不超过表的Region个数
(4) 减少WAL文件复制因子也可以提升性能,通过修改hbase.regionserver.hlog.tolerable.lowreplication ‘’实现,默认值为3
C. 批量加载
批量加载(Bulk Load)绕过HBase的写路径,而是直接转换文件为HFile移动到HBase下,因此Bulk Load通常情况下会更快
注意事项:
(1) 从Hive源表加载到Trafodion时,使用cqd HIVE_MAX_STRING_LENGTH ‘’可以较大提升性能,value的值根据Hive源表大字段长度定义
(2) Bulk Load向目标表加载数据时每个Region启用1个ESP,这个无法修改;从Hive源表读数据默认每个节点启用2个ESP,这个可以修改,通过cqd HIVE_NUM_ESPS_PER_DATANODE ‘’实现
(3) 如果目标表上有索引会影响加载性能,如果能确定源数据没有重复数据,可以使用cqd TRAF_LOAD_ALLOW_RISKY_INDEX_MAINTENANCE ‘ON’提升性能
III. 统计信息
注意事项:
(1) 当表加载数据之后,需要更新统计信息,否则执行计划可能不对,因为默认情况下Trafodion对每个表做100行数据假设,更新统计信息语法:UPDATE STATISTICS FOR TABLE table_name ON EVERY COLUMN;
(2) 对大表更新统计信息可能会十分耗时,为提升效率,利用SAMPLE语法,如下
UPDATE STATISTICS FOR TABLE table_name ON EVERY COLUMN SAMPLE;
(3) 如果表是持续注入数据,建议使用CronJob或其他方式定期更新统计信息
IV. 查询性能
注意事项:
(1) 对查询涉及到的表必须先更新统计信息,防止因为执行计划不准确导致查询性能下降
(2) 对于SQL执行很长时间,可以用$MY_SQROOT/export/limited-support-tools/LSO/offender -s active找到对应,然后使用GET STATISTIS FOR QID DEFAULT;查看执行统计信息
(3) 如果希望取消正在执行的查询,可以使用CONTROL QUERY CANCEL QID ;实现
————————————————
版权声明:本文为CSDN博主「post_yuan」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/post_yuan/article/details/73167376
相关文章