了解您的数据库管理系统及其优化器

PostgreSQL

模式

物品具有唯一标识符、唯一图像标识符、名称和价格。

仓库具有唯一标识符、名称以及由街道、城市和国家定义的位置。

对于每个可用的物品,我们记录每个仓库中的库存数量。如果某个物品在仓库中不可用,则这对没有记录。数量总是等于或大于1。

PostgreSQL 内部

在印度尼西亚有多少单位的阿司匹林库存?

PostgreSQL架构包括以下组件。 SQL解析器和重写器接收SQL查询并将其转换为准备优化的解析树。 规划器/优化器生成查询执行计划。 执行引擎执行计划。 内存和存储管理系统管理主存储和辅助存储。

规划器/优化器生成查询执行计划。它使用目录和统计信息来设计候选计划并估算各自的成本。它选择估计成本最低的计划。

执行计划是一个有向无环图或物理代数运算符的树,如顺序扫描、索引扫描、排序和聚合运算符、嵌套循环、哈希和合并连接。

执行引擎执行计划,访问数据和索引并执行必要的运算符、函数和程序。

pgAdmin 4指示的总查询时间包括查询规划时间、查询执行时间、网络延迟和客户端开销。

Explain

EXPLAIN命令生成并显示PostgreSQL规划器为提供的语句生成的带注释的执行计划。

带(VERBOSE)选项的EXPLAIN命令显示带有更多细节的带注释的执行计划。

EXPLAIN命令仅支持以下SQL构造:SELECT, INSERT, UPDATE, DELETE, EXECUTE(预备语句的执行)、CREATE TABLE 和 DECLARE(游标的声明)

在计划的每个节点,EXPLAIN提供三个估算:成本、行数、宽度。

  • 成本:成本属性是执行节点(及其子节点)在查询执行计划中的估计启动(在产生任何输出之前)成本和总成本。这两种成本用任意单位(大致与估计时间成比例)表示。成本越低通常表示计划更高效。成本包括估计的中央处理单元成本和与执行节点相关的估计的主要和次要输入输出成本。它们不包括传输到客户端的成本。
  • 行数:行数属性是节点返回的估计行数。
  • 宽度:宽度属性是节点产生的行的估计平均宽度(以字节为单位)。

行数和宽度的乘积估计了结果集的总数据量。

执行计划是由执行引擎执行的计划。规划器/优化器已使用估算来选择查询的执行计划。 估算可能不总是与实际运行时行为匹配。

通过考虑执行计划和估算,程序员获得了数据库引擎如何操作数据、使用索引和执行其他操作来执行语句的见解,关于估计的成本,以及规划器/优化器可用的信息。程序员可以查看不同查询的执行计划和估算,尝试了解如何在必要时调整SQL代码。

系统目录和统计数据

PostgreSQL查询规划器/优化器使用PostgreSQL构建(并维护)的目录和统计信息。 查看系统目录表和视图,如pg_tables、pg_attribute、pg_statistic和pg_stats。

例如,视图pg_stats记录Kota Kinabalu是w_city列的最常见值,估计频率为0.0059701493(在1005行的表中对应六次出现),其次是吉隆坡。 在其他统计信息中,它还记录了EXPLAIN的属性宽度中使用的列的平均宽度(9字节)。

ANALYZE

带(ANALYZE)的EXPLAIN命令执行查询并显示每一步的执行时间和行数。

这与ANALYZE命令不同。

在计划的每个节点,EXPLAIN (ANALYZE)提供四个测量值:实际时间、行数、循环次数和过滤器移除的行数。

  • 成本:实际时间属性是节点的平均启动和总执行时间(以毫秒为单位)。
  • 行数:行数属性是节点返回的行数。
  • 宽度:循环是节点(子计划)执行的次数。
  • 过滤器移除的行数:过滤器移除的行数是被条件过滤掉的行数。
  • 将节点的总实际时间与循环次数相乘,得到节点的总时间。

EXPLAIN (ANALYZE)给总时间增加了开销。

执行时间从一次执行到另一次执行会有所不同。必须平均这些测量值。

成本和实际时间以不同的单位表示。如果估计良好,它们应该大致相当。

EXPLAIN (ANALYZE)还给出了规划和执行时间。执行时间包括执行启动、关闭时间以及处理结果行所花费的时间。

