Postgre数据库Insert 、Query性能优化详解_PostgreSQL

一、前言
以前的系统由于表设计比较复杂(多张表,表与表直接有主从关系),这个是业务逻辑决定的。 插入效率简直实在无法忍受,必须优化。在了解了Postgre的Copy,unlogged table 特性
之后,决定一探究竟。

二、测试用例

1.数据表结构:表示一个员工工作绩效的表(work_test):共15个字段
id,no,name,sex,tel,address,provice,city,post,mobile,department,work,start_time,end_time,score
索引(b-tree的集群索引或者叫聚集索引):id,no,name,sex,tel,address,provice,city,post,mobile,department,work

2.测试环境:win7,四核,2GB内存;postgre版本9.3;Npgsql连接Postgre数据库。

三、insert/ transaction/ copy/unlogged table

1.insert 一个10W数据大概需要120s,虽然已经提升“不少”,但是还是不尽如人意。以前用SQLite时发现Transaction可以大幅提升性能,于是在Postgre中试试,发现并没有明显变
化。不知何故。

2. copy可以将文件(csv)中的数据复制进数据库中,当然数据表的结构和要数据类型要与文件一一对应。据说可以大幅提升插入性能。

复制代码 代码如下:

COPY 'work_test' from 'c:\temp.csv' WITH DELIMITER AS ','

  
使用Copy后发现插入的性能立马提升至30s,相当于1s插入3300条记录。这中间还包含生成csv文件的时间。

3.unlogged table
unlogged table,网上的文章说可以10倍于insert。使用方法也很简单:Create unlogged table ...
但是unlogged table 在遇到Postgre服务器异常重启后会丢失全部数据,所以如果你的数据不允许丢失,请不要使用。
使用后发现,大概20s,1s插入5000条记录。

下面是三种插入方式的走势图:

说明:x轴表示数据库中已有的记录数,单位百万,每个点是10W.Y轴表示每次插入所耗时间,单位秒。
蓝色线:insert;之所以后面比较稳定是因为电脑没有运行其他程序。所以说,电脑工作状态对Postgre效率有一定的影响。
粉红色:copy;
黄色线:copy+unlogged
 虽然建了索引,并且表中的数据一直累加进来,对于后续插入数据性能并没有任何影响,这个结果就是我想看到的。

四、查询测试
按name字段搜索:

复制代码 代码如下:

select * from work_test where name='1'

说明:x轴表示数据库中已有的记录数,单位百万,每个点是10W.Y轴表示每次查询所耗时间,单位毫秒。

蓝色线:insert;
粉红色:copy;
黄色线:copy+unlogged

由于三种插入方式结果都是一样的,所以对比并没有意义,这里主要看查询耗时。平均下来:500ms,并且随着Row count的增加,查询效率并没有降低。这主要得益于良好的索引。
另外发现:条件越多,查询效率越高,因为扫描的行数在减少,后面的图就不贴出来了。

时间: 2024-10-26 07:11:32

Postgre数据库Insert 、Query性能优化详解_PostgreSQL的相关文章

数据库Mysql性能优化详解_Mysql

在mysql数据库中,mysql key_buffer_size是对MyISAM表性能影响最大的一个参数(注意该参数对其他类型的表设置无效),下面就将对mysql Key_buffer_size参数的设置进行详细介绍下面为一台以MyISAM为主要存储引擎服务器的配置: mysql> show variables like 'key_buffer_size'; +-----------------+------------+ | Variable_name | Value | +---------

MySQL数据插入insert性能优化详解

对于一些数据量较大的系统,面临的问题除了是查询效率低下,还有一个很重要的问题就是插入时间长.我们就有一个业务系统,每天的数据导入需要4-5个钟.这种费时的操作其实是很有风险的,假设程序出了问题,想重跑操作那是一件痛苦的事情.因此,提高大数据量系统的MySQL insert效率是很有必要的. 经过对MySQL的测试,发现一些可以提高insert效率的方法,供大家参考参考. 1. 一条SQL语句插入多条数据. 常用的插入语句如:  代码如下 复制代码 INSERTINTO`insert_table`

