查询优化器

什么是查询优化器?

Cloud Spanner SQL 查询优化器会将描述查询所需数据的声明式 SQL 语句转换为命令式执行计划,以描述一种精确获取数据的方式。将声明式语句转换为查询执行计划的过程涉及对用于表示查询的树结构执行转换。在生成执行计划的过程中,优化器应保留原始 SQL 查询的逻辑含义,以便返回正确的行。

优化器的另一个重要作用是生成高效的执行计划。

Cloud Spanner 优化器如何生成高效的执行计划?

Cloud Spanner 的优化器结合使用成熟的启发式算法和基于成本的优化来生成高效的计划。一些启发法非常复杂,例如“在远程机器上执行过滤器,而不是将数据拉取到本地机器”。其他启发法更为复杂,但仍具有移动逻辑的原则,使得数据量更接近数据。在将数据分开存放在多台机器中的系统中,该原则尤其重要。

并非所有执行决策都可以通过这样的固定规则来高效做出,因此 Cloud Spanner 的优化器也会根据替代方案的估算成本做出决策。此类成本估算是根据查询的结构、数据库的架构以及由查询片段产生的数据卷估算得出的。例如,Cloud Spanner 会估算 Songs 表中有多少行满足过滤条件 SongGenre = "Country"(如果该过滤条件出现在查询中)。为帮助计算此类估算值,Cloud Spanner 会定期收集有关用户数据的统计信息。

如需详细了解查询执行计划以及 Cloud Spanner 如何使用它们在分布式环境中执行查询,请参阅查询执行计划

查询优化器版本控制

随着时间的推移,查询优化器会不断发展,扩大了基于成本的查询执行计划中的选项集,并提高了传达这些选择的估算值的准确性,从而产生更高效的查询执行计划。

Cloud Spanner 将以新查询优化器版本的形式发布优化器更新。默认情况下,每个数据库始终使用最新版本的优化器。为了让您有更多的控制权,我们推出了用于管理您所用查询的查询优化器版本的功能。在提交到最新版本之前,您可以比较旧版本与最新版本之间的性能配置文件。如需了解详情,请参阅管理查询优化器

查询优化器版本记录

下面总结了在每个版本中对查询优化器进行的更新。

版本 2:2020 年 3 月 1 日(最新)

  • 在索引选择中添加优化。
  • 改进了某些情况下 REGEXP_CONTAINSLIKE 谓词的性能。
  • 改进了某些情况下 GROUP BY 下的扫描性能。

版本 1:2019 年 6 月 18 日

  • 包括许多基于规则的优化,例如谓词下推、限制下推、冗余联接和冗余表达式移除等。

  • 使用有关用户数据的统计信息来选择要用于访问每个表的索引。

要根据您的情况管理优化器版本,请参阅管理查询优化器