1、插入数据html
说到插入数据,一开始就想到:sql
insert int A values(*******************)bash
插入多条数据,最多想到:写成这样:dom
insert into A values(**********),(*************),(*****************)函数
可是在百万数据面前,都太慢了。post
一、用脚本的方式性能
1 #!/bin/bash 2 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')" 3 4 for ((i=1; i <=3000000; i++)) 5 do 6 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')" 7 8 done 9 echo $strsql 10 #psql -d xxx -U xxx -c "$strsql"
上述在数据量小的时候,能够采用,数据量大的话特别耗时。优化
二、postgresql提供了copy函数,方便批量导入数据。ui
copy_from的参数说明:copy_from(file, table, sep='\t', null='\\N', size=8192, columns=None)spa
1 import sys 2 import psycopg2 3 if sys.version_info.major == 2: 4 import StringIO as io 5 else: 6 import io 7 from datetime import datetime 8 if __name__=='__main__': 9 s = "" 10 start_time = datetime.now() 11 for i in range(0,10): 12 str_i = str(i) 13 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) 14 s +=temp 15 conn = psycopg2.connect(host='127.0.0.1',user="xxx",password="xxx",database="xxx") 16 cur = conn.cursor() 17 cur.copy_from(io.StringIO(s),'tbl_devaccess8021x',columns=('uidrecordid', 'dtaccesstime', 'strmac', 'strusername', 'strswitchip', 'strifname', 'iisauthsuc','iisantipolicy','iisaccessed','strmachinecode','strrandomcode','iaccesstype','straccessfailedcode','uidroleid' ,'struserdes')) 18 conn.commit() 19 cur.close() 20 conn.close() 21 end_time = datetime.now() 22 print ('done. time:{0}'.format(end_time - start_time))
用copy_from 函数执行三百万的数据,时间大概7分钟左右。
三、先往临时表中插入,而后再同步
1 insert into source_table select temporary_table
2、更新数据
update table set col = value where col_condition=value;
更新数据的步骤是先找到符合条件的col_condition的数据,而后再执行更新。少许数据的时候,查询速度快,当表里的数据达到必定量的时候,查询性能受到影响,从而致使更新效率下降。
解决办法:
一、对查询条件加索引。
二、将多条数据合并成一条sql语句
1 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