OpenGuass 之顺序扫描和索引扫描的代价估算

一. 前言

        在OepnGuass中,一条路径的执行代价估算值将直接决定一条路径是否会被取舍。本文主要对OpenGuass中对于普通表的顺序扫描和索引扫描两种路径的的代价估算进行代码走读了解代价估算的整体过程。

二. 顺序扫描代价估算

      顺序扫描的路径代价估算在OpenGuass中实现还是比较简单的,其实现是在函数cost_seqscan中实现的,其计算公式为:

     顺序扫描的代价 = 顺序扫描Page的数量 * 每个顺序扫描Page的代价 / dop + 表的总行数 * 每个元组的处理代价

     上述各元素的获取:

     顺序扫描Page的数量: pg_class中的relpages 字段值

     顺序扫描Page的代价 : 默认为1

     dop: 路径并发度

     表的总行数: 路径的行数,大小为pg_class的reltuples字段值

     每个元组的处理代价: 默认为0.0125

三. 索引扫描代价估算

       索引扫描的代价估算较为复杂,其只要是在cost_index函数实现的,其实只要核心的计算方法是在btcostestimate_internal的方法中,其计算公司如下所示:

       索引扫描的代价 = 扫描Page的数量 * 扫描Page的代价 + 元组数量总数 * 谓词过滤率 * 每个元组的处理代价 + 谓词中数组的长度* 100 * 每次CPU操作的代价 + IO的代价估算

      上述中各元素获取如下:

      扫描Page的数量 : pg_class系统表的的relpages字段中值

      扫描Page的代价 : 索引扫描Page的代价默认为4

      元组数量总数: pg_class的reltuples字段的值

      谓词过滤率 : 在函数clauselist_selectivity中估算

      每个元素的处理代价:默认为(0.0025 + 0.005)

      谓词中数组的长度: 如果谓词中有数组的场景,则为数组的长度,比如 where id = any(array[1, 2, 3]) 为3, 如果没有数组,则为1

      每次CPU操作的代价: 默认为0.0025

      IO的代价估算:max_IO_cost + csquared * (min_IO_cost - max_IO_cost)

          其中: max_IO_cost : 估算最大扫描的索引的IO代价,通过一个较复杂的计算公式算出最大扫描的索引的页面数量 * 扫描Page的代价,计算公司参考index_pages_fetched

         csquared :索引相关性,一般为1

         min_IO_cost :估算最小扫描的索引的IO代价,索引的页面数 * 谓词过滤率 * 扫描Page的代价

四. 两种路径代价对比

      从上边的计算公式也可以看到,虽然索引扫描的路径代价会被谓词过滤率过滤掉一部分数据,但是也增加了一些索引Page的扫描开销,因此实际上索引扫描的代价未必会比顺序扫描小,比如如下场景就因为顺序扫描代价较小从未选择的顺序扫描执行:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/329374.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何找到 niche 出海细分市场的 IDEA

先说结论就是:看榜单 Why:为什么看榜单? 大家会问为什么?原因很简单: 熟读唐诗三百首,不会作诗也会吟不天天看榜单上相关的优秀同行,你想干啥 心法就是下苦功夫坚持,量变引起质变…

经典八股文之RocketMQ

核心概念 NameServer nameserver是整个rocketmq的大脑,是rocketmq的注册中心。broker在启动时向所有nameserver注册。生产者在发送消息之前先从 NameServer 获取 Broker 服务器地址列表(消费者一 样),然后根据负载均衡算法从列表中选择一台服务器进行消…

通用web自动扩缩容_智能运维引擎CudgX

一、概述 CudgX是星汉未来自主研发的面向云原生时代的智能运维引擎,支持根据 MetricQPS 分段耗时指标进行自动扩缩容。 通过各类服务的多维度、大规模的日志数据采集以及机器学习训练分析,对服务进行数字化、指标化度量,并基于部署的…

现有网络模型的使用及修改(VGG16为例)

VGG16 修改默认路径 import os os.environ[TORCH_HOME] rD:\Pytorch\pythonProject\vgg16 # 下载位置太大了(140多G)不提供直接下载 train_set torchvision.datasets.ImageNet(root./data_image_net, splittrain, downloadTrue, transformtorchvis…

PHP文件代码加密系统,可批量全开源

代码文件加密系统 在程序运行时,实质上是在执行机器码,而虚拟机语言的基本概念是将程序加密到一定程度,也就是说,经过加密的PHP程序在执行时会被解密成opcode继续执行。 PHP在执行时会生成opcode,然后由Zend虚拟机继…

PiflowX组件 - Filter

Filter组件 组件说明 数据过滤。 计算引擎 flink 组件分组 common 端口 Inport&#xff1a;默认端口 outport&#xff1a;默认端口 组件属性 名称展示名称默认值允许值是否必填描述例子conditioncondition“”无是过滤条件。age > 50 or age < 20 Filter示例…

Docker安装WebRTC下TURN服务

详细实现方式以及代码下载请前往 https://www.passerma.com/article/90 实现效果 一、手动构建镜像 1.新建Dockerfile文件 文件用于编译镜像 以alpine为基础镜像 添加coturn需要的依赖库 获取coturn并进行编译 通过start.sh启动turnserver服务 Dockerfile FROM alpineRUN ap…

Java学习苦旅(二十七)——Java中的集合框架

本篇博客将初略讲解Java中的集合框架及背后的数据结构。 集合框架介绍 Java 集合框架 Java Collection Framework&#xff0c;又被称为容器 &#xff08;container&#xff09;&#xff0c;是定义在java.util包下的一组接口 interfaces 和其实现类 classes 。其主要表现为将多…

OpenHarmony南向之LCD显示屏

OpenHarmony南向之LCD显示屏 概述 LCD&#xff08;Liquid Crystal Display&#xff09;驱动&#xff0c;通过对显示器上下电、初始化显示器驱动IC&#xff08;Integrated Circuit&#xff09;内部寄存器等操作&#xff0c;使其可以正常工作。 HDF Display驱动模型 LCD器件驱…

大数据时代的WEB运维高级架构师,Web系统运维工程师的实战成长之路

一、教程描述 本套WEB架构师教程&#xff0c;大小30.61G&#xff0c;共有183个文件。 二、教程目录 01-Web架构之单机时代&#xff08;共7课时&#xff09; 02-Web架构之集群时代&#xff08;共9课时&#xff09; 03-Web架构之DNS&#xff08;共6课时&#xff09; 04-Web…

【攻防世界】Reverse——secret-galaxy-300 writeup

由main函数查看相关代码&#xff0c;但是代码中并没有直接的关于flag的信息&#xff1a; int __cdecl main(int argc, const char **argv, const char **envp) {__main();fill_starbase(&starbase);print_starbase((int)&starbase);return 0; } void __cdecl fill_sta…

MYSQL InnoDB引擎

逻辑存储结构 架构 内存架构 磁盘结构 后台线程 事务原理 redolog undo log MVCC 基本概念 实现原理 隐藏字段 undo log readview