Oracle Spatial分区应用研究之六:全局空间索引下按县分区与按省分区效率差异原因分析
1、实验结论
- 全局空间索引下,不同分区粒度之所有效率会有不同,差异并不在于SDO_FILTER操作本身,而在于对于数据字典表的访问次数上;
- 分区越多、表上的lob column越多,对数据字典表的访问次数越多;
- 对数据字典表访问次数的大概值(暂不考虑对其它数据字典表的访问)是可量算的。
2、实验目的
在04-不同分区粒度+全局空间索引查询效率对比一文中,我们看到了某种趋势:在四千万条要素量级下,分区粒度越细,全局空间索引查询效率越低。虽然看到了这种现象,但当时尚不能解释深层次的原因。本文的目的,既是探索研究出现这一现象的原因。
3、实验方法
分别以按县分区、按省分区两种方式来组织2531个区县、共46982394条要素。在两个分区表上均创建全局空间索引。按县分区表共有2531个分区,按省分区表共有43个分区。
开启10046事件,跟踪SDO_FILTER操作。10046事件将trace数据库所有的SQL请求,包括递归与与非递归的SQL请求,得到trc文件。然后按如下3步来分析:
- 逐行对比两个trc文件;
- 使用tkprof工具分析trc文件,按prsela,exeela,fchela(解析时间、执行时间、获取时间)排序SQL;
- 根据绑定变量的值分析递归查询查询了数据字典的哪些内容。
4、实验结果
4.1 逐行对比trc文件
两个trc文件内容基本一致。差别在于对于相同的SQL,其执行次数、elapsed、返回记录数、等待事件等存在差异。
4.2 使用tkprof分析trc文件
因为本文主要分析的是不同分区粒度下,空间查询性能的差异,因此在使用tkprof分析trc文件时,将从elapsed入手分析。而elapsed又包括parse、execute、fetch三种数据库调用类型,所以将指定sort = prsela,exeela,fchela。使用tkprof生成格式化文本的命令如下:
Tkprof db12c...trc country.txt sys=yes aggregate=yes sort=prsela,exeela,fchela
下文将以在按县分区空间查询中耗时较多的一系列SQL为参照,比较相同SQL在按省分区空间查询中的耗时。
Seg$
按县分区对SQL ID为9tgj4g8y4rwy8的SQL执行了17796次,总耗时1.75s;而按省分区对相同SQL的执行次数仅为383次,总耗时为0.05s。SQL查询的对象是seg$,seg$是数据字典表,每条记录表示一个ORACLE Segment。为什么会有差异呢?在3.3会说明。
- Lobfrag$
按县分区对SQL ID为cduvbuupb4dby的SQL返回了7593条记录,总耗时1.32s;而按省分区对相同SQL的仅返回129条记录,总耗时为0.04s。SQL查询的对象是lobfrag$,lobfrag$是数据字典表,每条记录表示一个lob fragment。如果仔细观察,会发现7593是2531(分区个数)的3倍,而129是43的3倍。是巧合还是有必须的联系?在3.3会说明。
- Obj$
按县分区对SQL ID为a7kvcmgaru84g的SQL返回了7593条记录,总耗时1.01s;而按省分区对相同SQL的仅返回129条记录,总耗时为0.03s。SQL查询的对象是obj$,obj$是数据字典表,每条记录表示一个object。
- Indpart$
按县分区对SQL ID为a7kvcmgaru84g的SQL返回了7593条记录,总耗时0.78s;而按省分区对相同SQL的仅返回129条记录,总耗时为0.02s。SQL查询的对象是indpart$,indpart$是数据字典表,每条记录表示一个index parttition。
- Obj$(2)
按县分区对SQL ID为87gaftwrm2h68的SQL返回了7697条记录,总耗时0.45s;而按省分区对相同SQL的返回记录仅为210条,总耗时为0.02s。SQL查询的对象也是obj$。
- Tabpart$
按县分区对SQL ID为87gaftwrm2h68的SQL返回了2531条记录,总耗时0.19s;而按省分区对相同SQL的返回记录仅为43条,总耗时为0.01s。SQL查询的对象是tabpart$, tabpart$是数据字典表,每条记录表示一个table parttition。
- SDO_FILTER
在本例中,按县分区和按省分区,在全局空间索引下,SDO_FILTER的效率相当。注意,该例查询范围内没有返回要素。
- 其它
其它还有一些递归SQL,其查询对象包括hist_head$、histgrm$等数据字典表。因为对这些对象的查询与分区个数相关度不大,因此不着重分析。
4.3 分析数据字典的访问内容
对seg$ 、lobfrag$ 、obj$ 、indpart$、obj$(2) 、tabpart$字典表的访问次数似乎都表现出了与分区个数的正相关性。那到底存不存在正相关性呢?
通过编写Shell脚本,将3.2(1)-(8)SQL语句中的绑定变量值提取出来,然后与相应的数据字典表进行JOIN操作,发现:
- Seg$
查询内容包括所有的lob partition 、index partition、table partition 以及sys和mdsys用户下的字典表、元数据表、少量其它表。本例中的两个图层都包含3个lob column,分别是sdo_geometry.sdo_elem_info、sdo_geometry.sdo_ordinate、se_anno_cad_data,而每个lob column上会存在一个lobindex。以按县分区图层为例,table partition有2531个,lob partition有2531*3个,index partition 有2531*3。
- Lobfrag$
查询内容包括所有的lob partition。以按县分区图层为例,lob partition有2531*3个。
- Obj$
查询内容包括所有的lob partition。以按县分区图层为例,lob partition有2531*3个。
- Indpart$
查询内容包括所有index partiton。以按县分区图层为例,lob partition有2531*3个。
- Obj$(2)
查询内容包括所有的lob partition、以及sys和mdsys用户下的字典表、少量其它表。在本例中,访问sys用户下61张表,mdsys用户下23张表。
- Tabpart$
查询内容包括所有table partiton。以按县分区图层为例,table partiton有2531个。
5、实验结论
- 全局空间索引下,不同分区粒度之所有效率会有不同,差异并不在于SDO_FILTER操作本身,而在于对于数据字典表的访问次数上;
- 分区越多、表上的lob column越多,对数据字典表的访问次数越多;
- 对数据字典表访问次数的大概值(暂不考虑对其它数据字典表的访问)是可量算的。假设分区数以X表示,lob column个数以Y表示,不同字典表的访问次数见下表:
数据字典表 |
访问次数 |
Seg$ |
(1+2Y)*X |
Lobfrag$ |
XY |
Obj$ |
XY |
Indpart$ |
XY |
Obj$(2) |
XY |
Tabpart$ |
X |
若已经获知对各数据字典表的平均访问时间,甚至可以估算查询耗时。在每例中seg$ 、lobfrag$ 、obj$ 、indpart$、obj$(2) 、tabpart$,各数据字典表的平均访问时间约为100us、240us、50us、150us、180us、120us。因此可估算时间为:
Elapsed all= 100*(1+2Y)*X + 240*Y*X + 50*X*Y + 150*Y*X + 180*Y*X + 120*X =X(820Y+220)
Oracle Spatial分区应用研究之六:全局空间索引下按县分区与按省分区效率差异原因分析的更多相关文章
- linux下使用crontab实现定时PHP计划任务失败的原因分析
这篇文章主要介绍了linux下使用crontab实现定时PHP计划任务失败的原因分析,需要的朋友可以参考下 很多人在linux下使用crontab实现PHP执行定时任务却未能成功,不能生成缓存.本 ...
- 下拉刷新和UITableView的section headerView冲突的原因分析与解决方案
UITableView:下拉刷新和上拉加载更多 [转载请注明出处] 本文将说明具有多个section的UITableView在使用下拉刷新机制时会遇到的问题及其解决方案. 工程地址在帖子最下方,只需要 ...
- Oracle Spatial分区应用研究之七:同等分区粒度下全局索引优于分区索引的原因分析
1.实验结论 同等分区粒度下,使用分区空间索引进行空间查询,比使用全局空间索引进行查询,对数据字典表的访问次数更多.假设分区数为X,则大概多3X次访问.具体说明见6实验结论. 2.实验目的 在之前的测 ...
- Oracle Spatial分区应用研究之四:不同分区粒度+全局空间索引效率对比
1.实验目的 在实验之前先回答这样一个问题——对同一份数据使用不同的分区粒度,但均创建全局空间索引,问:它们的全局空间索引一致吗? 怎样算是一致的呢?R-TREE的树结构一致算一致吗?空间索引条目数及 ...
- Oracle Spatial GIS相关研究
1.Oracle Spatial 概念相关 Oracle Spatial 是Oracle 数据库强大的核心特性,包含了用于存储矢量数据类型.栅格数据类型和持续拓扑数据类型的原生数据类型.Oracle ...
- Oracle Spatial分区应用研究之八:不同分区粒度在1.5亿要素量级下的查询性能
以土地调查地类图斑层作为测试数据,共计约1.5亿条要素.随机生成90次各比例尺的查询范围,在ORACLE 11gr2数据库中进行空间查询,记录查询耗时.最后计算平均值和第90百分位数,结果如下图所示: ...
- Oracle Spatial分区应用研究之五:不同分区粒度+本地空间索引效率对比
1.实验目的 若使用本地空间索引,不同分区粒度将产生不同索引组织,其索引分区个数.大小.R-TREE树结构均不相同.那么,在什么分区粒度下的本地空间索引效率较高呢? 2实验数据 实验数据为全国2531 ...
- Oracle Spatial分区应用研究之二:按县分区与按省分区对比测试报告
1.实验目的 在上一轮的实验中,oracle 11g r2版本下,在87县市实验数据的基础上,比较了分表与分区的效率,得出了分区+全局索引效率较高的结论(见上一篇博客).不过我们尚未比较过不同的分区粒 ...
- Oracle Spatial分区应用研究之三:县市省不同分区粒度的效率比较
在<Oracle Spatial分区应用研究之一:分区与分表查询性能对比>中已经说明:按县分区+全局空间索引效率要优于按县分区+本地空间索引,因此在该实验报告中,将不再考虑按县分区+本地空 ...
随机推荐
- Simple Redux
This is a post that tries to explain the the basics of Redux. We’ll build a minimal working example ...
- 学习:STL_deque容器
deque容器: 功能:双端数组,可以对头端进行插入删除操作 deque与vector区别: 1.vector对于头部的插入删除效率低,数据量越大,效率越低 2.deque相对而言,对头部的插入删除速 ...
- sql 记录一次灾难 游标问题
起因:游标执行存储过程 下载begin 外面了.. ,造成一直触发存储过程 收获:定义变量统一在游标外部使用, 书写内容在begin 内部书写 alter PROCEDURE USP_dgd_wzh_ ...
- cc2530中单片机的通用I/O接口
cc2530中有21个输入/输出引脚. 这些引脚可以设置为通用I/O或者设置为外设I/O.(其实这里的外设还是不太懂到底指什么,网上说输入设备,但是通用I/O也可以输入啊,为什么要弄外设I/O?) 其 ...
- 编译lua固件NodeMcu 8266
https://www.cnblogs.com/yangfengwu/p/10547024.html 因为我现在的Wifi的教程是lua语言编写的,但是有些功能需要自己编译lua固件才可以,这篇文章就 ...
- luogu P3327 [SDOI2015]约数个数和 莫比乌斯反演
题面 我的做法基于以下两个公式: \[[n=1]=\sum_{d|n}\mu(d)\] \[\sigma_0(i*j)=\sum_{x|i}\sum_{y|j}[gcd(x,y)=1]\] 其中\(\ ...
- 小数据池 is和== 再谈编码
昨日回顾 上节课内容回顾 1. 字典 {key:value, key:value.....} 成对的保存数据 字典没有索引. 不能切片, 字典的key必须是可哈希的.不可变的 1. 增加: dic[新 ...
- 记一次CPU使用100%问题排查
需求 前端同事说测试环境的服务接口查起来很慢,很不稳定,不是个别接口,而是大量接口. 情况分析 由于是在测试环境联调,没有多少用户量.第一步:先去服务器看看资源的使用情况.使用top命令,查看cpu的 ...
- 【AtCoder】 ARC 096
link C-Half and Half 题意:三种pizza,可以花\(A\)价钱买一个A-pizza,花\(B\)价钱买一个B-pizza,花\(C*2\)价钱买A-pizza和B-pizza各一 ...
- UDF——涡量
用涡量的模来显示涡结构是一种很常用的方法 涡量: 针对二维,涡量场表示为如下的标量: 对于二维流动来说,涡量为正,表示逆时针旋转:涡量为负,表示顺时针旋转 三维涡量: 其中: 计算涡量的模: 二维涡量 ...