其他EXPLAIN选项包括COSTS, SETTINGS, GENERIC_PLAN, BUFFERS, WAL, TIMING, SUMMARY, 和 FORMAT { TEXT | XML | JSON | YAML }。 为了很好地理解性能,程序员应该多次运行查询并查看平均值。收集统计数据。页面被带到主内存缓冲区。VACUUM, ANALYZE, 和 VACCUM ANALYZE命令重新组织数据并收集统计信息。成本、时间和计划随之改变(得到改善)。

pgAdmin 4

pgAdmin 4的工具栏中的Explain和Explain Analyze按钮分别生成执行计划和生成并执行执行计划。可以切换解释选项。

图形化

“Explain > Graphical”标签显示执行计划的图形版本。可以以可伸缩矢量图形(.svg)格式下载。

统计

“Explain > Statistics”和“Explain > Statistics”标签显示分析和进一步的统计,特别是在分析模式下。

顺序扫描

找出新加坡市的仓库名称

Postgres默认页面大小为8KB。

如果统计数据表明需要检索的数据量大或分散,并且如果不可能或不值得尝试准备并使用顺序扫描以外的其他方法,则优化器会使用顺序扫描。

排序

为什么这是不良优化?

索引

索引是指导数据访问的数据结构。索引可能加速或不加速查询、删除和更新。它通常会减慢插入和更新的速度(因为必须更新数据和索引,并可能需要重新组织)。

  • PostgreSQL支持B-tree(默认)、Hash、广义搜索树(GiST)、空间划分广义搜索树(SP-GiST)、广义倒排(GIN)和块范围(BRIN)索引。
  • 在PostgreSQL中,索引是次要的,即它们独立于表存储。通常,在搜索索引时,必须从索引和表(堆)中获取数据。尽管满足某一条件的索引条目通常位于彼此附近,但相应的表行可能位于任何地方。
  • PostgreSQL支持仅通过索引解答查询的索引仅扫描。当查询仅引用存储在索引中的列时,即当索引是覆盖索引时,索引仅扫描适用于B-tree索引(有时适用于其他索引)。

PostgreSQL自动为每个唯一和主键约束创建一个B-tree唯一索引。索引强制实施唯一性(对插入和更新额外成本)。

索引是唯一或主属性的覆盖索引。

  • PostgreSQL不为外键约束创建索引。

设计者决定是否在引用列上创建索引以及创建什么索引。引用表的插入和更新需要扫描引用表。在引用列上创建索引可能是个好主意。然而,外键属性通常是(复合)键的组成部分,因此作为此类索引。

目录表和视图pg_index和pg_indexes存储数据库中索引的信息。 我们创建一个视图,从目录表和视图中收集有关索引的信息。

我们可以在items的i_price属性上创建一个索引。

我们在PostgreSQL的CREATE INDEX命令中突出显示了一些重要参数。

  • UNIQUE检查重复值。
  • method可以是btree(默认)、hash、gist和其他索引类型(见上文)。
  • predicate定义了一个部分索引。

索引扫描

创建索引-查询

找出标识符为123的仓库的名称。

如果统计数据表明需要检索的数据量很小且可用索引提供直接访问,则优化器使用索引扫描。

位图堆扫描-创建索引

在warehouse的w_city属性上创建一个B-tree索引(默认)。

位图索引扫描

如果统计数据表明需要检索的数据量适中且可用索引,则基于索引构建的位图可能提供某种直接访问。优化器使用位图堆扫描。

位图索引扫描通过PostgreSQL中的位图索引扫描后跟位图堆扫描来实现。位图索引通常用于存在多个条件或处理低基数列时。

我们可以使用索引对表进行聚类。如果有更新,这需要定期进行。Postgres不会动态维护聚类表!

多列索引

多列索引可用于索引扫描。

即使只有部分条件,也可以使用多列索引进行索引扫描。

这只有在条件涉及多列索引的前缀(从左到右的属性)时才有效。

索引仅扫描

根据查询,扫描可能仅在索引内完成,而无需访问数据。这称为索引仅扫描。

同样,对于多列索引,这取决于前缀

可以通过在索引中包含更多列来促进索引仅扫描

何时发生?

找出物品和仓库,其中物品数量低于100。

1. 顺序扫描 

2. 创建索引

在stocks的s_qty属性上创建一个B-tree索引。

有了索引和充分的统计数据,优化器可以选择使用从索引构造的位图。

即使有了索引和充分的统计数据,优化器也可以选择顺序扫描。

有了索引和充分的统计数据,优化器可以选择使用索引进行索引扫描,但它没有...

