当前位置: 首页 > news >正文

【PostgreSQL】几个提高性能的小特性

一、LOCALE 与 “operator class”

在PostgreSQL里,LOCALE默认使用C的本地化规则。LOCALE是一种文化偏好的区域设置,包括字母表、排序、数字格式等。

LOCALE里有一个比较重要的规则LC_COLLATE,即排序方式(Collation),它会对数据库行为有显著影响。

当数据库里运行一个like查询,DB上使用非C LOCALE,普通索引可能不支持like操作,普通索引创建时我们通常不会显式指定operator class,示例如下:

CREATE INDEX ON users (email);

那下面like查询的执行计划可以看到走全表扫描。

postgres=# EXPLAIN SELECT * FROM users WHERE email LIKE 'lukas@%';QUERY PLAN                                 
-------------------------------------------------------------------------Seq Scan on users  (cost=10000000000.00..10000000001.26 rows=1 width=4463)Filter: ((email)::text ~~ 'lukas@%'::text)
(2 rows)

如果进行引导,明确使用文本模式操作符text_pattern_ops。

CREATE INDEX ON users (email text_pattern_ops);

那下面的执行计划可以看到也能正常使用索引。

postgres=# EXPLAIN SELECT * FROM users WHERE email LIKE 'lukas@%';QUERY PLAN                                         
--------------------------------------------------------------------------Index Scan using users_email_idx on users  (cost=0.14..8.16 rows=1 width=4463)Index Cond: (((email)::text ~>=~ 'lukas@'::text) AND ((email)::text ~<~ 'lukasA'::text))Filter: ((email)::text ~~ 'lukas@%'::text)
(3 rows)

二、Trigger 与 Transition Table

trigger触发器通常以串行方式工作,例如下面为了提高item大表count总数的性能,使用触发器更新随时将总数更新到sum表,便于快速统计。

CREATE TABLE item (id bigint GENERATED ALWAYS AS IDENTITY,value bigint NOT NULL
);CREATE TABLE sum (total bigint NOT NULL
);INSERT INTO sum VALUES (0);CREATE FUNCTION add_to_sum() RETURNS triggerLANGUAGE plpgsql AS
$$BEGINUPDATE sum SET total = total + NEW.value;RETURN NEW;
END;$$;CREATE CONSTRAINT TRIGGER add_to_sumAFTER INSERT ON itemDEFERRABLE INITIALLY DEFERREDFOR EACH ROWEXECUTE FUNCTION add_to_sum();

但是如果item表有比较频繁的批量操作,尤其还在一个事务里会引起dead tuple回收不及时,那基于触发器统计更新数据会变得越来越慢。

此时使用触发器的transition table过渡表特性,在内存中批量处理性能提升会比较明显。

DROP TRIGGER add_to_sum ON item;CREATE OR REPLACE FUNCTION add_to_sum() RETURNS triggerLANGUAGE plpgsql AS
$$BEGINUPDATE sum SET total = total +(SELECT sum(value) FROM new_rows);RETURN NULL;
END;$$;CREATE TRIGGER add_to_sumAFTER INSERT ON itemREFERENCING NEW TABLE AS new_rowsFOR EACH STATEMENTEXECUTE FUNCTION add_to_sum();

三、Case 与 Filter

在PostgreSQL的聚合函数中可以使用CASE或FILTER来过来数据:

查询一:使用case

SELECTfa.actor_id,SUM(CASE WHEN rating = 'R' THEN length END),SUM(CASE WHEN rating = 'PG' THEN length END)
FROM film_actor AS fa 
LEFT JOIN film AS f ON f.film_id = fa.film_id
GROUP BY fa.actor_id

查询二:使用filter

SELECTfa.actor_id,SUM(length) FILTER (WHERE rating = 'R'),SUM(length) FILTER (WHERE rating = 'PG'),
FROM film_actor AS fa 
LEFT JOIN film AS f ON f.film_id = fa.film_id
GROUP BY fa.actor_id

上面的两个查询功能是一样的,有人在docker运行PostgreSQL 15的环境测试对比,使用CASE语法会有8%的性能损失。FILTER的性能更好且语法更简洁。

