通过DLA查询Tablestore数据时,可以在SQL中加入Hint对数据查询性能进行调优。

DLA是分布式计算系统,系统对每个Tablestore表按照一定的规则进行分片(split),各个分片之间相互不重合,计算层并行执行这些分片,从而提高计算并行度。

  • 指定单个分片的大小

    通过ots-split-unit-mb=<分片值>指定单个分片的大小,分片值的取值范围为1MB~102400MB,默认值为10MB。

    说明

    • 对于数据量非常大的表,如果分片值太小,会导致分片数量过多,从而导致Tablestore服务压力增大,经常产生超时,影响数据写入链路的稳定性。如果当前要访问的Tablestore数据量大于10GB,则当前分片值建议为256MB;如果Tablestore数据量大于100GB,则建议分片值大于2048MB。

    • 对于数据量较小的表,如果分片值太大,可能会影响计算并行度,从而影响延时,此时可以适当将分片值调小。

  • 开启自动优化分片功能

    通过ots-split-optimize=true开启自动优化分片功能,默认值为FALSE。

    某些场景下用户SQL会自动产生大批量分片,导致计算时Tablestore服务压力增大,从而造成计算超时。另一个方面Tablestore产生的分片列表大多是顺序的,而相邻的一批分片会落到相同的机器上,DLA访问Tablestore时可能造成局部热点问题。

    在DLA中可以通过一系列的优化手段,自动打散分片、合并相邻分片、随机分发分片等优化逻辑,规避热点问题从而提高性能。

  • 合并相邻分片

    在开启自动优化分片功能(ots-split-optimize=true)的基础上,通过ots-split-size-ratio=0.5合并相邻分片,控制总分片数,达到性能调优的目的。ots-split-size-ratio取值范围为0.0001~1.0000。

    例如原计划有100000个分片,设置ots-split-size-ratio=0.3后,系统尝试合并分片,将分片数量控制30000个左右。最终合并完成后的分片数量取决于Tablestore服务的承载压力。

通过计算语义实现性能调优

  • 是否使用UPDATE替换INSERT

    通过ots-insert-as-update=true/false设置是否使用UPDATE替换INSERT,默认值为FALSE。

    Tablestore SDK中有两个接口可以更新数据:RowPutChangeRowUpdateChangeRowPutChange根据主键整行覆盖更新数据,主键值不变;RowUpdateChange根据主键更新部分非主键列,主键值不变。由于DLA目前不支持UPDATE语句,只能通过INSERT+Hint的方式更新Tablestore数据。

  • 是否允许使用宽松的CAST

    通过ots-loose-cast=true/false设置SQL中是否允许使用宽松的CAST,例如是否允许将LONG转换为DOUBLE或者将DOUBLE转换为LONG,默认值为FALSE。

    DLA属于强类型系统,如果底层Tablestore中某字段类型为BIGINT,上层DLA定义该字段类型为VARCHAR或者STRING,则DLA执行SQL时将报错。此时您可以通过ots-loose-cast=true开启允许使用宽松的CAST,然后DLA自动进行类型转换,将字符串"123"转换成整型123

通过多元索引实现性能调优

通过ots-index-first=auto设置是否开启表的索引优先查询功能。

大多数情况下DLA会对Tablestore的主表数据进行查询分析,如果您开通多元索引,并且要求使用多元索引,DLA会尽可能的使用多元索引。

DLA多元索引与MySQL的二级索引等强一致索引相比,有以下不同。

  • 基于异步复制,与主表之间不是强一致。

  • 基于倒排索引而非BTree。

因此,开启多元索引之后,DLA需要通过计算才能得知是否可以使用多元索引。

通过控制单节点并发数量实现性能调优

通过task-concurrency=<1~32的整数>,控制DLA单节点并发量,默认值为32。

由于DLA集群规模较大,默认是高并发的拉取Tablestore数据。如果出现大量的Tablestore的超时或重试问题时,表示DLA端目前的请求吞吐量太高,将直接影响线上集群的稳定性。安全起见,遇到Tablestore超时导致SQL执行失败时,需要适当控制DLA并发度,例如设置task-concurrency=2