条件不具选择性

s.s_qty >= 100:估计有38222行中的44912行(85%)满足条件。 优化器选择顺序扫描。

条件适度选择性

s.s_qty < 100:估计有6690行中的44912行(15%)满足条件。 优化器选择位图堆扫描。

条件非常选择性

s.s_qty >= 1000:估计有37行中的44912行(不到0.1%)满足条件。优化器曾经选择索引扫描,但现在选择位图堆扫描。

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

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

相关文章

[Angular 基础] - 自定义指令,深入学习 directive

[Angular 基础] - 自定义指令&#xff0c;深入学习 directive 这篇笔记的前置笔记为 [Angular 基础] - 指令(directives)&#xff0c;对 Angular 的 directives 不是很了解的可以先过一下这篇笔记 后面也会拓展一下项目&#xff0c;所以感兴趣的也可以补一下文后对应的项目&a…

排序和查找算法

一、排序算法 1.快速排序 不稳定&#xff0c;时间复杂度最理想 O(nlogn) 最差时间O(n^2) package com.test;public class fasf{/*** 快速排序* param args*/public static void main(String[]args){//不用设置大小int [] num{3,6,5,4,7,2,9};fasf fnew fasf();f.quicksort(n…

ZS Associates致盛咨询是什么公司?排名怎么样?

随着商业化时代的加速演进&#xff0c;咨询公司在企业发展中的“智囊团”角色愈发突显。对于医药企业来说&#xff0c;一个优秀的咨询团队不仅可以帮助推动整体战略转型及内部改革&#xff0c;还对药品研发、营销起到优化促进作用。 那什么样的咨询企业可称之为优秀的咨询企业…

6.网络游戏逆向分析与漏洞攻防-游戏网络架构逆向分析-通过逆向分析确定游戏明文发送数据过程

内容参考于&#xff1a;易道云信息技术研究院VIP课 上一个内容&#xff1a;测试需求与需求拆解 在开始之前要了解一个小知识&#xff0c;在逆向开始之前要很清楚知道要找的东西是什么&#xff0c;大概长什么样子&#xff0c;只有这样才能看到它第一眼发现它&#xff0c;现在我…

129 Linux 系统编程7 ,make 的编写和解析

前文中&#xff0c;我们有多少个.c文件&#xff0c;就需要build 出来多少个.o文件 假设我们的项目很大&#xff0c;怎么管理这些 .c文件呢&#xff1f; 这里就要学习一个make文件的编写了。 makefile 本质上是一个脚本语言 脚本语言实际上就是将一系列命令放在一起执行 mak…

Jetson Xavier NX 与笔记本网线连接 ,网络共享,ssh连接到vscode

Jetson Xavier NX 与笔记本网线连接 &#xff0c;网络共享&#xff0c;ssh连接到vscode Jetson Xavier NX桌面版需要连接显示屏、鼠标和键盘&#xff0c;操作起来并不方便&#xff0c;因此常常需要ssh远程连接到本地笔记本电脑&#xff0c;这里介绍一种连接方式&#xff0c;通过…

如何不患心肌梗塞

目录 一&#xff0c;个人面板 二&#xff0c;公共版图 三&#xff0c;卡牌 1&#xff0c;食物牌 2&#xff0c;药物牌 3&#xff0c;事件牌 四&#xff0c;回合操作 1&#xff0c;起始玩家 2&#xff0c;一轮操作 3&#xff0c;个人回合 4&#xff0c;轮末结算 5&a…

Vision Transfomer系列第二节---Tricks测试

目录 学习式和固定式位置编码测试dropout的作用测试block深度的作用测试embeding维度大小的作用测试多头的作用测试Overlap Patch的作用 学习式和固定式位置编码测试 主要测试无位置编码\可学习位置编码和固定式位置编码的训练效果: 其中固定式位置编码采用之前博客的正余弦位…

第十一天-Excel的操作

目录 1.xlrd-Excel的读模块 安装 使用 获取工作簿 读取工作簿的内容 xlsxwriter-Excel的写模块 安装 使用 生成图表 add_series参数 图表的样式 demo&#xff1a;生成图表 Excel的操作在python中有多个模块&#xff0c;为了能够快速使用&#xff0c;选择了相对简单…

【Docker】初学者 Docker 基础操作指南:从拉取镜像到运行、停止、删除容器

