Postgresql单表【插入】/【更新】百万数据
一、插入数据
说到插入数据,一开始就想到:
insert int A values(*******************)
插入多条数据,最多想到:写成这样:
insert into A values(**********),(*************),(*****************)
但是在百万数据面前,都太慢了。
1、用脚本的方式
#!/bin/bash
strsql="insert into tbl_devaccess8021x (uidrecordid, dtaccesstime, strmac, strusername, strswitchip, strifname, iisauthsuc,iisantipolicy,iisaccessed,strmachinecode,strrandomcode,iaccesstype,straccessfailedcode,uidroleid ,struserdes) values('d71803axxx1','2019-08-02 20:37:35', '1:2:3:4:5:6', 'criss0', '192.168.2.146','FastEthernet0/1',0,0,1,'000000000020A0B01','020A0B01',1,0,'研发','crissxu10')" for ((i=; i <=; i++))
do
strsql=$strsql",('d71803axxx$i',$(date +%s), '1:2:3:4:5:$i', 'criss$i', '192.168.2.$i','FastEthernet0/1',0,0,1,'000000000020A0B01','020A0B01',1,0,'研发','crissxu10')" done
echo $strsql
#psql -d xxx -U xxx -c "$strsql"
上述在数据量小的时候,可以采用,数据量大的话特别耗时。
2、postgresql提供了copy函数,方便批量导入数据。
copy_from的参数说明:copy_from(file, table, sep='\t', null='\\N', size=8192, columns=None)
import sys
import psycopg2
if sys.version_info.major == 2:
import StringIO as io
else:
import io
from datetime import datetime
if __name__=='__main__':
s = ""
start_time = datetime.now()
for i in range(0,10):
str_i = str(i)
temp = "d71803axxx{0}\t{1}\t1:2:3:4:5:{2}\tcriss{3}\t192.168.2.{4}\tFastEthernet0/1\t0\t0\t1\t000000000020A0B01\t020A0B01\t1\t0\t研发\tcrissxu10\n".format(str_i, datetime.now(),str_i,str_i,str_i)
s +=temp
conn = psycopg2.connect(host='127.0.0.1',user="xxx",password="xxx",database="xxx")
cur = conn.cursor()
cur.copy_from(io.StringIO(s),'tbl_devaccess8021x',columns=('uidrecordid', 'dtaccesstime', 'strmac', 'strusername', 'strswitchip', 'strifname', 'iisauthsuc','iisantipolicy','iisaccessed','strmachinecode','strrandomcode','iaccesstype','straccessfailedcode','uidroleid' ,'struserdes'))
conn.commit()
cur.close()
conn.close()
end_time = datetime.now()
print ('done. time:{0}'.format(end_time - start_time))
用copy_from 函数执行三百万的数据,时间大概7分钟左右。
3、先往临时表中插入,然后再同步
insert into source_table select temporary_table
二、更新数据
update table set col = value where col_condition=value;
更新数据的步骤是先找到符合条件的col_condition的数据,然后再执行更新。少量数据的时候,查询速度快,当表里的数据达到一定量的时候,查询性能受到影响,从而导致更新效率降低。
解决办法:
1、对查询条件加索引。
2、将多条数据合并成一条sql语句
update target_table set c2 = t.c2 from (values(1,1),(2,2),(3,3),…(2000,2000)) as t(c1,c2) where target_table.c1=t.c1
Reference:
【1】 http://www.voidcn.com/article/p-stwpqgta-bdq.html
"后来看到葛班长的日志,他通过Python在SQLite中插入100万条数据只用了4秒,原因在于Python对所有的这100万条插入语句进行了优化,将所有的插入操作放到了同一个事务中,这样极大的减少了开启和取消事务的时间,而正是这部分操作会消耗大量的时间"
这应该可以解释为什么方法2
【2】http://www.voidcn.com/article/p-vvuwvbyw-yu.html
【3】https://help.aliyun.com/knowledge_detail/59076.html
Postgresql单表【插入】/【更新】百万数据的更多相关文章
- oracle插入,更新,删除数据
插入,更新,删除数据 oracle提供了功能丰富的数据库管理语句 包括有效的向数据库中插入数据的insert语句 更新数据的update语句 以及当数据不再使用时删除数据的delete语句 更改数据之 ...
- Postgresql两表联结更新
Postgresql两表联合更新近日使用Postgresql感到有点不好用,一个联合更新非要这样写语法才对:update d_routetripset name=b.name , descrip ...
- 单表的更新UPDATE和删除记录DELETE(二十六)
当把记录写成功之后,也许我们还会如下操作.比如,记录在书写的过程中字段是错误的.或者,我们想改下字段值.那么,我们需要update关键字. update分为单表更新和多表更新. 一.UPDATE语句 ...
- MariaDB 插入&更新&删除数据(8)
MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可MariaDB的目的是完全兼容MySQL,包括API和命令行,MySQL由于现在闭源了,而能轻松成为MySQ ...
- MySQL中的多表插入更新与MS-SQL的对比
MySQL多表插入: INSERT INTO tdb_goods_cates (cate_name) SELECT goods_cate FROM tdb_goods GROUP BY goods_c ...
- postgresql获取表最后更新时间(通过触发器将时间写入另外一张表)
通过触发器方式获取表最后更新时间,并将时间信息写入到另外一张表 一.创建测试表和表记录更新时间表 CREATE TABLE weather( city varchar(80), temp_lo int ...
- postgresql获取表最后更新时间(通过表磁盘存储文件时间)
一.创建获取表更新时间的函数 --获取表记录更新时间(通过表磁盘存储文件时间) create or replace function table_file_access_info( IN schema ...
- postgresql 两表关联更新
UPDATE 要更新的表 SET 字段1 = cqt.字段1, 字段2 = cqt.字段2, FROM 数据来源表 cqt WHERE 要更新的表.bsm = cqt.bsm
- postgresql获取表最后更新时间(通过发布订阅机制将消息发送给应用程序)
一.创建测试表 CREATE TABLE weather( city ), temp_lo int, --最低温度 temp_hi int, --最高温度 prcp real, --湿度 date d ...
随机推荐
- PAT 甲级 1025.PAT Ranking C++/Java
Programming Ability Test (PAT) is organized by the College of Computer Science and Technology of Z ...
- SSM之JSON通用返回格式
/** * 通用的返回的类 * */ public class Result { //状态码 100-成功 200-失败 private int code; //提示信息 private String ...
- 总结TestNg与JUnit的异同
工作中一直用的是junit,近期稍微学习了一下TestNg,发现TestNg比java强大太多. TestNg简介 TestNg也是一套测试框架,它的灵感来源于Junit(java的单元测试框架)和N ...
- 20-2 树莓派搭建服务器 Tornado Web服务器
Drive.google.com/drive/folders/1ahbeoEHkjxoo4NV1wReOmpoRWbl448z- 1.Tornado简介 Tornado一款使用 Python 编写的, ...
- [React] Fix "React Error: Rendered fewer hooks than expected"
In this lesson we'll see an interesting situation where we're actually calling a function component ...
- ent 基本使用九 代码生成
ent 提供了cli 工具,可以方便我们进行schema 以及代码生成,同时目前提供的cli已经够用了 安装 cli go get github.com/facebookincubator/ent/c ...
- mknod
- NodeJS代码组织与部署
使用NodeJS编写程序前,为了有个良好的开端,首先需要准备好代码的目录结构和部署方式,就如同修房子要先搭脚手架.本章将介绍与之相关的各种知识. 一.模块路径解析规则 我们已经知道,require函数 ...
- oracle中union和union all区别与性能分析
[ 概要 ] 经常写sql的同学可能会用到union和union all这两个关键词, 可能你知道使用它们可以将两个查询的结果集进行合并, 那么二者有什么区别呢? 下面我们就简单的分析下. [ 比较 ...
- jdk8可重复key的Map: IdentityHashMap
编写一个多条件过滤功能时,想使用map作为过滤条件的容器,由于存在同一健匹配多个值的情况,所以就发现了jdk8的新的map:IdentityHashMap.使用它完美解决了我的问题. 对比Identi ...