postgresql优化案例三:recheck cond

2023-11-03

1.SQL语句

delete from sap_dispatchingd_hist a
       where exists (select 1 
                       from sap_dispatchingm_hist b 
                      where a.ffact_no=b.ffact_no
                        and a.fsfc_no=b.fsfc_no
                        and b.fsfc_date <to_char(current_date -365,'yyyymmdd') );

2.查看改善前执行计划:

在这里插入图片描述
在上图执行计划中看到虽然pg选择使用bitmap的方式,同时使用了recheck cond,我们来看看recheck cond的定义:
It is a potential re-check of the condition that is not always performed.
Only if the bitmap is lossy (which EXPLAIN (ANALYZE) will indicate) the recheck is performed.
A bitmap index scan becomes lossy if work_mem is not big enough to contain a bitmap that contains one bit per table row. It will then degrade to one bit per 8K page. Rows from such blocks will have to be rechecked.
简单来说就是work_mem不足以放下bitmap時,會變為lossy模式,即從原來的每一行建立bit位变為每一頁建立bit位,這里的頁指包含匹配行的页

3.解决方案

3.1增加work_mem的size

默认是4MB,可以使用如下语句设定到期望的值,这里是设到64M

SET work_mem = 65536;

3.2.创建合适的索引

增加work_mem的size能够帮助解决问题,但是还是建议不要轻易使用,而应该首先优化sql或者索引,由于执行计划中使用的索引是idx_sap_dispatchingm_hist_01,我们看看这个索引的结构

relnamespace |               relname                |   attname   | attnum
--------------+--------------------------------------+-------------+--------
 wmspci_app   | idx_sap_dispatchingm_hist_01         | ffact_no    |      1
 wmspci_app   | idx_sap_dispatchingm_hist_01         | fsfc_no     |      2
 wmspci_app   | idx_sap_dispatchingm_hist_01         | fsfc_date   |      9

可以看到idx_sap_dispatchingm_hist_01索引是一个组合索引,由三个子段组成(ffact_no,fsfc_no,fsfc_date),但是执行计划建立bitmap时实际只是用了fsfc_date,因此,我们将只在这个字段建立索引,这样可以减少bitmap的大小

create index idx_sap_dispatchingm_hist_02 on sap_dispatchingm_hist(fsfc_date)

再来看看改善后执行计划

4.改善后执行计划

在这里插入图片描述
从上图可以看出,创建合适的索引后,pg不再使用bitmap方式

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