MySQL my.cnf参数配置优化详解

MySQL my.cnf参数配置优化详解 本配置文件针对Dell R710,双至强E5620.16G内存的硬件配置.CentOS 5.6 64位系统,MySQL 5.5.x 稳定版.适用于日IP 50-100w,PV 100-300w的站点,主要使用InnoDB存储引擎.其他应用环境请根据实际情况来设置优化. 注:你的MySQL 版本可能和这里用的不同,所以有些参数会废弃,有些被替代,当发现启动异常或者使用异常时,请取消某些配置. # 客户端 # 以下选项会被MySQL客户端应用读取.注意只有M

MySQL数据库使用mysqldump导出数据详解_Mysql

mysqldump是mysql用于转存储数据库的客户端程序.它主要产生一系列的SQL语句,可以封装到文件,该文件包含有所有重建您的数据库所需要的 SQL命令如CREATE DATABASE,CREATE TABLE,INSERT等等.可以用来实现轻量级的快速迁移或恢复数据库.是mysql数据库实现逻辑备份的一种方式. 在日常维护工作当中经常会需要对数据进行导出操作,而mysqldump是导出数据过程中使用非常频繁的一个工具:它自带的功能参数非常多,文章中会列举出一些常用的操作,在文章末尾会将所有

ejb-有没有EJB JPA数据库持久层开发实践详解的源代码,麻烦给一份

问题描述 有没有EJB JPA数据库持久层开发实践详解的源代码,麻烦给一份 解决方案 书籍网上有好多下载的,源代码没有,建议你可以从这里,买一份,光盘里有源代码http://www.amazon.cn/dp/B001B8RVAW

必知技巧:ASP.NET中常用的优化性能方法详解

asp.net|技巧|详解|性能|优化 1. 数据库访问性能优化 数据库的连接和关闭 访问数据库资源需要创建连接.打开连接和关闭连接几个操作.这些过程需要多次与数据库交换信息以通过身份验证,比较耗费服务器资源.ASP.NET中提供了连接池(Connection Pool)改善打开和关闭数据库对性能的影响.系统将用户的数据库连接放在连接池中,需要时取出,关闭时收回连接,等待下一次的连接请求. 连接池的大小是有限的,如果在连接池达到最大限度后仍要求创建连接,必然大大影响性能.因此,在建立数据库连接后

MySQL数据库优化详解_Mysql

mysql表复制                                                                               复制表结构+复制表数据 mysql> create table t3 like t1; mysql> insert into t3 select * from t1; mysql索引                                                                       

ASP.NET常用的优化性能方法详解

1. 数据库访问性能优化 数据库的连接和关闭 访问数据库资源需要创建连接.打开连接和关闭连接几个操作.这些过程需要多次与数据库交换信息以通过身份验证,比较耗费服务器资源.ASP.NET中提供了连接池(Connection Pool)改善打开和关闭数据库对性能的影响.系统将用户的数据库连接放在连接池中,需要时取出,关闭时收回连接,等待下一次的连接请求. 连接池的大小是有限的,如果在连接池达到最大限度后仍要求创建连接,必然大大影响性能.因此,在建立数据库连接后只有在真正需要操作时才打开连接,使用完毕

Oracle数据库调试和优化详解

此文主要是关于Oracle数据库调试和优化方面的相关内容的介绍,还有涉及到Oracle数据库中命里率的相关问题的解答,其中包括不同的算法之间性能的比对.以下就是相关内容的介绍. 关于Oracle中各个命中率的计算以及相关的调优 1)Library Cache的命中率: 计算公式: 1. Library Cache Hit Ratio = sum(pinhits) / sum(pins) 2. SQL>SELECT SUM(pinhits)/sum(pins) FROM V$LIBRARYCACH