做点Postgresql笔记
没错这时本博主的新坑,而且挖的好辛苦:
如何在对postgis插件各种误操作导致postgis的相关表项被删除后,重新添加postgis插件
由于是小白,初来乍到,把postgis相关联的表一股脑的误删除了,导致postgresql提供的关于gis的一系列“ST_”(Space Type)功能函数都无法使用,然后就是各种慌张。
解决方案是:
1、确认当前pg数据库已经安装有postgis;
2、如果1成立,重新加载上postgis插件即可,加载方式为:在指定数据库对象的查询中写入以下语句:CREATE EXTENSION postgis
这里我估计只是装了一个简单的postgis版本,它还有很多丰富的相关扩展我没有装上。只是目前这样操作满足了我现在使用ST函数的要求。如果还有插件缺失,我认为用类似方法可以得到解决。
3、如果1不成立,那么需要确认是否安装好postgis,没有则需要先安装postgis。为什么某些表明明有这个字段,点击查询后显示此表不存在此字段
这一点是我写java查询句柄访问数据库时发生的错误,有关这一点还没有解决,例如我在输入:
select taxiNumber from taxiinfo
时,就会报出错误,表示没有此字段,因此只能暂用:`
select * from taxiinfo
然后再在代码中取结果的不同字段(取我想要的那个字段),这样把结果全部查出的方式应该是降低了代码的执行效率的。
大批量插入数据的优化方法
主要参考的是德哥的这篇文章,批量插入,最高可达插入 249088 条数据每秒,详见:
PostgreSQL batch insert performace test不知道为啥上面的地址总是挂掉,在此附上“德哥”的github主页,有需者可访问:
https://github.com/digoal我采用了批量插入,且每次批量插入行数为5000条后,对于10GB的数据,原本需要8天,现在1天已经插入一半左右的数据了,因此在这做总结,发现批量插入确实能够提高插入效率,待我稍后检查插入数据是否正确。
connection c = null;
statement stmt = null;
try{
Class.forName("org.postgresql.Driver");
c = DriverManager.getConnection("jdbc:postgresql://...","postgres","password");
stmt = c.createStatement();
...
String insertsql = "insert into ... values ";
for(int i:insertListLength-2)
insertsql += "(insertList[i].attribute1,insertList[i].attribute2,insertList[i].attribute3),...,insertList[i].attributen),";
insertsql += "(insertList[insertListLength-1].attribute1,insertList[insertListLength-1].attribute2,insertList[insertListLength-1].attributen);";
stmt.executeUpdate(insertsql);
...
}catch(Exception e){
c.rollback();
}finally{
stmt.close();
c.close();
}
代码是我怕遗忘进行的记录,可不看。
- 未完待续