文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/
1.前言
目前项目中基于控制点库进行SHP数据的坐标转换,流程大致为:遍历图层要素,获取每个要素的坐标串,查询控制点库,分别进行坐标转换,构建新的要素,最后构建新的图层。此方法效率如下:
a.控制点库有100W个控制点对。
b.待转换SHP数据有5K个面要素。
转换完毕大概需要120分钟。
此效率是相对较低的,如果想对更多包含大量要素的图层组数据进行批量转换,耗时会成倍增长。这里,我们进行了一些列优化探索。
2.思路分析
以上方法,耗时最多的是大表查询,即在控制点库中查询对应参考坐标。
对大表查询有很多种优化策略,比如将大表改成多个小表,根据业务建立相关索引等等。这里我们一起探讨另外一种方法,流程图如下:
该思路的核心为:遍历获得单个feature后,便根据该feature的extent建立包含局部信息的视图,减少不必要的全表查询。
最后结果测试为:
a.控制点库有100W个控制点对。
b.待转换SHP数据有5K个面要素。
转换完毕大概需要5分钟。
3.进一步优化
以上方法是利用视图来进行查询优化,但是每个视图建立完后还需要控制代码销毁。这个过程会影响效率。
3.1事务临时表
临时表分为了会话临时表和事务临时表。
会话临时表是指:该临时表肯定与会话有关。会话在不退出时,则些临时表中的数据存在,会话退出,该临时表中的数据也会随之消失。并且,在多用户操作的情况下,一个会话从来不阻塞另一个会话使用临时表。即使锁定临时表,一个会话也不会阻塞其他会话使用临时表。
事务临时表是指:该临时表与事务相关,当进行事务提交或者事务回滚的时候,临时表中的数据将自行被截断。
根据业务需求,这里选用事务临时表,主要利用其事务结束后会自动将数据做TRUNCATE的功能。
事务临时表的构建规则如下:
Create global temporary table table_name
(col1 type1, col2 type2 …)
On commit delete rows;
3.2测试结果
使用事务临时表进行改造后,测试结果如下:
a.控制点库有100W个控制点对。
b.待转换SHP数据有5K个面要素。
转换完毕大概需要2.5分钟。
4.总结
这里的核心思想还是进行大表改小表,不过将小表设计为临时表,此种方法在过滤查询数据时效果十分明显。
-----欢迎转载,但保留版权,请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/