postgresql性能优化2:sql语句和缓存配置
1、看执行计划
EXPLAIN, 此命令用于查看SQL的执行计划

总的来说sql的执行计划是一个树形层次结构, 一般来说阅读上遵从层级越深越优先, 同一层级由上到下的原则。
来跟着铁蛋老师读: 层级越深越优先, 同一层级上到下。
顺序知道了,得知道里面的意思了吧, 是的没错, 但是这个里面比较具体的一些细节这里就不再展开了,只介绍比较常关注的几个关键字:
重点来了,重点来了,睡觉的玩手机的停一停。王老师要开车了, 啊呸, 开课了。
第一行的括号中从左到右依次代表的是:
(估计)启动成本,在开始输出之前花费的时间,例如排序时间。
(估计)总成本, 这里有一个前提是计划节点会完整运行,即所有可用行都会被检索。实际上一些节点的父节点不会检索所有可用行(如LIMIT)。
(估计)输出的总行数,同样的是基于节点会完整运行的假设。
(估计)输出行的平均宽度(以字节为单位)
注意:
cost中描述的是启动成本和总成本,但是到目前为止我们还不知道这个数字代表的具体含义,因为我们不知道它的单位是什么。(所以说这里cost中的成本是具有相对意义,不具有绝对意义)
rows代表的是输出的总行数,他不是计划节点处理或扫描的行数,而是节点发出的行数。由于使用where子句过滤,这个值通常小于扫描的数目。理想情况下,顶级的rows近似于实际的查询返回,更新或删除的行数
2、索引优化
索引尽量建在数据比较分散的列上, 不要在变化很小的字段上加索引,比如性别之类的。
原因就是:
索引本质上是一种空间换时间的操作,通过B Tree这种数据结构减少io的操作次数以此来提升速度。如果在变化很小的字段上建立索引,那么可能单个叶子节点上的数据量也是庞大的,反而增加了io的次数(如果查询字段有包含非索引列,索引命中之后还需要回表)
3、缓存配置

仔细看了上图中的执行计划发现有三个个地方有嫌疑,一个是Hash节点, 一个是Sort, 还有一个是Buffers。
在Hash节点中Batches批处理的数量超过了1, 这说明用到了外存, 原来是内存不够了呀!
Sort节点中,排序方法是归并, 而且是磁盘排序, 原来也是内存不够了。
Buffers 节点中,同一个sql执行两次每次都有新的io,说明缓存空间也不够,最终这三个现象都指向了内存。
铁蛋打开pg的配置文件一看, 我靠,穷鬼呀,
共享缓存空间:shared_buffers=512MB,
单独进程内存:work_mem=4MB,
维护工作内存:maintenance_work_mem=512MB,
才分配了512MB的共享缓存总空间, 进程单独分配了4M空间用于hash,排序等操作,用于维护的分配了512MB。
设置:
共享缓存区的内存一般分配是内存的1/4,不超过总内存的1/2。 线程内存就看着给了,预计下峰值连接数和均值连接数,做一个权衡,适当提高。
于是铁蛋将共享缓存区的内存分配为20GB, 单个线程用于hash和排序的分配了200MB。 重启数据库, 跑了下执行计划。 sql里面从以前的一分钟,四五十秒变成了三四秒左右。

