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. 数据加载类型

特征 INSERT UPSERT UPSERT USING LOAD LOAD
交易(Transaction) 不,使用HBase WAL来恢复 不,使用快照(snapshot)来恢复
操作方法(Method of operation) 在CheckAndPut会话中,使用标准HBase的写路径。 行在交易协处理器(coprocessor)内存中中止了,除非交易被递交。 在Put会话中,使用标准HBase的写路径。 在Put会话中,使用标准HBase的写路径。 使用HBase bulk加载的写路径,并直接新建HFile文件,在大多数操作中忽略HBase RegionServers。
唯一限制(Uniqueness constraint) 强制 不强制。有相同键值的行覆盖之前的行。 不强制。有相同键值的行覆盖之前的行。 只在行集属于单一语句时强制。对已经在表中的行不强制。
索引(Index) 能在有索引的表中使用。 能在有索引的表中使用。 如果在有索引的表中使用,它会转换成UPSERT。 能在有索引的表中使用。在LOAD时,索引不起作用。
最大支持(Maximum size) 对少于10000*n行适用,这里n是集群中节点的数量。 对少于10000*n行适用,这里n是集群中节点的数量。 对少于5百万*n行适用,这里n是集群中节点的数量。 对少于20亿*n行适用,这里n是集群中节点的数量。
最小支持(Minimum size) 1行 1行 1行 对1百万*n行适用
速度(Speed) 最慢 比INSERT快 比UPSERT快 最快

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 ;实现

你可能感兴趣的:(Trafodion/EsgynDB 性能优化求生指南)