并行查询使用限制和兼容性问题

本文为您介绍并行查询的使用限制以及与串行执行结果可能不兼容的地方,帮助您正确使用并行查询功能。

并行查询的使用限制

PolarDB会持续迭代并行查询的能力,目前以下情况在并行计划中会有一定的局限性:

  • 查询非Innodb表,查询无法并行。

  • 使用全文索引的查询,查询无法并行。

  • 包含存储过程Procedures的表达式,该表达式必须在leader上执行。

  • Index Merge方式进行表扫描,则该表无法并行。

  • 串行化隔离级别事务内的查询语句无法并行。

  • 隔离级别是Repeatable-read的情况下,事务内的INSERT ... SELECT/REPLACE ... SELECT查询部分无法并行。

与串行执行结果可能不兼容的地方

  • 错误提示次数可能会变化

    串行执行中出现错误提示的查询,在并行执行的情况下,总体错误提示数可能会与串行有所不同。

  • 精度问题

    并行查询的执行过程中,可能会出现比串行执行多出中间结果的存储,如果中间结果是浮点型,可能会导致浮点部分精度差别,导致最终结果有细微的差别。

  • 网络包或者中间结果长度超出max_allowed_packet允许的最大长度

    并行查询的执行过程中,相比串行执行可能会多出中间结果。如果中间结果的长度超出了max_allowed_packet定义的最大长度,可能出现错误提示,可以通过增加max_allowed_packet参数的值来解决。如何修改参数请参见设置集群参数和节点参数

  • 结果集顺序差别

    当并行执行未加ORDER BY关键字的SELECT ... LIMIT n语句时,返回的结果集可能与执行顺序不一致。由于有多个Worker同时执行,每次执行时Worker的执行速度是不确定的,当Leader得到足够的数据后,就会返回结果,因此返回的结果集可能与执行顺序不一致。

  • 加了行锁的数据记录数增多

    当并行执行SELECT ... FROM ... FOR SHARE语句时,InnoDB会将访问到的每一行数据都加锁,因此加了行锁的记录数可能会比非并行执行的情况下要多,这属于正常现象。