PG sql调优案例学习

一,开发范式

1.不要轻易把字段嵌入到表达式

例:在sal列上有索引,但是条件语句中把sal列放在了表达式当中,导致索引被压抑,因为索引里面储存的是sal列的值,而不是sal加上100以后的值。

在条件中查询谁的工资+100=2000。这样写即使在sal上有索引也会走全表扫描,主要原因就是sal列存放的是sal的值,并不是sal+100的值,

改写思路:通过等式等换,把sal列从表达式中剥离出来,就会用到索引:

如上图,代价远远小于全表扫描。

2.不要轻易把字段嵌入到函数中

例:在 hiredate列上有索引,但是条件语句中把该列放在了函数当中,导致索引被压抑,因为索引里面储存的是该列的值,而不是函数处理以后的值。

如上图,hiredate列有索引,但是放在了函数中,导致被压抑,执行计划走了全表扫描。

改写思路:通过等式转换,把列从函数中剥离出来,就会用到索引,比较成本,差别很大。

如上图,索引没有被压抑。

3.如果査询中比较固定查询某些列,可以基于这几个列建复合索引,直接查询索引(覆盖索引),避开回表扫描。

4.改变索引的关联度--类似Oracle的集簇因子

意思就是,在范围扫描的时候,索引关联度高的会扫描更少的块,关联度特别低的类似于b,与走了一遍全表扫描没有什么差别,在这种情况,我们可以改变索引的关联度。

在Oracle中,一般改变索引的集簇因子有两种方法

1、对表的行进行重排序

2、使用单表集簇 这两种办法可以用来维持行的顺序。将所有列值相同或者相邻的行放置在同一数据块中, 消除了全表扫描,使查询速度的增加高达 30 倍或者更多。

在PG中,可以使用重排序的方式。

例1:t1列有索引,如果此时不是范围扫描

主要查看correlation一列(Oracle中叫 clustering_factor),这一列如果和1相差很多,则认为关联度比较松散,此时总成本为12.47。

此时改变索引的关联度:

此时correlation为1,此时总成本为8。

例2:t1列有索引,如果此时是一个范围扫描

从上图可以看到,索引关联度不同,范围扫描消耗的成本更大。

二.多表查询技巧


1.驱动表上有很好的条件限制,同时,驱动表上的限制性条件字段上应该有索引,包括主键、唯一索引或其它索引、复合索引等

2.在每次连接操作之后尽量保证返回记录数最少,传递给下一个连接操作

3.根据返回的行的数量对应正确的连接方式。

4..尽量通过在被驱动表的连接字段上的索引,访问被驱动表。

5..单表扫描应该有效率,如果被驱动表上还有其它限制条件,可以遵循复合索引创建原则,创建合适的复合索引(连接字段与条件字段)

6..全表扫描也许是合理的,例如若干小表、代码表的访问。

7.依次类推,顺序完成所有表的连接操作。

多表查询案例分析1:如果有一张表有条件约束

此时,PG会把emp表作为驱动表,使用emp表上的索引来访问被驱动表dept。

dept表作为被驱动表,连接条件列要有索引。

emp表的deptno列就不需要有索引了。

多表查询案例分析2:如果两张表都有条件约束

如果根据案例1的思路,此时emp表为驱动表,empno上应该有索引,dept表为被驱动表,根据连接条件列d.deptno=e.deptno 被驱动表d.deptno上面要有索引,但dept表有限制条件d.dname='DALLS',此时分情况来讨论:
 

如果d.deptno为主键约束,那么可以不在d.dname列建索引,因为使用d.deptno即可访问。

如果d.dept不是主键索引,那么建议建复合索引(deptno,dname)。

多表查询案例分析3:如果有五张表的关联查询

可以看到,employees表访问了两次,起了两个不同的别名,可以当作两张单独的表,同时关联的还有departments,locations,jobs表。

看限制条件列

首先第一列:I.city= ‘South San Francisco’  , 那么在location的city列上要有索引。

再看location 这张表和哪个表进行连接:

很显然是这一列,所以d.location需要建索引。