相关文章:

【PostgreSQL】几个提高性能的小特性

一、LOCALE 与 “operator class” 在PostgreSQL里&#xff0c;LOCALE默认使用C的本地化规则。LOCALE是一种文化偏好的区域设置&#xff0c;包括字母表、排序、数字格式等。 LOCALE里有一个比较重要的规则LC_COLLATE&#xff0c;即排序方式(Collation)&#xff0c;它会对数据…...

[C语言] 指针

1. 指针是什么 2. 指针和指针类型 3. 野指针 4. 指针运算 5. 指针和数组 6. 二级指针 7. 指针数组 目录 1. 指针是什么&#xff1f; 2. 指针和指针类型 2.1 指针-整数 2.2 指针的解引用 3. 野指针 3.1 野指针成因 3.2 如何规避野指针 4. 指针运算 4.1 指针…...

win10在vmware15中安装macos10.13系统

第一步、安装vmware版本信息如下 第二步、下载unlocker-main和darwin.iso放到安装文件夹 第三步、管理员身份运行win-install.cmd 第四步、运行vmware新建虚拟机 第五步、启动新创建的虚拟机macOS 10.13并选择语言 第六步、选择磁盘工具抹掉磁盘 第七步、格式化完成后退出磁盘工…...

Node.js:实现遍历文件夹下所有文件

Node.js&#xff1a;实现遍历文件夹 代码如下 const fs require(fs) const path require(path)function traverseFolder(folderPath) {// 读取文件夹列表const files fs.readdirSync(folderPath)// 遍历文件夹列表files.forEach(function (fileName) {// 拼接当前文件路径…...

Git详解及使用

Git简介 Git 是一种分布式版本控制系统&#xff0c;它可以不受网络连接的限制&#xff0c;加上其它众多优点&#xff0c;目前已经成为程序开发人员做项目版本管理时的首选&#xff0c;非开发人员也可以用 Git 来做自己的文档版本管理工具。 大概是大二的时候开始接触和使用Gi…...

Jmeter设置中文的两种方式,建议使用第二种

方案一 进入jmeter图像化界面&#xff0c;选择Options下的Choose Language&#xff0c;再选择Chinese(Simplified)。这个就是选择语言为简体中文&#xff08;缺陷&#xff1a;这个只是在本次使用时为中文&#xff0c;下次打开默认还是英文的&#xff09; 方案二&#xff08;…...

【ARM 嵌入式 编译系列 7.1 -- GCC 链接脚本中节区及各个段的详细介绍】

文章目录 什么是Section(节区)输入文件常见节区有哪些&#xff1f;什么是 glue code&#xff1f;.glue_7和.glue_7的作用是什么&#xff1f;链接脚本中的 KEEP 关键字是什么呢作用&#xff1f;链接脚本中的 PROVIDE 关键字是什么呢作用&#xff1f; 上篇文章&#xff1a;ARM 嵌…...

一文读懂HTML

文章目录 HTML的历史HTML的作用HTML的基本语言 HTML的历史 HTML&#xff08;HyperText Markup Language&#xff09;的历史可以追溯到20世纪90年代早期&#xff0c;它是互联网发展的重要里程碑之一。以下是HTML的历史概述&#xff1a; 早期阶段&#xff08;1980年代末 - 1990年…...

MOCK测试

介绍 mock&#xff1a;就是对于一些难以构造的对象&#xff0c;使用虚拟的技术来实现测试的过程。 mock测试&#xff1a;在测试过程中&#xff0c;对于某些不容易构造或者不容易获取的对象&#xff0c;可以用一个虚拟的对象来代替的测试方 法。 接口Mock测试&#xff1a;在接口…...

Flutter源码分析笔记:Widget类源码分析

Flutter源码分析笔记 Widget类源码分析 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at: https://jclee95.blog.csdn.netEmail: 291148484163.com. Shenzhen ChinaAddress of this article:https://blog.csdn.net/qq_28550263/article/details/132259681 【介绍】&#x…...

PyTorch 微调终极指南:第 2 部分 — 提高模型准确性

