本页面介绍了 Spanner 查询优化器及其优势。查询优化器适用于 GoogleSQL 方言数据库和 PostgreSQL 方言数据库。
概览
Spanner SQL 查询优化器会将描述查询所需数据的声明式 SQL 语句转换为命令式执行计划,以描述一种精确获取该数据的方式。将声明式语句转换为查询执行计划的过程涉及对用于表示查询的树结构执行转换。在生成执行计划的过程中,优化器会保留原始 SQL 查询的逻辑含义,以便返回正确的行。
优化器的另一个重要作用是生成高效的执行计划。
Spanner 优化器如何生成高效的执行计划?
Spanner 的优化器结合使用成熟的启发法和基于成本的优化来生成高效的计划。一些启发法非常简单,例如“在远程机器上执行过滤器,而不是将数据拉取到本地机器”。其他启发法更为复杂,但仍体现了将可减少数据量的逻辑移动到更接近数据的位置的原则。在多台机器间对数据进行分片的系统中,该原则尤其重要。
并非所有执行决策都可以通过此类固定规则来高效地做出,因此 Spanner 的优化器也会根据替代方案的估算成本做出决策。此类成本估算值是根据查询的结构、数据库的架构以及由查询片段生成的数据量估算值进行计算得出的。例如,Spanner 会估算 Songs 表中有多少行满足过滤条件 SongGenre = "Country"
(如果该过滤条件出现在查询中)。为了帮助计算此类估算值,Spanner 会定期收集统计信息,以描述数据库中数据的分布特征。
此外,Spanner 还会自动确定是否应对查询使用面向行或面向列的处理方法,从而优化查询执行。如需了解详情,请参阅优化扫描。
如需详细了解查询执行计划以及 Spanner 如何使用它们在分布式环境中执行查询,请参阅查询执行计划。
查询优化器版本控制
随着时间的推移,Spanner 查询优化器会不断发展,扩大了查询执行计划中的选项集,并提高了传达这些选项的估算值的准确性,从而生成更高效的查询执行计划。
Spanner 会以新查询优化器版本的形式发布优化器更新,以提高其查询执行计划的效率。如需详细了解不同版本,请参阅 Spanner 查询优化器版本。
查询优化器统计信息软件包
Spanner 会维护有关表列数据分布的统计信息,以帮助估算查询将生成的行数。查询优化器使用这些估算值来帮助选择最佳查询执行计划。Spanner 会定期更新这些统计信息。由于统计信息用于选择查询执行计划,因此在更新统计信息时,Spanner 可能会更改其用于查询的查询计划。
默认情况下,数据库会自动使用最新生成的统计信息软件包。您可以将数据库固定到较早的统计信息软件包版本。您还可以选择使用并非最新的统计信息软件包来运行个别查询。
构建新的统计信息软件包
Spanner 会每 3 天自动生成新的统计信息软件包。如需手动构建新的统计信息软件包,请使用 GoogleSQL ANALYZE
DDL 语句或 PostgreSQL ANALYZE
DDL 语句。
对数据库的数据或架构进行重大更改后,构建新的统计信息软件包有助于提升查询性能。作为最佳实践,如果发生以下情况,请构建新的统计信息软件包:
- 数据库处理大量插入、更新或删除操作。
- 您向数据库添加新索引。
- 您向表添加新列。
运行 ANALYZE
DDL 语句会更新架构,启动一个长时间运行的操作,并取消创建任何自动触发的统计信息。
Spanner 执行完该语句后,查询优化器最多需要 10 分钟才能在其查询规划中考虑新的统计信息软件包。
统计信息软件包的垃圾回收
Spanner 中的统计信息软件包在创建后会保留 30 天,之后会进行垃圾回收。
Spanner 内置的 INFORMATION_SCHEMA.SPANNER_STATISTICS
表包含可用统计信息软件包的列表。此表中的每一行按名称列出一个统计信息软件包,且名称包含给定软件包的创建时间戳。每个条目还包含一个名为 ALLOW_GC
的字段,用于定义是否可以对软件包进行垃圾回收。
您可以将整个数据库固定到该表中列出的任何一个软件包。固定的统计信息软件包不会被垃圾回收,并且只要将数据库固定到此软件包,ALLOW_GC
的值就会被忽略。 如需将特定统计信息软件包用于个别查询,该软件包必须通过 ALLOW_GC=FALSE
列出或已固定。这可防止查询在统计信息软件包进行垃圾回收后失败。您可以使用 GoogleSQL ALTER STATISTICS
或 PostgreSQL ALTER STATISTICS
DDL 语句更改 ALLOW_GC
的值。
软件包保留和个人身份信息 (PII)
根据标准行业做法,统计信息软件包包含列数据的直方图。这有助于查询优化器选择最佳查询计划。直方图是使用值的小样本构建的。这个小数据集可能包含个人身份信息。
Spanner 会定期创建新的统计信息软件包,并且默认保留 30 天。因此,从数据库中删除的值的小样本可能会在统计信息直方图中额外保留 30 天。使用 optimizer_statistics_package
数据库选项固定的统计信息软件包或使用 ALLOW_GC=FALSE
选项固定的软件包不会进行垃圾回收。这些软件包中的直方图可能会长期包含从数据库中删除的值。此外,统计信息软件包的内容包含在数据库备份中。
优化器统计信息在存储时会采用与用户数据相同的加密方式。
这些软件包所需的总存储空间量通常小于 100 MB,并且会计入您的总存储费用。