再看d表还和哪个表连接:

索引emp.department需要建索引。

所以总而言之:有连接条件列,一般最好建索引
根据我们的思路,来逐步看执行计划:

第一种情况-无索引
在没有任何索引的情况下查看其执行计划,由于没有索引,所以所有扫描方式均为全表扫描,连接方式为 hash join。

第二种情况:建立单列索引

在 locations的city,location_id列上创建索引。
在 departments的 location_id上创建索引在 departments的 department_id上创建主键约束
在 employees的 employee_id上创建主键约束
在jobs的job_id上创建主键约束。

第三种情况-创建复合索引

在 locations的city、 location_id列上创建复合索引。
在 departments的 department_id、 location_id上创建复合索引
在 employees的 employee_id、 department_id、 manager_id、 job_id上创建复合索引(或者单列索引)
在jobs的 job_id上创建主键约束

三种执行计划成本对比:


经过分析发现,如果连接方式能够走嵌套循环,那么其成本比其它连接方式都低,当然我们要提供条件让优化器自动选择成本最低的连接方式,只要有一张表的访问方式是索引扫描,那么连接方式一般会选择嵌套循环。
Employees表的复合索引在执行计划中起到了作用,或者选择在连接条件列上( employee_id, department_id, manager_id)创建单列索引
Departments和 locations表的记录比较少,即使创建了单列或者多列索引,都不会使用索引。
连接顺序是L>D->EMP-MGR-J

虽然复合索引效率很客观,但复合索引维护成本较高,具体的sql调优手段还需要具体问题具体分析。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

cf 欧几里得距离

说明:欧几里得距离本质就是两点间距离 distancesqrt( sum(ai-bi)2 ) Problem - F - Codeforces 代码

跨平台电商数据对比:淘宝与他者的较量

——比较分析淘宝和其他电商平台(如京东、拼多多)的数据,探索各自的优势和市场定位 在当今的电子商务领域,跨平台电商数据对比成为了企业制定策略和优化运营的重要工具。淘宝作为中国最大的电商平台之一,与京东、拼多…

嵌入式仪器模块:数据记录模块和自动化测试软件

• 32 位分辨率 • 250 KSPS 采样率 • 可以同时并且连续地记录两个通道的电压输入 • 实时上传原始数据至 PC 端 通道22 输入阻抗 电压22 kΩ10 MΩ电流0.2 Ω输入范围电压 250 mV 4.5 V电流1.5 A耦合DCDC带宽450 Hz385 HzADC 分辨率32 Bits24 Bits采样率10 kSPS250 kSPS测…

还在为复制粘贴烦恼吗?这5个工具帮你轻松搞定

在日常工作中,CtrlC和CtrlV无疑是我们使用最为频繁的快捷键组合。 复制粘贴,轻松快捷。 但是在使用中,也会有一点不便,那就是无法保存剪贴历史内容。 比如我说复制之后,我想要想要找回这一次复制之前的内容&#xf…

【APP逆向】央视频播放量增加,逆向全过程解密

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全…

Vue03-HelloWord

一、Hello World 1-1、示例1 1、现有html容器; 2、再有vue实例。 new Vue({});中的{}是配置对象。配置对象是:key:value的格式。 el:element元素。id对应#,class对应. 把容器中变化的数据,交给Vue实例去保…

OpenCV学习(4.1) 改变颜色空间

1.目标 在本教程中,你将学习如何将图像从一个色彩空间转换到另一个,像BGR↔灰色,BGR↔HSV等除此之外,我们还将创建一个应用程序,以提取视频中的彩色对象你将学习以下功能:cv2.cvtColor,**cv2.i…

在 Visual Studio 2022 中配置 OpenCV

在 Visual Studio 2022 中配置 OpenCV 软件准备系统环境配置VS 2022 环境配置测试 软件准备 Visual Studio 2022 下载链接 OpenCV 下载链接 Visual Studio 的版本与 OpenCV 的 vc 版本需对应好,可以向下兼容: VS 2015 – vc14VS 2017 – vc15VS 2019…