一、说明 如今&#xff0c;在训练深度学习模型时&#xff0c;通过在自己的数据上微调预训练模型来迁移学习已成为首选方法。通过微调这些模型&#xff0c;我们可以利用他们的专业知识并使其适应我们的特定任务&#xff0c;从而节省宝贵的时间和计算资源。本文分为四个部分&…...

MySQL数据库----------安装anaconda---------python与数据库的链接

作者前言 &#x1f382; ✨✨✨✨✨✨&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f382; ​&#x1f382; 作者介绍&#xff1a; &#x1f382;&#x1f382; &#x1f382; &#x1f389;&#x1f389;&#x1f389…...

nuxt页面布局

nuxt页面默认布局文件在layouts目录下default.vue&#xff0c;可将页面的头部和脚部提取出来&#xff0c;形成布局页&#xff0c;将主内容区域的内容替换成<nuxt />。附default.vue代码&#xff1a; <template><div class"app-container"><div…...

mac编译ffmpeg

- code&#xff1a; git clone https://git.ffmpeg.org/gitweb/ffmpeg.git - 编译安装 https://trac.ffmpeg.org/wiki/CompilationGuide - 使用homebrew安装dependency brew install automake fdk-aac git lame libass libtool libvorbis libvpx \ opus sdl shtool texi2ht…...

如何让你的图片服务也有类似OSS的图片处理功能

原文链接 前言 有自己机房的公司一般都有一套存储系统用于存储公司的图片、视频、音频、文件等数据&#xff0c;常见的存储系统有以NAS、FASTDFS为代表的传统文件存储&#xff0c;和以Minio为代表的对象存储系统&#xff0c;随着云服务的兴起很多公司逐渐将数据迁移到以阿里云…...

Oracle PL/SQL 类型(Type):索引表、嵌套表、变长数组、pipelined 管道

1、Oracle 新建员工表和部门表.sql。 集合类型 1、Oracle 集合是相同类型元素的组合&#xff0c;在集合中&#xff0c;使用唯一的下标来标识其中的每个元素&#xff0c;与 Java 的 List 很像。 2、常用集合方式&#xff1a; 类型语法下标元素个数初始值.extend能否存在DB中…...

Web 服务器 -【Tomcat】的简单学习

Tomcat1 简介1.1 什么是Web服务器 2 基本使用2.1 下载2.2 安装2.3 卸载2.4 启动2.5 关闭2.6 配置2.7 部署 3 Maven创建Web项目3.1 Web项目结构3.2 创建Maven Web项目 4 IDEA使用Tomcat4.1 集成本地Tomcat4.2 Tomcat Maven插件 Tomcat 1 简介 1.1 什么是Web服务器 Web服务器是…...

armbian使用1panel快速部署部署springBoot项目后端

文章目录 前言环境准备实现步骤第一步&#xff1a;Armbian安装1panel第二步&#xff1a;安装数据库第三步&#xff1a;查看数据库容器重要信息【重要】查看容器所在的网络查看容器连接地址 第四步&#xff1a;项目配置和打包第五步:构建项目镜像 前言 这里只是简单记录部署spr…...

Streamlit 讲解专栏(八):图像、音频与视频魔法

文章目录 1 前言2 st.image&#xff1a;嵌入图像内容2.1 图像展示与描述2.2 调整图像尺寸2.3 使用本地文件或URL 3 st.audio&#xff1a;嵌入音频内容3.1 播放音频文件3.2 生成音频数据播放 4 st.video&#xff1a;嵌入视频内容4.1 播放视频文件4.2 嵌入在线视频 5 结语&#x…...

python使用装饰器记录方法耗时

思路 python使用修饰器记录方法耗时&#xff0c;目的是每当方法执行完后&#xff0c;可以记录该方法耗时&#xff0c;而不需要在每个方法的执行前后&#xff0c;去创建一个临时变量&#xff0c;来记录耗时。 方式一&#xff08;不推荐&#xff09;&#xff1a; 在每个方法的…...

Midscene.js:零代码跨平台UI自动化的终极指南 - 让AI成为你的智能操作员

