关于查询优化器

什么是查询优化器?

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

优化工具的另一个重要作用是制定高效的执行计划。

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

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

并非所有执行决策都是可以使用此类固定规则来有效做出的,因此 Cloud Spanner 的优化器也会根据备选方案的估算费用来做出决策。这些费用估算值是根据查询的结构、数据库的架构以及查询的片段所产生数据量的估算值来计算的。例如,Cloud Spanner 将预估在歌曲列表有多少行满足过滤条件 SongGenre = "Country" 的条件(如果查询出现在该过滤条件中)。为了帮助计算此类估算值,Cloud Spanner 会定期收集统计信息,以描述数据库中数据的特征。

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

查询优化器版本控制

随着时间的推移,Cloud Spanner 查询优化器将不断完善,从而拓宽查询执行计划中的选项集,并提高为这些选择提供参考的估算值的准确度,从而实现更高效的查询执行计划。

Cloud Spanner 将优化器更新作为新的查询优化器版本发布,从而提高其查询执行计划的效率。如需详细了解不同版本,请参阅 Cloud Spanner 查询优化器版本

查询优化器统计信息软件包

Cloud Spanner 维护表列的数据分布统计信息,以帮助估算查询会生成的行数。查询优化器使用这些估算值来帮助选择最佳查询执行计划。Cloud Spanner 会定期更新这些统计信息。由于统计信息用于选择查询执行计划,因此统计信息更新时,Cloud Spanner 可以更改用于查询的查询计划。

默认情况下,数据库会自动使用最新生成的统计信息软件包。您可以将数据库固定到较早的统计信息软件包版本。您还可以选择使用并非最新的统计信息软件包来运行个别查询。

统计信息软件包的垃圾回收

Cloud Spanner 每 3 天更新一次统计信息软件包。较旧的软件包在创建后会保留 30 天,之后会被垃圾回收。

Cloud Spanner 内置的 INFORMATION_SCHEMA.SPANNER_STATISTICS 表包含可用统计信息软件包的列表。此表中的每一行按名称列出一个统计信息软件包,且名称包含给定软件包的创建时间戳。每个条目还包含一个名为 ALLOW_GC 的字段,用于定义是否可以对软件包进行垃圾回收。

您可以将整个数据库固定到该表中列出的任何一个软件包。只要数据库固定到此软件包,固定统计信息软件包就不会被垃圾回收,ALLOW_GC 的值会被忽略。如需将特定统计信息软件包用于个别查询,该软件包必须通过 ALLOW_GC=FALSE 列出或已固定。这样可以防止在统计信息包被垃圾回收后查询失败。您可以使用 ALTER STATISTICS DDL 语句更改 ALLOW_GC 的值。

软件包保留和个人身份信息 (PII)

根据标准行业做法,统计信息软件包包含列数据的直方图。这有助于查询优化器选择最佳查询计划。直方图是使用值的小样本构建的。这个小数据集可能包含个人身份信息。

默认情况下,Cloud Spanner 会创建一个新的统计信息软件包,并将其保留 30 天。因此,一小部分从数据库中删除的值样本可能会在统计信息直方图中额外保留 30 天。使用 optimizer_statistics_package 数据库选项固定的统计信息软件包或具有 ALLOW_GC=FALSE 选项的软件包不会被垃圾回收。 这些软件包中的直方图可能会包含更长时间从数据库中删除的值。此外,数据库备份中包含统计信息软件包的内容。

优化器统计信息在存储时会采用与用户数据相同的加密方式。

这些软件包所需的总存储空间通常小于 100 MB,但会占用您的总存储空间费用。

后续步骤