测试开发面经分享,面试七天速成

1. get、post、put、delete的区别 a. get请求: i. 用于从服务器获取资源。请求参数附加在URL的查询字符串中。 ii. 对服务器的请求是幂等的,即多次相同的GET请求应该返回相同的结果。 iii. 可以被缓存,可以被收藏为书签。 iv. 对于敏感数据不…

AI大模型-LangChain基础知识入门

1 什么是LangChain LangChain由 Harrison Chase 创建于2022年10月,它是围绕LLMs(大语言模型)建立的一个框架,LLMs使用机器学习算法和海量数据来分析和理解自然语言,GPT3.5、GPT4是LLMs最先进的代表,国内百度…

kubernetes(k8s)集群部署(2)

目录 k8s集群类型 k8s集群规划: 1.基础环境准备: (1)保证可以连接外网 (2)关闭禁用防火墙和selinux (3)同步阿里云服务器时间(达到集群之间时间同步) &…

AXI 1G/2.5G Ethernet Subsystem IP核使用过程中参数配置全解

AXI 1G/2.5G Ethernet Subsystem 是一个为FPGA设计的以太网子系统,它支持1Gbps和2.5Gbps的数据传输速率,使得FPGA能够直接进行高速以太网通信。这个子系统通常包含以太网MAC控制器、GMII(千兆媒体独立接口)或RGMII(简化…

[word] 怎么给word文档加密? #微信#笔记#微信

怎么给word文档加密? 怎么给word文档加密?工作中,需要对公司的机密文件加密处理,防止信息泄露,这些是基本的操作,保护文档的安全。相信还有不少伙伴不知道怎么样去设置,今天小Q给大家分享设置文…

喜讯 | 爱洁丽攸信技术uMOM制造运营系统项目启动会圆满成功!

2024年6月4日,厦门攸信信息技术有限公司(以下简称“攸信技术”)与福建爱洁丽日化有限公司(以下简称“爱洁丽”)uMOM制造运营系统项目启动会圆满成功 01合作客户介绍 Introduction of cooperative customers 福建爱洁…

天锐绿盾 |-设计、制造、研发部门核心文件资料、图档、源代码等数据防泄密系统

#天锐绿盾防泄密软件# 天锐绿盾是一款专为企业设计、制造、研发等部门定制的数据防泄密解决方案。它集成了多种安全技术和管理策略,旨在全方位保护企业的核心文件资料、设计图纸、图档以及软件源代码等敏感数据,防止数据泄露。 PC地址: htt…

Interview preparation--RabbitMQ

AMQP AMQP(Advanced Message Queueing protocol). 高级消息队列协议,是进程之间床底一步新消息的网络协议AMQP工作原理如下: 发布者(Publisher)发布消息(Message)经过交换机(Exchange&#xff…

git服务器gitblit安装

1、下载 Gitblit 2、下载完后解压: 3、配制: 保存,退出编辑。 4、运行cmd,启用gitblit。 5、根据运行后的提示,也就是我们之间设置的port9990打开: 输入admin,admin就可以登录,这个账号密码&a…

数据可视化如何提升智慧展厅的展示效果

数据可视化是如何在智慧展厅中发挥作用的?随着科技的进步,智慧展厅成为展示信息、互动体验和传递品牌价值的前沿平台。数据可视化作为智慧展厅的重要组成部分,通过将复杂的数据转化为直观的图形、图表和互动界面,极大地提升了展厅…

GitHub工程获取第三方PR操作

GitHub工程获取第三方PR操作 1. 源由2. 获取第三方PRStep 1:安装ghStep 2:获取个人TokenStep 3:通过git协议获取代码Step 4:获取第三方PR分支 3. 总结 1. 源由 通常来说,GitHub上通常有三种场景: 工程管理…

PlantSimulation导入cad图作为背景

PlantSimulation导入cad图作为背景 首先要整理cad文件,正常的工艺规划总图中存在较多杂乱文件,这些信息是不需要的,如果直接导入,会非常卡。 1、打开cad软件,使用layon命令打开所有的隐藏图层,删除不需要…