原文链接:https://blog.csdn.net/MusicIsMyAll/article/details/103465529
其他文章:https://blog.csdn.net/jui121314/article/details/84584848
postgresql性能优化2:sql语句和缓存配置的更多相关文章
- SQL Server数据库性能优化之SQL语句篇【转】
SQL Server数据库性能优化之SQL语句篇http://www.blogjava.net/allen-zhe/archive/2010/07/23/326927.html 近期项目需要, 做了一 ...
- Oracle性能优化之SQL语句
1.SQL语句执行过程 1.1 SQL语句的执行步骤 1)语法分析,分析语句的语法是否符合规范,衡量语句中各表达式的意义. 2)语义分析,检查语句中涉及的所有数据库对象是否存在,且用户有相应的权限. ...
- ORACLE性能优化之SQL语句优化
版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] 操作环境:AIX +11g+PLSQL 包含以下内容: 1. SQL语句执行过程 2. 优化器及执行计划 3. 合 ...
- 数据库性能优化之SQL语句优化
一.问题的提出 在应用系统开发初期,由于开发数据库数据比较少,对于查询SQL语句,复杂视图的编写等是体会不出SQL语句各种写法的性能优劣,但是如果将应用系统提交实际应用后,随着数据库中数据的增加,系统 ...
- 数据库性能优化之SQL语句优化(上)
一.问题的提出 在应用系统开发初期,由于开发数据库数据比较少,对于查询SQL语句,复杂视图的编写等体会不出SQL语句各种写法的性能优劣,但是如果将应用系统提交实际应用后,随着数据库中数据的增加,系统的 ...
- EBS开发性能优化之SQL语句优化
(1)选择运算 尽可能先做选择运算,这是优化策略中最重要.最基本的一条,选择运算一般会使计算的中间结果大大变小,在对同一表格进行多个选择运算时,选择条件的排列顺序对性能也有很大影响,因为排列顺序不仅影 ...
- [转]数据库性能优化之SQL语句优化1
一.问题的提出 在应用系统开发初期,由于开发数据库数据比较少,对于查询SQL语句,复杂视图的的编写等体会不出SQL语句各种写法的性能优劣,但是如果将应用系统提交实际应用后,随着数据库中数据的增加,系统 ...
- 数据库性能优化之SQL语句优化(下)
(1) 选择最有效率的表名顺序(只在基于规则的优化器中有效): ORACLE 的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最 ...
- 数据库性能优化之SQL语句优化1
一.问题的提出 在 应用系统开发初期,由于开发数据库数据比较少,对于查询SQL语句,复杂视图的的编写等体会不出SQL语句各种写法的性能优劣,但是如果将应用系统提交实 际应用后,随着数据库中数据的增加, ...
- 转载——SQL Server数据库性能优化之SQL语句篇
转载自:http://www.blogjava.net/allen-zhe/archive/2010/07/23/326927.html 1. 按需索取字段,跟“SELECT *”说拜拜 字段的提取一 ...
随机推荐
- C++简单实现unique_ptr
唯一指针 管理指针的存储,提供有限的垃圾回收工具,与内置指针相比几乎没有开销(取决于所使用的删除程序). 这些对象具有获取指针所有权的能力:一旦它们获得所有权,它们就会通过在某个时候负责删除指向的对象 ...
- set集合的HashSet 类
set是一个没有重复元素, 没有存储顺序的集合,它主要有三个实现类,如下: HashSet 类 HashSet 类是按照哈希算法来存储集合中的元素,当向 Set 集合中添加一个元素时,HashSet ...
- JS前后端交互(1)项目BotBattle
目录 交互逻辑图解 后端 前端 jQuery的ajax的编程 项目地址 交互逻辑图解 图片来源:XZHongAN 后端 RequestMapping("/pk/") public ...
- #欧拉回路,状压dp,Floyd#洛谷 6085 [JSOI2013]吃货 JYY
题目传送门 分析 先用Floyd求出两点间的最短距离,包含必经边的欧拉回路, 先考虑欧拉回路的性质就是度数为偶数且连通,那如果有偶数个奇点可以两两配对. 设 \(g[S]\) 表示选择 \(S\) 中 ...
- 使用OHOS SDK构建vorbis
参照OHOS IDE和SDK的安装方法配置好开发环境. 从github下载源码. 执行如下命令: git clone --depth=1 https://github.com/xiph/vorbis ...
- 基于OpenHarmony的智能金属探测器
一.简介 智能金属探测器是基于 OpenAtom OpenHarmony(以下简称"OpenHarmony")操作系统,利用电磁感应原理来探测周围的金属物体.该样例采用多设备协同 ...
- SQL CREATE INDEX 语句- 提高数据库检索效率的关键步骤
SQL CREATE INDEX 语句 SQL CREATE INDEX 语句用于在表中创建索引. 索引用于比其他方式更快地从数据库中检索数据.用户无法看到索引,它们只是用于加速搜索/查询. 注意: ...
- SQL 中的 NULL 值:定义、测试和处理空数据,以及 SQL UPDATE 语句的使用
SQL NULL 值 什么是 NULL 值? NULL 值是指字段没有值的情况.如果表中的字段是可选的,那么可以插入新记录或更新记录而不向该字段添加值.此时,该字段将保存为 NULL 值.需要注意的是 ...
- Go 语言 Printf 函数和格式化动词详解
Printf() 函数可以使用多种格式化动词对输出进行格式化.下面是可以与所有数据类型一起使用的一些通用格式化动词: 以下动词适用于所有数据类型: 动词 描述 %v 以默认格式打印值 %#v 以 Go ...
- Go 编程语言详解:用途、特性、与 Python 和 C++ 的比较
什么是Go? Go是一个跨平台.开源的编程语言 Go可用于创建高性能应用程序 Go是一种快速.静态类型.编译型语言,感觉上像动态类型.解释型语言 Go由Robert Griesemer.Rob Pik ...