本页面介绍了 Spanner 查询优化器及其优势。
概览
Spanner SQL 查询优化器会将描述查询所需的数据的声明性 SQL 语句转换为命令式执行计划,描述一种精确获取这些数据的方法。将声明式语句转换为查询执行计划的过程涉及对用于表示查询的树结构执行转换。在生成执行计划的过程中,优化器会保留原始 SQL 查询的逻辑含义,以便返回正确的行。
优化器的另一个重要作用是生成高效的执行计划。
Spanner 优化器如何生成高效的执行计划?
Spanner 的优化器结合使用成熟的启发法和基于费用的优化来生成高效的计划。一些启发法非常简单,例如“在远程机器上执行过滤器,而不是将数据拉取到本地机器”。其他启发法更为复杂,但仍具有移动逻辑的原则,使得数据量更接近数据。在将数据分开存放在多台机器中的系统中,该原则尤其重要。
并非所有执行决策都可以通过此类固定规则有效做出,因此 Spanner 的优化器也会根据预估的替代费用做出决策。此类费用估算值根据查询的结构、数据库的架构以及查询片段将产生的数据量估算值计算得出。例如,Spanner 将估算 Songs 表有多少行符合过滤条件 SongGenre = "Country"
条件(如果该过滤条件出现在查询中)。为了帮助计算此类估算值,Spanner 会定期收集统计信息,以描述数据库中数据分布的特征。
此外,Spanner 会自动确定是否应为查询使用面向行或列的处理方法,从而优化查询执行。如需了解详情,请参阅优化扫描。
如需详细了解查询执行计划以及 Spanner 如何使用它们在分布式环境中执行查询,请参阅查询执行计划。
查询优化器版本控制
随着时间的推移,Spanner 查询优化器将不断完善,拓宽了查询执行计划中的选项集,并提高为这些选择提供依据的估算值的准确性,从而实现更高效的查询执行计划。
Spanner 会将优化器更新作为新的查询优化器版本发布,以提高其查询执行计划的效率。如需详细了解不同的版本,请参阅 Spanner 查询优化器版本。
查询优化器统计信息软件包
Spanner 维护有关表列的数据分布的统计信息,以帮助估算查询将生成多少行。查询优化器使用这些估算值来帮助选择最佳查询执行计划。Spanner 会定期更新这些统计信息。由于这些统计信息用于选择查询执行计划,因此在更新统计信息时,Spanner 可能会更改其用于查询的查询计划。
默认情况下,数据库会自动使用最新生成的统计信息软件包。您可以将数据库固定到较早的统计信息软件包版本。您还可以选择使用并非最新的统计信息软件包来运行个别查询。
构建新的统计信息软件包
Spanner 每三天会自动生成新的统计信息包。如需手动构建新的统计信息软件包,请使用 GoogleSQL ANALYZE
DDL 语句或 PostgreSQL ANALYZE
DDL 语句。
在对数据库的数据或架构进行重大更改后,构建新的统计信息软件包有助于提高查询性能。如果发生以下情况,最佳实践是构建新的统计信息软件包:
- 数据库需要处理大量的插入、更新或删除操作。
- 向数据库添加新索引。
- 您在表格中添加一个新列。
运行 ANALYZE
DDL 语句会更新您的架构,并启动长时间运行的操作。
Spanner 执行完语句后,查询优化器最多需要十分钟才能在其查询规划中考虑新的统计信息包。
统计信息软件包的垃圾回收
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,并且会计入您的总存储费用。
后续步骤
- 如需详细了解查询优化器的历史记录,请参阅查询优化器版本历史记录。
- 要管理适用于您的场景的优化器版本和统计信息软件包,请参阅管理查询优化器。