Midscene.js&#xff1a;零代码跨平台UI自动化的终极指南 - 让AI成为你的智能操作员 【免费下载链接】midscene AI-powered, vision-driven UI automation for every platform. 项目地址: https://gitcode.com/GitHub_Trending/mid/midscene 你是否厌倦了每天重复点击、…...

Yakit靶场-前端加密与签名绕过实战:从手动分析到热加载自动化

1. 前端加密与签名机制入门&#xff1a;从手动分析开始 第一次接触前端加密时&#xff0c;我也被那些SHA256、RSA、AES之类的术语搞得头晕。但实际拆解后发现&#xff0c;这些加密机制就像快递站的密码柜——看似复杂&#xff0c;其实都有规律可循。以最常见的登录场景为例&…...

网络安全应急响应流程

网络安全应急响应流程&#xff1a;守护数字世界的防火墙 在数字化时代&#xff0c;网络安全事件频发&#xff0c;从数据泄露到勒索软件攻击&#xff0c;企业和组织面临的威胁日益复杂。网络安全应急响应流程&#xff08;Incident Response, IR&#xff09;是应对这些威胁的核心…...

AI写教材全流程揭秘,低查重工具带你开启高效编写之旅!

AI教材写作工具&#xff1a;让教材编写更高效 编写教材离不开扎实的资料支持&#xff0c;但传统的资料整合方法已经无法满足当前的需求。以往&#xff0c;从课程标准到学术文章&#xff0c;再到教学案例&#xff0c;信息往往分散在知网、教研网站等各个地方&#xff0c;这不仅…...

STM32F103 HAL库实战:DMA+USART驱动RS-485半双工通讯

1. RS-485通讯基础与STM32方案选型 在工业自动化领域&#xff0c;RS-485总线因其抗干扰能力强、传输距离远&#xff08;最长1200米&#xff09;、支持多点连接&#xff08;最多32个节点&#xff09;等特性&#xff0c;成为传感器网络、PLC控制等场景的首选。与常见的UART不同&a…...

Python的__enter__中的预防泄漏资源

Python中的资源管理一直是开发者需要谨慎处理的问题&#xff0c;尤其是在处理文件、数据库连接或网络请求时&#xff0c;资源泄漏可能导致程序性能下降甚至崩溃。而__enter__方法作为上下文管理协议的核心&#xff0c;为预防资源泄漏提供了优雅的解决方案。通过with语句和上下文…...

.NET10之 HttpClient 使用指南

一、HttpClient 核心概念与工作原理 System.Net.Http.HttpClient 是 .NET 中用于发送 HTTP 请求和接收 HTTP 响应的核心类&#xff0c;它封装了与 HTTP 服务交互的底层细节&#xff0c;提供了简洁、一致的编程接口。每个 HttpClient 实例包含一套应用于所有请求的配置集合&…...

维普、万方、知网 AI 检测有什么区别?一文讲清三大平台差异

国内高校目前主要使用知网 AIGC 检测、维普 AI 检测和万方 AI 检测三大平台。很多同学发现&#xff0c;同一篇论文在不同平台上的检测率差异很大。本文将详细对比三大平台的差异&#xff0c;帮助你针对性地准备。 三大平台基本信息 平台全称主要用户检测方式知网 AIGC学术文献…...

ANARCI抗体序列编号终极指南:从零基础到实战应用的完整教程

ANARCI抗体序列编号终极指南&#xff1a;从零基础到实战应用的完整教程 【免费下载链接】ANARCI Antibody Numbering and Antigen Receptor ClassIfication 项目地址: https://gitcode.com/gh_mirrors/an/ANARCI ANARCI&#xff08;Antibody Numbering and Antigen Rece…...

嵌入式轻量级调试库:零开销DEBUG_PRINT实现原理

1. 项目概述 Utils 是一个面向嵌入式系统的轻量级调试输出工具库&#xff0c;核心目标是为资源受限的MCU平台&#xff08;如ESP32、STM32、nRF52等&#xff09;提供类 printf() 的格式化打印能力&#xff0c;同时严格控制运行时开销与代码体积。该库不依赖标准C库的 stdio.…...