基于成本的优化
查询优化是选择最有效或最有利的 SQL 语句执行方式的过程。查询优化是一门科学艺术,用于应用规则来重写查询中调用的运算符树并生成最佳计划。如果一个计划在最短的时间内或使用最少的空间返回答案,则称该计划是最优的。
基于成本的优化:
对于给定的查询和环境,优化器以数字形式分配与可能计划的每个步骤相关的成本,然后一起找到这些值以获得计划或可能策略的成本估算。在计算所有可能的计划的成本后,优化器会尝试选择一个可能具有最低成本估计的计划。出于这个原因,优化器有时可能被称为基于成本的优化器。以下是基于成本的优化的一些功能 -
- 基于成本的优化基于要优化的查询的成本。
- 查询可以根据索引的值、可用的排序方法、约束等使用很多路径。
- 查询优化的目的是以算法的形式以可能的最低成本选择实现查询的最有效路径。
- 执行算法的成本需要由查询优化器提供,以便可以为操作选择最合适的查询。
- 算法的成本还取决于输入的基数。
费用估算:
为了估计不同可用执行计划或执行策略的成本,查询树被视为一个包含一系列基本操作的数据结构,这些操作被链接起来以执行查询。查询中存在的操作的成本取决于选择操作的方式,即形成输出的选择操作的比例。了解操作输出的预期基数也很重要。输出的基数非常重要,因为它构成了下一个操作的输入。
查询优化的成本取决于以下因素 -
- 基数-
基数已知是通过执行查询执行计划指定的操作返回的行数。基数的估计必须是正确的,因为它高度影响执行计划的所有可能性。 - 选择性-
选择性是指选择的行数。表中任何行或数据库中任何表的选择性几乎取决于条件。条件的满足将我们带到该特定行的选择性。要满足的条件可以是任何条件,具体取决于情况。 - 成本-
成本是指为优化系统而花费在系统上的金额。成本的衡量完全取决于完成的工作或使用的资源数量。
第一步是使用 ANALYZE TABLE COMPUTE STATISTICS SQL 命令来计算表统计信息。使用 DESCRIBE EXTENDED SQL 命令检查统计信息。
表统计:
可以为表、分区和列计算表统计信息,如下所示 -
- 表或表分区的总大小(以字节为单位)。
- 表或表分区的行数。
- 列统计信息,如 min、max、num_nulls、distinct_count、avg_col_len、max_col_len、直方图。
分析表计算统计 SQL 命令:
基于成本的优化使用存储在元存储中的统计信息,即使用 ANALYZE TABLE SQL 命令的外部目录 -
ANALYZE TABLE tableIdentifier partitionSpec;
COMPUTE STATISTICS (NOSCAN | FOR COLUMNS identifierSeq);
根据变体,ANALYZE TABLE 计算不同的统计信息,即表、分区或列 -
- ANALYZE TABLE 既没有 PARTITION 规范也没有 FOR COLUMNS 子句。
- 带有 PARTITION 规范的 ANALYZE TABLE(但没有 FOR COLUMNS 子句)。
- 带有 FOR COLUMNS 子句的 ANALYZE TABLE(但没有 PARTITION 规范)。
描述扩展 SQL 命令:
可以使用 DESCRIBE EXTENDED SQL 命令查看表、分区或列(存储在元存储中)的统计信息 -
(DESC | DESCRIBE) TABLE? (EXTENDED | FORMATTED);
tableIdentifier partitionSpec? describeColName;
查询执行的成本组成:
以下是执行查询的成本组成部分 -
- 二级存储的访问成本-
这可能是搜索、读取或写入最初在辅助存储(尤其是磁盘)上找到的数据块的成本。在文件中搜索记录的成本还取决于文件具有的访问结构的类型。 - 内存使用成本-
内存使用成本可以简单地通过使用执行查询所需的内存缓冲区数量来计算。 - 存储成本-
存储成本是存储由查询的执行策略生成的任何中间文件(处理输入的结果但不完全是结果的文件)的成本。 - 计算成本——
这是执行数据缓冲区中记录上可用的内存操作的成本。搜索记录、合并记录或排序记录等操作。这也可以称为 CPU 成本。 - 沟通成本-
这是与将查询及其结果从一个地方发送或传递到另一个地方相关的成本。它还包括在查询评估过程中将表和结果传输到各个站点的成本。
基于成本的优化中的问题:
以下是基于成本的优化中的问题-
- 在基于成本的优化中,可以考虑的执行策略的数量并不是真正固定的。执行策略的数量可能会因情况而异。
- 有时,这个过程确实非常耗时,因为它并不总能保证找到最佳的最优策略
- 这是一个昂贵的过程。