在现代软件开发和部署中&#xff0c;容器化技术已经成为一种常见的方式&#xff0c;它能够提供一种轻量级、可移植和可扩展的应用程序打包和部署解决方案。Docker 是目前最流行的容器化平台之一&#xff0c;它提供了一整套工具和技术&#xff0c;使得容器的创建、运行和管理变得…

想设计智能手环,我需要设计哪种电路?

随着电子技术的高速发展&#xff0c;可穿戴设备逐渐火爆&#xff0c;其中之一是智能手环&#xff0c;作为现代可穿戴技术的热门产品之一&#xff0c;它集成了多种功能&#xff0c;如健康检测、运动跟踪、通知提醒等&#xff0c;为了实现这些功能&#xff0c;需要用上哪些电路模…

模板注入 [WesternCTF2018]shrine1

打开题目 直接查看源代码 发现注册了一个名为FLAG的config&#xff0c;这里可能有flag&#xff0c; 存在flask-jinja2模板注入&#xff0c; 并且存在黑名单过滤 输入shrine/{{7*7}}验证成功 通过url_for()与globals()函数&#xff0c;绕过黑名单 /shrine/{{url_for.__globa…

Android 输入法框架简介

每种平台都有自己的输入法框架. GNU/Linux 桌面环境有多种输入法框架, 比如 ibus, fcitx 等. 但是 Android 操作系统只有一种, 是统一提供的输入法框架. 相关链接: 《ibus 源代码阅读 (1)》 https://blog.csdn.net/secext2022/article/details/136099328https://developer.and…

2024年 最新python调用ChatGPT实战教程

2024年 最新python调用ChatGPT实战教程 文章目录 2024年 最新python调用ChatGPT实战教程一、前言二、具体分析1、简版程序2、多轮对话3、流式输出4、返回消耗的token 一、前言 这个之前经常用到&#xff0c;简单记录一下,注意目前chatgpt 更新了&#xff0c;这个是最新版的&am…

MIT-BEVFusion系列九--CUDA-BEVFusion部署4 c++解析pytorch导出的tensor数据

目录 创建流打印 engine 信息打印结果内部流程 启动计时功能加载变换矩阵并更新数据&#xff08;重要&#xff09;内部实现 该系列文章与qwe一同创作&#xff0c;喜欢的话不妨点个赞。 在create_core方法结束后&#xff0c;我们的视角回到了main.cpp中。继续来看接下来的流程。…

挑战杯 基于大数据的时间序列股价预测分析与可视化 - lstm

文章目录 1 前言2 时间序列的由来2.1 四种模型的名称&#xff1a; 3 数据预览4 理论公式4.1 协方差4.2 相关系数4.3 scikit-learn计算相关性 5 金融数据的时序分析5.1 数据概况5.2 序列变化情况计算 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &…

【操作系统】14.I/O设备怎么分配和回收?

5.2 I/O设备怎么分配和回收&#xff1f; 5.2.1 I/O核心子系统 I/O调度 设备保护 假脱机技术&#xff08;SPOOLing技术&#xff09; ​ 输入井和输出井 ​ 输入进程和输出进程 ​ 输入缓冲区和输出缓冲区 设备分配与回收 ​ 设备分配应考虑的因素 ​ 静态分配与动态分配 ​ 设备…

Runaway Queries 管理:提升 TiDB 稳定性的智能引擎

在数字化系统扮演重要角色的今天&#xff0c;数据库稳定性成为企业关注的核心问题。对于重要计算机系统而言&#xff0c;突发的性能下降可能对业务造成不可估量的损失。为了稳定数据库性能&#xff0c;用户可以从管理流程入手规范变更的测试&#xff0c;或者利用产品手段减少预…

3DIoUMatch: Leveraging IoU Prediction for Semi-Supervised 3D Object Detection

3DIoUMatch: Leveraging IoU Prediction for Semi-Supervised 3D Object Detection 论文链接&#xff1a;https://arxiv.org/pdf/2012.04355.pdf 代码链接&#xff1a;https://github.com/yezhen17/3DIoUMatch 作者单位&#xff1a;Stanford University等 发表平台&#xff1a;…

【JavaEE】_Servlet程序的编写方法

目录 1. 创建项目 2. 引入依赖 3. 创建目录结构 3.1 在main目录下创建一个webapp目录 3.2 在webapp目录下创建一个WEB-INF目录 3.3 在WEB-INF目录下创建一个web.xml文件 3.4 在web.xml中进行代码编写 4. 编写代码 4.1 在java目录下创建类 4.2 打印"hello world&…