【转】Postgres SQL sort 操作性能调优
这篇文章将以实战的方式结合笔者在项目中真实遇到的情况来讲解。说到SQL,大家可能会遇到一些写法稍微复杂的写法。比如SQL中遇到的有聚合函数sum等,也有遇到使用group by / order by的情况,其实这种情况下SQL的性能可能不是特别好。至少有两种大的解决思路:
减少SQL的压力,把SQL实现的逻辑计算相关,用code的方式去解决。即释放数据库后端宝贵的计算资源。算是重构SQL,这种方式代价稍微要高些,因为要更改code的实现逻辑,也要规划好新的SQL的结构。目的就是为了在SQL中去掉order排序/group分组这类比较耗费资源的部分。
如果前提是我们的SQL不能动,那么要怎么去优化呢?下面会一步步和大家解释在postgres中怎么调优order by SQL语句。
step1:
在Postgres中创建测试表,创建表SQL如下:
CREATE TABLE public.sort_test
(
id bigint NOT NULL,
salary numeric NOT NULL,
CONSTRAINT sort_test_pkey PRIMARY KEY (id)
) TABLESPACE pg_default;
step2:
在测试表中插入多条数据,如下SQL,可以往上表中插入500万条数据。
insert into sort_test select generate_series(1,5000000),generate_series(1,5000000);
step3:
评估order by 性能问题,假设要评估select语句如下,SQL不是很复杂,可以说明问题即可。
select * from sort_test order by salary;
step4:
分析SQL执行计划,获取执行计划的SQL语句如下:
explain analyze select * from sort_test order by salary;
step5:
执行计划如下(注:如果上面SQL语句没有analyze关键字,那么执行计划就不会有Sort Method详细信息和actual time的信息。
"Sort (cost=804270.42..816770.42 rows=5000000 width=14) (actual time=2688.920..3797.378 rows=5000000 loops=1)"
" Sort Key: salary"
" Sort Method: external merge Disk: 122344kB"
" -> Seq Scan on sort_test (cost=0.00..77028.00 rows=5000000 width=14) (actual time=0.071..476.958 rows=5000000 loops=1)"
"Planning Time: 0.193 ms"
"Execution Time: 4038.509 ms"
从以上的执行计划可以看到最小的节点(上面"->"处)的执行时间是0.071 ms,而到上一层Sort,就会发现执行时间就变为了2688.92 ms (注:这边是以actual time作为分析依据,你也可以以cost时间,都是可以的。
以上有个关键信息如下,这就说明此sql在执行的时候,postgres分配的work_mem的内存大小不够,只能从disk处抓取数据处理。那么从内存的角度来优化SQL,就需要增大work_mem参数值,上面说是用了大致122MB disk。而postgres默认的work_mem是 4MB。
Sort Method: external merge Disk: 122344kB
那么修改work_mem,用下面方法,将work_mem大小设置为1GB.
SET work_mem = '1GB';
step6:
修改之后,再获取执行计划如下:
"Sort (cost=633365.42..645865.42 rows=5000000 width=14) (actual time=1241.768..1526.102 rows=5000000 loops=1)"
" Sort Key: salary"
" Sort Method: quicksort Memory: 430984kB"
" -> Seq Scan on sort_test (cost=0.00..77028.00 rows=5000000 width=14) (actual time=0.046..498.029 rows=5000000 loops=1)"
"Planning Time: 0.095 ms"
"Execution Time: 1775.462 ms"
此时,可以看到关键字变为如下所示,sort操作现在是放在了内存中执行的,用了430MB左右的内存,然后执行时间为1241.768 ms,还不到原来执行时间的一半,性能还是有大幅度提升的。
Sort Method: quicksort Memory: 430984kB"
温馨提示:work_mem在调整时,还是要考虑实际情况,比如我数据库跑一些轻量级的sql比较多,那么设置work_mem值过大的话,反而会影响性能,此时可以小幅度地调整参数值,需要测试多轮,得到适合自己产品的最优解。如果都是哪种OLAP,SQL比较重的情况下,可以调整的幅度大一些,如从4MB调整到1GB.
【转】Postgres SQL sort 操作性能调优的更多相关文章
- SQL server 性能调优
转自: http://www.cnblogs.com/MR_ke/archive/2010/08/25/1807856.html sql 2005性能调优 SQL Server在运行一段时间,随着数据 ...
- SQL Server 性能调优培训引言
原文:SQL Server 性能调优培训引言 大家好,这是我在博客园写的第一篇博文,之所以要开这个博客,是我对MS SQL技术学习的一个兴趣记录. 作为计算机专业毕业的人,自己对技术的掌握总是觉得很肤 ...
- sql server 性能调优之 资源等待PAGELATCH
一.概述 在前几章介绍过 sql server 性能调优资源等待之PAGEIOLATCH,PAGEIOLATCH是出现在sql server要和磁盘作交互的时候,所以加个IO两个字.这次来介绍PAGE ...
- sql server 性能调优之 资源等待 LCk
一. 概述 这次介绍实例级别资源等待LCK类型锁的等待时间,关于LCK锁的介绍可参考 “sql server 锁与事务拨云见日”.下面还是使用sys.dm_os_wait_stats 来查看,并找出 ...
- sql server 性能调优之 CPU消耗最大资源分析1 (自sqlserver服务启动以后)
一. 概述 上次在介绍性能调优中讲到了I/O的开销查看及维护,这次介绍CPU的开销及维护, 在调优方面是可以从多个维度去发现问题如I/O,CPU, 内存,锁等,不管从哪个维度去解决,都能达到调优的效 ...
- sql server性能调优
转自:https://www.cnblogs.com/woodytu/tag/%E6%80%A7%E8%83%BD%E8%B0%83%E4%BC%98%E5%9F%B9%E8%AE%AD/defaul ...
- [转]SQL Server 性能调优(io)
目录 诊断磁盘io问题 常见的磁盘问题 容量替代了性能 负载隔离配置有问题 分区对齐配置有问题 总结 关于io这一块,前面的东西如磁盘大小,磁盘带宽,随机读取写入,顺序读取写入,raid选择,DA ...
- sql server 性能调优 资源等待之网络I/O
原文:sql server 性能调优 资源等待之网络I/O 一.概述 与网络I/O相关的等待的主要是ASYNC_NETWORK_IO,是指当sql server返回数据结果集给客户端的时候,会先将结果 ...
- sql server 性能调优 资源等待之内存瓶颈的三种等待类型
原文:sql server 性能调优 资源等待之内存瓶颈的三种等待类型 一.概述 这篇介绍Stolen内存相关的主要三种等待类型以及对应的waittype编号,CMEMTHREAD(0x00B9),S ...
随机推荐
- 【转】Ubuntu下解决Depends: xxx(< 1.2.1) but xxx is to be installed
在ubuntu下由于更新package不成功,或者误删除了一些文件会出现Depends: xxx(< 1.2.1) but xxx is to be installed解决方法是先试着安装所缺的 ...
- 使用 gopacket 进行数据包捕获,注入和分析
原文链接:https://www.devdungeon.com/content/packet-capture-injection-and-analysis-gopacket 接口文档:https:// ...
- SuperSlide轮播切换
<!-- 点击切换引入 --> <script type="text/javascript" src="js/jquery.js">&l ...
- Excel数据分析 --数据透析表
数据透析表主要用于各种数据总汇,对各项数据指标进行分类统计 实例分析 如下所示:是一份销售流水数据,有时间,地区,销售员,商品名称,数量,单价和金额几个字段,如下所示: 现在针对不同的数据汇总需求,可 ...
- 浅析 MVC
MVC(Model–View–Controller) Model:数据模型 负责操作所有数据View:视图 负责所有UI界面Controller:控制器 负责其他 //数据放在m const m = ...
- nginx配置过程中出现的问题
在安装nginx时我们先创建用户useradd -s /sbin/nologin -M nginx 不然会报nginx: [emerg] getpwnam("nginx") fai ...
- mac下使用命令行安装、卸载ipa包、查看日志
mac下使用命令行安装.卸载ipa包.查看日志 https://www.cnblogs.com/lily1989/p/8383916.html
- NGINX 命令 重启 WINDOWS
最近系统更新比较频繁,web系统老是上新,因此在nginx这边经常需要重启或者刷新,做了一个批命令供参考. 1.鼠标右键-新建-一个.TXT文本文档:在里面输入NGINX重启的命令. 2.输入NGIN ...
- P1090 合并果子(哈弗曼树)
题目描述 在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合成一堆. 每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和.可 ...
- 在腾讯云云函数计算上部署.NET Core 3.1
云厂商(腾讯云.Azure等)提供了Serverless服务,借助于Serverless,开发人员可以更加专注于代码的开发,减少运维的成本.腾讯云的函数计算提供了很多运行库,对.NET的支持需要通过c ...