通过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中有两个接口可以更新数据:
RowPutChange
和RowUpdateChange
。RowPutChange
根据主键整行覆盖更新数据,主键值不变;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
。