1. 1、名词解释

分区:将一张大表在物理上分成多个分区,逻辑上仍然是同一个表名。

分表:将一张大表拆分成多张小表,不同表有不同的表名。

两种数据组织形式的原理图如下:

图 1分表与分区的原理图

  1. 2、实验目的

本实验的目的,在于对比分区与分表技术,分析其在"大图层"(大图层指要素数量超过200万条的图层)上的适用性。

  1. 3、实验数据

实验数据为贵州省87县地类图斑数据,要素总数为6695554。根据不同的数据组织+索引形式,形成了3个不同的实验主体:

  • 分表存储+空间索引
  • 按县分区+全局空间索引
  • 按县分区+本地空间索引
  1. 4、实验过程

    1. 4.1 实验方法

在1:500、1:2000、1:10000、1:25000、1:50000、1:100000比例尺下,随机从贵州省省域内选择3个样本范围,作为空间查询时的查询范围。将6*3个样本范围分别与3个实验主体进行空间查询运算,记录每次查询的耗时。

为了使查询实验覆盖所有的使用场景,将在基于磁盘、基于内存的两种查询场景中重复上述实验。

  1. 4.2 实验算法

实验算法用来描述实现上述空间查询的计算方法。

  1. 4.2.1 分表算法

多表的算法有两种,分别命名为part_query、nopart_query,其伪代码如下:

  1. 4.2.1.1 nopart_query

根据xzq_xj (县级行政区底图),判断BR(Boundary Rectangle,范围矩形)与哪些县级行政区相交

            loop

             根据xzqdm查询县级图层名layername;

根据layername,判断BR与哪些要素相交,并返回结果;

            end loop;

  1. 4.2.1.2 nopart_query2

根据xzq_xj (县级行政区底图),判断BR与哪些县级行政区相交

        loop

            根据xzqdm查询县级图层名layername;

            得到与layername进行空间查询的SQL语句;

            用UNION ALL进行SQL语句拼接;

        end loop;

         执行拼接后的SQL语句;

  1. 4.2.2 分区算法

分区的算法有3种,分别命名为part_query、part_query2、part_query3,其伪代码如下:

  1. 4.2.2.1 Part_query

根据xzq_xj (县级行政区底图),判断BR与哪些县级行政区相交

得到相交行政区列表 xzq_lists

将xzq_lists作为查询条件之一,SQL语句样式如下:

"select shape from part_table t where xzqdm in (xzq_lists) sdo_filter(t.shape,BR))";

  1. 4.2.2.2 Part_query2

将得到行政区列表 xzq_lists的过程内嵌到SQL语句里,其样式如下:

"select shape from part_table t where xzqdm in (select xzqdm from xzq_xj t where sdo_filter(t.shape,BR)) sdo_filter(t.shape,BR))";

  1. 4.2.2.3 Part_query3

仅使用BR作为查询条件,SQL语句样式如下:

select shape from part_table t where sdo_filter(t.shape,BR));

  1. 5、实验结果

    1. 5.1 基于磁盘的查询

根据黄色斑块坐落的位置,可知:

  1. 在比例尺大于1:10000(包括)时,分区表+全局空间索引效率最高(命中7次),且part_query3算法最优(命中6次);
  2. 在比例尺小于1:10000时,分区表+本地空间索引效率最高(命中5次),且part_query2算法最优(命中3次)
    1. 5.2 基于内存的查询

  1. 在比例尺大于1:10000(包括)时,分区表+全局空间索引效率最高(命中8次),且part_query2算法最优(命中6次);
  2. 在比例尺小于1:10000时,分表+空间索引与分区表+全局空间索引效率一致(命中4次),这其中分表+空间索引所使用的nopart_query算法最优(命中4次)。
    1. 6、实验结论

      • 观察5实验结果中的两张图,横向比较,可知在该实验数据和实验条件下,不同数据组织方式和不同算法之间,其差异均不大。考虑到实验所在网络与服务器环境均非独占使用,单个查询性能可能会产生抖动性,因此上述分项结论仅作为参考,尚不能作为正式结论;
      • 该实验所用的实验数据为87县市的地类图斑数据,而全国有近3000个县市,因此样本数据较之整体数据,仍显偏小。这从另一方面说明上述分项结论仅作为参考,尚不能作为正式结论;
      • 上述实验所采集的时间数据,是在特定服务器与存储环境下得到的。在不同的设备情况下,其值会有不同。
      • 若仅以此次实验结果为准,可得出如下结论:土地调查业务,大多数的应用场景,是在大比例尺,即1:10000-1:200比例尺下的查询浏览。因此在规划数据组织方式时,应更多考虑大多数应用场景的查询效率。基于此种考虑,建议数据物理组织采用:按县分区+全局空间索引。

(未完待续)