postgresql优化案例三:recheck cond 的相关文章

  • 如何在 JSON Postgres 数据类型列中搜索特定字符串?

    我有一个名为params在名为的表中reports其中包含 JSON 我需要找到 JSON 数组中任何位置包含文本 authVar 的行 我不知道文本可能出现的路径或级别 我只想使用标准的 like 运算符搜索 JSON 就像是 SELEC
  • PostgreSQL 错误:EXECUTE 的查询字符串参数为空

    我有一个名为证据的表 其中有一个触发器调用一个存储过程 该过程基本上按月进行表分区 但是 当我开始在负载下插入大 量行时 出现了一个模糊的错误 Npgsql NpgsqlException query string argument of
  • sqlalchemy JSON查询没有特定键的行(键存在)

    当将 sqlalchemy 与 postgresql 一起使用时 我有以下表格和数据 id data 1 2 a 1 2 rows 如何找到没有键的行 例如 a 还是数据 a Give me all objects that does no
  • 如何按照最初给出的时区存储和显示日期?

    我有一台服务器正在从不同时区的客户端提供数据 数据源包含人物 他们的出生日期和其他事件日期 出于我们的目的 如果我们可以将日期存储为给我们的日期 那就很方便了 例如 如果客户位于加利福尼亚州 并且告诉我们该人的出生日期是 5 月 31 日
  • Postgres 服务器性能在达到一定数量的记录后急剧下降

    我正在使用游标从大型 postgres 表中检索记录 4亿条记录 使用子表对数据进行分区 我的游标定义为 select from parent table order by indexed column 同时使用 JDBC 和 psql 前
  • Laravel 5.3 Schema::create ENUM 字段是 VARCHAR

    我刚刚创建了新的迁移 运行后我看到了我的领域type 不是 ENUM 类型 它有一个改为 VARCHAR 255 类型 Schema create payments function Blueprint table table gt inc
  • PostGIS Homebrew 安装引用旧路径?

    我在 OS X Mountain Lion 上升级并随后安装了 PostGIS 和 PostgreSQL 当尝试使用 PostGIS 扩展时 我收到以下错误 ERROR could not open extension control fi
  • -bash:pg_dump:找不到命令

    我正在尝试在本地为我的 Rails 应用程序提取一个生产数据库 我本地的 postgres 版本太低 所以我需要从 9 4 1 更新到 Postgresql 9 6 5 我通过 Homebrew 安装了 Postgres 9 6 6 如下所
  • 从 INSERT 返回带有 ON CONFLICT 的行,无需更新

    我遇到的情况是 我经常需要从具有唯一约束的表中获取一行 如果不存在则创建它并返回 例如我的表可能是 CREATE TABLE names id SERIAL PRIMARY KEY name TEXT CONSTRAINT names na
  • 与 PostgreSQL CTE 的一般并行性

    我正在处理一些大数据 并且在查询中获取并行计划是必要的 我也很喜欢使用 CTE 来表达我的查询 但根据 PostgreSQL 的文档 我不太确定 CTE 是否对并行性造成严重限制 Here https www postgresql org
  • 在 postgreSQL 上选择大写表名不起作用[重复]

    这个问题在这里已经有答案了 我在 windows7 和 python3 4 4 上使用 psycopg2 我想从大写名称的表中获取数据 但我无法弄清楚 谁能帮我 总是这样返回relation table does not exist我想让
  • 执行 INSERT into 数据库后如何获取插入行的 id?

    我正在使用 c 11 和 pqxx 访问 postgresql 数据库 我需要插入行的 id 和标志 如果成功与否 执行 INSERT into 数据库后如何获取插入行的 id 我试图在网上找到例子但没有成功 work txn conn t
  • Postgres 简单的“数据透视表”

    如果我有一个这样的数据表 name type count test blue 6 test2 red 3 test red 4 我怎样才能查询它以获得一个表 name num red num blue test 4 6 test2 3 0
  • SQL:每天选择最接近特定时间的一条记录

    我有一张表存储某个时间点的值 CREATE TABLE values value DECIMAL datetime DATETIME 每一天可能有多个值 也可能某一天只有一个值 现在我想获取给定时间跨度 例如一个月 内最接近一天中给定时间的
  • PostgreSQL C 函数建议

    有人可以给我一个关于自定义函数的初步尝试的提示吗 我需要用 2 个参数构造查询 一个 varchar 和一个 unix 时间戳 一个整数 我花了 3 个小时才得到下面的几行结果 查询测试可以是 select from pdc posot c
  • PostgreSQL:左外连接语法

    我正在使用 PostgreSQL 8 4 6 和 CentOS 5 5 并有一个用户表 select from pref users where id DE2 id first name last name female avatar ci
  • 数据库错误:值对于类型字符变化来说太长(100)

    我有一个 Django 网站 运行我们几年前在内部构建的迷你 CMS 它使用 postgresql 保存简单的标题和一段文本时 出现以下错误 value too long for type character varying 100 奇怪的
  • 如何在 pgAdmin III 中为多个表生成 CREATE 脚本?

    在 pgAdmin III 中您可以 右键单击表格 scripts 创建脚本 从 SQL 编辑器保存脚本 如果必须对多个表执行此操作 是否有一种方法可以将脚本合并到一个文件中 除了手动复制粘贴它们之外 如果这可以通过 psql 提示符或 p
  • postgreSql 中特定时间后表更新

    我已经在 postgres 中创建了表 现在我想在特定时间 例如 1 小时 后更新一行 我看到很多问题 例如 https dba stackexchange com questions 56424 column auto updated a
  • 在 PostgreSQL 中使用月份名称排序

    我有一个表 其中有一个字段 Month Name 它包含月份的名称 我想按月份名称排序 不是按字母顺序 而是按实际顺序 例如一月 二月等 如何使用 PostgreSQL 实现此操作 有什么方法可以将月份名称转换为其数值吗 id billed

