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 ...
随机推荐
- seaborn(1)---画关联图
将 Seaborn 提供的样式声明代码 sns.set() 放置在绘图前,就可以设置图像的样式 sns., color_codes=False, rc=None) context= 参数控制着默认的画 ...
- mmdetection安装教程
如果官方教程不行再参考我的吧,我的环境如下: ubuntu cuda10 cudnn7.5 步骤: 1.使用conda创建一个虚拟环境 conda create -n mmdetection pyth ...
- pace.js[转载]
pace.js监控了什么: pace.js对于加载进度监控了什么呢?通过阅读源码,我们看到整体的进度有四个部分组成:document,elements,eventLag和ajax这四种监视器(Moni ...
- python基础笔记-字符串
字符串是 Python 中最常用的数据类型.我们可以使用引号(‘或”)来创建字符串. def main(): str1 = 'hello,world' print(len(str1))#计算字符串的长 ...
- python应用-跑马灯
import os import time def main(): str1='欢迎来到前锋学习Python' while True: os.system('cls') print(str1) tim ...
- maven中jar冲突解决
Maven中jar包冲突是开发过程中比较常见而又令人头疼的问题,我们需要知道 jar包冲突的原理,才能更好的去解决jar包冲突的问题.本文将从jar包冲突的原理和解决两个方面阐述Maven中jar包冲 ...
- Simple Redux
This is a post that tries to explain the the basics of Redux. We’ll build a minimal working example ...
- 最小球覆盖——模拟退火&&三分套三分套三分
题目 给出 $N(1 \leq N \leq 100)$ 个点的坐标 $x_i,y_i,z_i$($-100000 \leq x_i,y_i,z_i \leq 100000$),求包围全部点的最小的球 ...
- 文件夹上传控件webupload插件
我们平时经常做的是上传文件,上传文件夹与上传文件类似,但也有一些不同之处,这次做了上传文件夹就记录下以备后用. 这次项目的需求: 支持大文件的上传和续传,要求续传支持所有浏览器,包括ie6,ie7,i ...
- ent 基本使用四 图遍历查询
接上文,我们已经创建了基本的关系以及表实体,以下是通过图方式的查询 参考关系图 代码处理 创建图数据 func CreateGraph(ctx context.Context, client *ent ...