PostgreSQL执行计划:路径与代价计算

需积分: 0 0 下载量 61 浏览量 更新于2024-09-04 收藏 1.82MB PDF 举报
"SIX:path nacs - 本文档探讨了数据库系统中关于查询执行路径的成本计算、路径选择以及不同扫描方式的相关知识。主要涵盖了代价基准单位、Path结构、并行处理、扫描路径的种类等内容,特别关注了IO代价、CPU基准代价以及扫描路径在普通表上的应用。" 在PostgreSQL这样的关系型数据库管理系统中,优化器通过估计各个执行路径的代价来选择最佳的执行计划。本文档深入讲解了这一过程的关键方面。 6.1 成本计算 在PostgreSQL中,成本计算是基于一种相对代价模型,因为硬件性能差异很大,无法给出绝对的执行时间。代价被量化为一种虚拟的单位,通常将顺序读取一个页面的成本设为1。这允许在同一个查询的不同执行路径之间进行比较,而不受具体硬件配置的影响。 6.1.1 代价基准单位 - **基于页面的IO基准代价**:默认情况下,顺序读取一个页面的成本为1,而随机读取页面的成本为4,这是因为随机IO需要更多的寻道时间。 - **CPU基准代价**:包括基于元组、表达式以及并行查询的代价。这些代价估算涉及CPU的计算工作量。 - **缓存影响**:磁盘的缓存机制可以显著降低IO代价,因为它减少了直接访问磁盘的次数。 6.1.2 Startup和Total 代价分为启动代价(Startup)和总代价(Total)。启动代价是指执行路径开始时的一次性成本,如打开文件或初始化数据结构。总代价则考虑了整个执行过程的累积成本。 6.1.3 表达式代价的计算 对于包含复杂表达式的查询,优化器会估算执行这些表达式所需的成本。 6.2 Path - **Path结构体**:表示查询执行的一个可能路径,包括其操作类型、所需成本以及输出列等信息。 - **并行参数**:Path可以支持并行执行,这意味着多个线程可以同时处理一部分工作,以提高查询性能。 - **参数化路径**:允许路径使用变量,使得相同的路径可以用于不同的输入值,提高了路径的复用性。 - **PathKey**:用于描述路径处理后的数据排序信息,有助于优化器选择最合适的连接顺序。 6.3 `make_one_rel`函数 这个函数在生成单个关系(表)的执行路径时起关键作用,它根据表的特性(如索引、聚集等)构建可能的扫描路径。 6.4 普通表的扫描路径 - **顺序扫描(Seqscan)**:对堆表进行逐行扫描,是最基本的扫描方式。 - **索引扫描(Indexscan)**:利用索引来直接定位数据,包括B-tree、Gin、GiST等不同类型的索引。 - **位图扫描(Bitmapscan)**:适用于多索引场景,先构建位图,然后合并位图以找到匹配的行。 - **子查询扫描(Subqueryscan)**:用于处理子查询的结果。 - **CTE扫描(Ctescan)**:处理公用表表达式(Common Table Expression)的结果。 6.4.1 顺序扫描 Seqscan适用于没有合适索引或全表扫描的场景,其代价包括读取页面的IO成本和处理每个元组的CPU成本。 这篇文章详细介绍了查询执行路径的代价估算、结构和选择,这些都是数据库优化器在生成高效执行计划时的重要依据。理解这些概念有助于提升SQL查询的性能,并优化数据库系统的整体运行效率。