随机推荐

  • ajax.beginform insertionmode,MVC Ajax.BeginForm InsertionMode

    的JavaScript引用的文件 CSHTML页 using Ajax BeginForm new AjaxOptions UpdateTargetId result LoadingElementId progress InsertionM
  • 【C#学习笔记】保存文件

    using System using System Collections Generic using System ComponentModel using System Data using System Drawing using S
  • Windows下Qt静态编译全解

    Windows下Qt静态编译全解 2012 04 16 16 59 05 转载 标签 杂谈 分类 QT Windows下Qt静态编译全解 2010 09 08 13 42 分类 QT 编译准备 下载NOKIA网站上的QT SDK 解压或安装
  • pyautogui 的截图及图片匹配

    pyautogui 的截图 import pyautogui as pg 官网有提在不同的操作系统上 具体操作还不太一样 我的环境 win10 python3 9 截图需依赖 Pillow PIL 库 截全屏 pg screenshot 只
  • 渗透测试流程是什么?7个步骤给你讲清楚!

    在学习渗透测试之初 有必要先系统了解一下它的流程 静下心来阅读一下 树立一个全局观 一步一步去建设并完善自己的专业领域 最终实现从懵逼到牛逼的华丽转变 渗透测试是通过模拟恶意黑客的攻击方法 同时也是在授权情况下对目标系统进行安全性测试和评估
  • 移动端安卓文字垂直居中偏上偏移的解决方案

    移动web里小于12px的文字居中异常的问题 最后还是改为12px才近乎解决了问题 但是有时候或许并不是那么乐观 你并不能将原本定为10px的字体改为12px 那该怎么办呢 我们都知道 移动端为了高清屏显示1px的border 会有那么几种
  • 【Java】【NIO】【01】NIO设计理念

    什么是NIO NIO中的N 既有New的含义 也有Non blocking的含义 它是Java1 4之后推出来的一套非阻塞式IO接口 用于解决高并发 提升IO性能 NIO的主要改变 NIO主要的改变在于以下几点 通过Channel取代Str
  • python 测试开发岗 笔面试编程题

    题目网址 leetcode 题目名称 1 两数之和 3 无重复字符的最长子串 20 有效的括号 32 最长有效括号 53 最大子数组和 70 爬楼梯 80 删除有序数组中的重复项 II 83 删除排序链表中的重复元素 141 环形链表 20
  • loadrunner报错问题处理

    CPU使用率过高 Code 29723Error Failed to deliver a p2p message from parent to child process reason communication error Code 60
  • 医院信息化系统术语汇总

    以下文章来源于罗福如 作者Rolia 关于专业术语 每个领域都有领域中的专业术语 了解掌握也是为了工作上的沟通 让我们听懂同行说的话 也能展示自身具备专业知识 下面基本专业术语概念 从事智慧医疗 互联网医疗的你应该掌握 1 医院信息系统 H
  • idea热部署静态资源无法及时生效

    飘 Idea 每次修改JS文件都需要重启Idea才能生效解决方法 最近开始使用Idea 有些地方的确比eclipse方便 但是我发现工程每次修改JS或者是JSP页面后 并没有生效 每次修改都需要重启一次Tomcat这样的确不方便 我想Ide
  • 解决Access32位驱动器问题

    Access数据源驱动器是32位的 64位不支持 只要打开32位版本的ODBC管理工具就可以了 下面是我解决方法 打开这个就行了C Windows SysWOW64 odbcad32 exe
  • linux c++编程

    这本阿里P8撰写的算法笔记 再次推荐给大家 身边不少朋友学完这本书最后加入大厂 Github 疯传 史上最强悍 阿里大佬 LeetCode刷题手册 开放下载了 一 前提 以下环境均采用VMWare虚拟机安装CentOS6 6环境下编程 想要
  • 常用的linux命令还只能说出cd、ls?下次面试说出这几个命令提升你的层次吧!

    mpstat 显示各个可用CPU的状态 P 指定CPU编号 mpstat p 5 指定查看编号5CPU的状态 间隔时间 次数 mpstat 2 3 两秒一次合计输出三次 pidstat 显示指定进程CPU 内存 线程 设备IO等资源的占用情
  • 个人记账管理系统(大二第一学期JAVA期末项目)

    项目简介 设置账单条目Account类 定义属性 支出金额expend 收入金额income 时间datestr 账单条目备注remark 账单条目类型type 账单条目流水编号id 设置用户User类 定义用户信息 帐号昵称UserNam
  • C++模版深度解析

    在C 发明阶段 C 之父Stroustrup和贝尔实验室的C 小组对原先的宏方法进行了修订 对其进行了简化并将它从预处理范围移入了编译器 这种新的代码替换装置被称为模板 而且它变现了完全不同的代码重用方法 模板对源代码重用 而不是通过继承和
  • 支持向量机SVM

    文章目录 SVM简单理解 SVM代码实现 导入数据集 SVM实现 画出支持向量 总结 SVM简单理解 在下二维平面存在以下数据点 不同颜色代表不同类别 现在需要画一条直线 想将两个类别分别开来 当有新数据加入时 根据这条直线 也能将新数据正
  • Vue:ElementUI怎么引入外部svg图标

    推荐阿里巴巴图标库 命令行运行npm install svg sprite loader 创建icons svg文件夹 将svg文件放在该文件夹下面 在components文件夹中创建svgiconfont vue文件 文件内容
  • 【啃书】《智能优化算法及其MATLAB实例》例7.2模拟退火算法进行函数寻优

    文章目录 问题描述 仿真过程 matlab源码 问题描述 仿真过程 matlab源码 该脚本要命名为func2 m 适应度函数 function value func2 x y value 5 cos x y x y y y y value
  • postgresql优化案例三:recheck cond

    文章目录 1 SQL语句 2 查看改善前执行计划 3 解决方案 3 1增加work mem的size 3 2 创建合适的索引 4 改善后执行计划 1 SQL语句 delete from sap dispatchingd hist a whe