postgresql优化数据的批量插入

摘要:
这是因为当将大量数据加载到PostgreSQL时,检查点操作将比通常更频繁地发生。通过改进检查点_segments变量的值可以有效地减少检查点的数量。

原文:http://www.cnblogs.com/mchina/archive/2012/08/11/2537393.html

有以下几种方法用于优化数据的批量插入。

1. 关闭自动提交:
在批量插入数据时,如果每条数据都被自动提交,当中途出现系统故障时,不仅不能保障本次批量插入的数据一致性,而且由于有多次提交操作的发生,整个插入效率也会受到很大的打击。解决方法是,关闭系统的自动提交,并且在插入开始之前,显式的执行begin transaction命令,在全部插入操作完成之后再执行commit命令提交所有的插入操作。

2. 使用COPY:
使用COPY在一条命令里装载所有记录,而不是一系列的INSERT命令。COPY命令是为装载数量巨大的数据行优化过的,它不像INSERT命令那样灵活,但是在装载大量数据时,系统开销也要少很多。因为COPY是单条命令,因此在填充表的时候就没有必要关闭自动提交了。

3. 删除索引:
如果你正在装载一个新创建的表,最快的方法是创建表,用COPY批量装载,然后创建表需要的任何索引。因为在已存在数据的表上创建索引比维护逐行增加要快。当然在缺少索引期间,其它有关该表的查询操作的性能将会受到一定的影响,唯一性约束也有可能遭到破坏。

4. 删除外键约束:
和索引一样,"批量地"检查外键约束比一行行检查更加高效。因此,我们可以先删除外键约束,装载数据,然后再重建约束。

5. 增大maintenance_work_mem:
在装载大量数据时,临时增大maintenance_work_mem系统变量的值可以改进性能。这个系统参数可以提高CREATE INDEX命令和ALTER TABLE ADD FOREIGN KEY命令的执行效率,但是它不会对COPY操作本身产生多大的影响。

6. 增大checkpoint_segments:
临时增大checkpoint_segments系统变量的值也可以提高大量数据装载的效率。这是因为在向PostgreSQL装载大量数据时,将会导致检查点操作(由系统变量checkpoint_timeout声明)比平时更加频繁的发生。在每次检查点发生时,所有的脏数据都必须flush到磁盘上。通过提高checkpoint_segments变量的值,可以有效的减少检查点的数目。

7. 事后运行ANALYZE:
在增加或者更新了大量数据之后,应该立即运行ANALYZE命令,这样可以保证规划器得到基于该表的最新数据统计。换句话说,如果没有统计数据或者统计数据太过陈旧,那么规划器很可能会选择一个较差的查询规划,从而导致查询效率过于低下。

免责声明:文章转载自《postgresql优化数据的批量插入》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Python os.system执行多条语句,os.system()的返回值以及与os.popen的区别(转)node安装下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

windows用navict for mongo 把mongo 数据库中的数据全部导入另一个数据库

mongodb 在导出数据的可以使用命令,也可以使用navicat 这种可视化软件,我就选择的使用navicat 转移数据。 具体的业务场景是,线上的数据,导入到测试环境一份,供前端调试。 使用navicat for mongo 要安装navict 还要,安装mongodb-database-tools-windows-x86_64-100.5.1.m...

Lucene 全文检索引擎

Apache Lucene PS: 苦学一周全文检索,由原来的搜索小白,到初次涉猎,感觉每门技术都博大精深,其中精髓亦是不可一日而语。那小博猪就简单介绍一下这一周的学习历程, 仅供各位程序猿们参考,这其中不涉及任何私密话题,因此也不用打马赛克了,都是网络分享的开源资料,当然也不涉及任何利益关系。 Lucene是apache软件基金会4 jakarta项目...

抓取网页数据(金融股市实时数据)

最近查了几天的资料去写一个网页抓取股票实时数据的程序,网上一堆资料都是翻来覆去的讲解同样的方法,还有都是抓取一般的没有变化的对时间要求不要的网页数据,然而对于股票实时数据的抓取要求的是每秒钟都会由很多股票数据在发生变化,要保证程序能抓取到每秒钟这些变化着的数据,好了,出于这个目的开始在网上搜说数据,很多人建议用libcurl方法,好的,libcurl很强大...

pymysql模块:执行数据操作,pymysql.err.InternalError: (1054, "Unknown column '' in 'field list'")

sql语句出错 sql = "INSERT INTO table1(word) VALUES (%s)" % (str) 改为 "INSERT INTO table1(word) VALUES ('%s')" % (str) 只要是values里面的值,都需要加“”...

tp5 高效率随机抽取数据(不重复)

public function getRandTable(){ $num = 5; //需要抽取的默认条数 $table = 't_marclog'; //需要抽取的数据表 $countcus = Db::name($table)->count(); //获取总记录数 $min = Db::name(...

Elastic Search Nest研究(二)--增删改查入门

增删改查入门 使用postman工具进行一系列的入门操作 索引 1. 创建索引 PUThttp://localhost:9200/news 配置分片1 副本0,先进行单机测试。 2. 删除索引 DELETE请求http://localhost:9200/news 分词 1. 测试默认分词效果 POST请求http://localhost:9200/ne...