Oracle Spatial分区应用研究之一:分区与分表查询性能对比的更多相关文章

  1. Mysql分表和分区的区别、分库分表介绍与区别

    分表和分区的区别: 一,什么是mysql分表,分区 什么是分表,从表面意思上看呢,就是把一张表分成N多个小表,具体请看:mysql分表的3种方法 什么是分区,分区呢就是把一张表的数据分成N多个区块,这 ...

  2. (转) MySQL分区与传统的分库分表

    传统的分库分表 原文:http://blog.csdn.net/kobejayandy/article/details/54799579 传统的分库分表都是通过应用层逻辑实现的,对于数据库层面来说,都 ...

  3. Mysql分表和分区的区别、分库分表介绍与区别(转)

    分表和分区的区别: 一,什么是mysql分表,分区 什么是分表,从表面意思上看呢,就是把一张表分成N多个小表,具体请看:mysql分表的3种方法 什么是分区,分区呢就是把一张表的数据分成N多个区块,这 ...

  4. 利用SpEL 表达式实现简单的动态分表查询

    这里的动态分表查询并不是动态构造sql语句,而是利用SpEL操作同一结构的不同张表. 也可以参考Spring Data Jpa中的章节http://docs.spring.io/spring-data ...

  5. mysql如何查询多样同样的表/sql分表查询、java项目日志表分表的开发思路/按月分表

    之前开发的一个监控系统,数据库的日志表是单表,虽然现在数据还不大并且做了查询sql优化,不过以后数据库的日志表数据肯定会越来越庞大,将会导致查询缓慢,所以把日志表改成分表,日志表可以按时间做水平分表, ...

  6. MySql分区后创建索引加速单表查询和连表查询

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/konkon2012/article/de ...

  7. 【MySQL】数据库(分库分表)中间件对比

    分区:对业务透明,分区只不过把存放数据的文件分成了许多小块,例如mysql中的一张表对应三个文件.MYD,MYI,frm. 根据一定的规则把数据文件(MYD)和索引文件(MYI)进行了分割,分区后的表 ...

  8. Mysql的Merge存储引擎实现分表查询

    对于数据量很大的一张表,i/o效率底下,分表势在必行! 使用程序分,对不同的查询,分配到不同的子表中,是个解决方案,但要改代码,对查询不透明. 好在mysql 有两个解决方案: Partition(分 ...

  9. oracle数据迁移之Exp和Expdp导出数据的性能对比与优化

    https://wangbinbin0326.github.io/2017/03/31/oracle%E6%95%B0%E6%8D%AE%E8%BF%81%E7%A7%BB%E4%B9%8BExp%E ...

随机推荐

  1. 项目Alpha冲刺(团队)-第九天冲刺

    格式描述 课程名称:软件工程1916|W(福州大学) 作业要求:项目Alpha冲刺(团队) 团队名称:为了交项目干杯 作业目标:描述第九天冲刺的项目进展.问题困难.心得体会 队员姓名与学号 队员学号 ...

  2. Maven模块化搭建总结

    1.Maven插件在eclipse的安装 windows——>preferences——>Maven——>installations——>add——>installati ...

  3. 微信小程序基本语法

    渲染 .js page ({ data :{ memo:'hello world' } }) .wxml <view>{{memo}}</view> 绑定id .js page ...

  4. circus 架构

    转自官方文档:https://circus.readthedocs.io/en/latest/design/architecture/ Overall architecture Circus is c ...

  5. rollup node.js 打包工具

    最近在做一个提供给浏览器和node同时使用的js的url模板工具类,在用什么打包工具上纠结了一段时间,正好有一天在知乎上看到了关于rollup的介绍,在自己试了试之后,就决定用rollup.js来打包 ...

  6. [译博文]CUDA是什么

    翻译自:https://blogs.nvidia.com/blog/2012/09/10/what-is-cuda-2/ 你可能并没有意识到,GPU的应用有多广泛,它不但用于视频.游戏以及科学研究中, ...

  7. uni-app 模拟器

    1.安装MuMu模拟器 Android模拟器端口: 7555 2.安装夜神模拟器 Android模拟器端口: 62001

  8. python 得到列表的第二大的元素

    code #coding=utf- l=[,,,,,,] max1=l[] max2=l[] if(max1>max2): pass else: max1,max2=max2,max1 :]: ...

  9. 思科 DHCP服务器配置及DHCP中继

    思路: 1.配置 DHCP 客户端 确保每个 PC 为 自动获取IP地址的方式: 2.配置 SW1 # 创建 VLAN 10 , 20 # 将相关的端口,放入到对应的 VLAN : # 配置交换机之间 ...

  10. springMvc 入门二

    目的:请求参数接受,输出,常见的注解(在上一篇入门1基础上) 1:请求参数的绑定 1.1绑定的机制 表单中请求参数都是基于key=value的. SpringMVC绑定请求参数的过程是通过把表单提交请 ...