【转】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 ...
随机推荐
- Golang omitempty 的用法
原文链接:https://blog.csdn.net/skh2015java/article/details/90720692omitempty作用是在json数据结构转换时,当该字段的值为该字段类型 ...
- failed to find romfile "efi-virtio.rom"
问题:failed to find romfile "efi-virtio.rom" 解决:apt-get install ipxe-qemu
- Linux调用Kaggle API下载数据
1. 登录Kaggle账户,点击My Account 2. Create New API Token得到kaggle.json 3. pip install kaggle 4. 执行kaggle会报错 ...
- Paillier同态加密实现
一.C++(该方案只实现了加密以及解密) 1.git clone https://github.com/klei0229/paillier.git 2.下载GMP与NTL包: 下载版本以及操作参见ht ...
- 牛客网PAT练兵场-人口普查
题目地址:https://www.nowcoder.com/pat/6/problem/4054 题解:结构体排序即可 /** * Copyright(c) * All rights reserved ...
- Typora--我用过的最好用的markdown编辑器
Typora Markdown编辑器,让人专注于书写的编辑器,书写博客和笔记的不二之选! 之前使用过程中只是使用了默认的功能,没有进行任何的第三发查件使用,各种方面出现了很多的局限性,比如插入了图片之 ...
- python数据类型和运算符
一.python类型判断 type,isinstance type(变量或常量):返回数据类型 a = 23.3print(type(a))b = 2e3print(b, type(b))输出: &l ...
- 4gl游标cursor
游標有多種寫法,一種是報表里常見的 這種寫法呢,先定義一個接受sql語句的變量l_sql,而接受到的語句實際上只是一連串的字符串,還包含了4gl裡面的一些變量.寫好的l_sql裡面之所以有多個分段的雙 ...
- js中的各种常用方法(持续更新中。。。)
我看到常用的就写上去,如果你们有,可以在评论上发表,我再把它补充到我的随笔中 some() var ages = [3, 10, 18, 20]; function checkAdult(age) { ...
- Unity资源引用问题
前几天做项目时,遇到一个奇怪的问题: 从一处复制了一个预制体,预制体上面还附有一个材质球,材质球上关联着另一张贴图. 将所有关联的东西,均Copy两份,然后关联成一个新的预制体,最后用项目内的读取内存 ...