在上一篇中,我用一个案例演示了对于数值或字符串类型的字段,选择度的计算方法。并证明了当字段值的选择度不同时,将会影响CBO选择最终的执行计划。对于可排序的字段类型,选择度计算模型已经有很多人写博客介绍了,但空间查询的选择度怎么计算却少有人研究?Oracle会根据不同的检索范围,产生不同的选择度吗?

接下来,我们来研究一下这个问题。

创建表,并使用SDO_GEOMETRY数据类型存储矢量数据。

查看表中记录数:

创建空间索引:

CREATE INDEX "TDDCSDE"."A3010_IX1" ON "TDDCSDE"."DLTB20150705" ("SHAPE") INDEXTYPE IS "MDSYS"."SPATIAL_INDEX"

用一个经纬度跨度均为1的矩形作为检索条件

explain plan for select * from DLTB20150705 where MDSYS.SDO_ANYINTERACT(shape, SDO_GEOMETRY(2003,4610,null,sdo_elem_info_array(1,1003,3),sdo_ordinate_array(116,32,117,33)))='TRUE';

此时执行计划的cardinality=14300,而真实返回的记录数是多少呢?

显然,不是执行计划预计的14300。

现在我们把查询范围变大,设置纬度跨度均为2的矩形作为检索条件

explain plan for select * from DLTB20150705 where MDSYS.SDO_ANYINTERACT(shape, SDO_GEOMETRY(2003,4610,null,sdo_elem_info_array(1,1003,3),sdo_ordinate_array(116,32,118,34)))='TRUE';

现在我们的查询范围变大了,但是cardinality仍然为14300。而此时返回的真实记录数是多少呢?

确实比经纬度跨度为1的矩形返回的记录多,但即使如此,执行计划的cardinality与之前一致。

到现在为止,我们看到的是结果:不同空间范围进行空间查询,其cardinality值不变化。那现在不禁要问,这个值是怎么计算得到的呢?那就得分析10053事件。

分析tddc_ora_8438.trc文件,发现cardinality的计算方法如下:

从该PLSQL BLOCK中可以发现,空间查询范围作为输入信息代入到代码段中去,最终得到的选择率为1/100。单从计算方法上看,似乎查询范围会影响到最终的selectivity计算结果,便其实并非如此。我们把范围再次从1度的跨度变为2度的跨度,然后得到10053的trc:

分析tddc_ora_8525.trc文件

范围变大了,但选择度仍然为1/100。

我们再次回到前面的例子中,

预计的cardinality为14300,而DLTB20150705表的记录数,根据之前的查询,为:

而14300 = round(1430023 * 0.01)

结论:

1、SDO_ANYINTERACT操作符的选择度恒定为1/100。其它操作符的选择度有待验证。

Oracle spatial空间查询的选择度分析的更多相关文章

  1. Oracle 表空间查询与操作方法

    一.查询篇 1.查询oracle表空间的使用情况 select b.file_id 文件ID,  b.tablespace_name 表空间,  b.file_name 物理文件名,  b.bytes ...

  2. Oracle spatial 空间修正函数(SDO_UTIL.RECTIFY_GEOMETRY)

    Oracle spatial有个空间修正函数SDO_UTIL.RECTIFY_GEOMETRY,它可以修复以下可能:a.重复节点 b.自相交 c.坐标串朝向不正确. 该函数的构造函数格式: SDO_U ...

  3. ORACLE表空间查询和管理【转】

    红色是自由指定的~~--查询表空间SELECT D.TABLESPACE_NAME,       SPACE "SUM_SPACE(M)",       SPACE - NVL(F ...

  4. oracle表空间查询维护命令大全之中的一个(数据表空间)史上最全

          表空间是数据库的逻辑划分,一个表空间仅仅能属于一个数据库. 全部的数据库对象都存放在建立指定的表空间中.但主要存放的是表, 所以称作表空间.在oracle 数据库中至少存在一个表空间.即S ...

  5. 常用oracle表空间查询语句

    --查询数据库表空间使用情况 select a.tablespace_name,a.bytes/1024/1024 "Sum MB",(a.bytes-b.bytes)/1024/ ...

  6. 转: Oracle表空间查询

    1.查询数据库中的表空间名称 1)查询所有表空间 select tablespace_name from dba_tablespaces; select tablespace_name from us ...

  7. oracle表空间查询维护命令大全之二(undo表空间)

    --undo表空间汇总 --查看全部的表空间名字 select name from v$tablespace; --创建新的UNDO表空间,并设置自己主动扩展參数; create undo table ...

  8. oracle表空间查询维护命令大全之三(暂时表空间)史上最全

    --UNDO表空间汇总 --查看全部的表空间名字 SELECT NAME FROM V$TABLESPACE; --创建新的UNDO表空间,并设置自己主动扩展參数; CREATE UNDO TABLE ...

  9. Oracle - v$lock查询慢原因分析

    数据库内部对象X$统计信息过旧,导致v$lock查询慢 前段时间用python写了个zabbix监控脚本,里面有一个检查锁的sql语句,sql语句是这样子的select count(*) retval ...

随机推荐

  1. 关于微信小程序在ios中无法调起摄像头问题

    这几天关于微信小程序开发关于wx.chooseVideo组件问题,因为自己一直是安卓手机上测试,可以调取摄像头,但是应用在ios上无法打开摄像头,困扰了好多天,经过反复查看官方文档,今天总算修复了这个 ...

  2. 洛谷:P1783 海滩防御(二分+并查集 最短路 最小生成树)

    题意: 给定长度为N的海滩,然后有M做防御塔,给出每座塔的位置Xi,到海岸的距离Yi. 求防御塔上最小观测半径Ri,使得海滩被封锁. 思路:要使左边界和右边界连通. 很nice,可以二分+并查集做. ...

  3. oracle plsql 实现apriori算法

    对apriori关联关系算法研究了一段时间,网上能搜到的例子,大部分是python写的,数据集长得像下面这样: [[I1,I2,I5],[I2,I4],[I2,I3],[I1,I2,I4],[I1,I ...

  4. NOI2018游记【一年后的回忆】

    今天是2019年9月6日,我坐在大学的宿舍里,同样敲着键盘,在一年前充满回忆与汗水的博客上,又一次地回忆往事. 那是2018年的7月,我停了三个月的课,攥着一张thusc的安慰约,放手在OI的生涯最后 ...

  5. php+tcpdf生成pdf: 中文乱码

    TCPDF是一个生成PDF的不错的库,可惜,官方对包括中文在内的东亚字体支持不怎么样的.场景:某项目需要根据数据库信息生成pdf格式的发票,考虑采用稳定的tcpdf,虽然还有许多其它选择,但是这个应该 ...

  6. springboot使用jpa案例

    1 创建entity实体类并生成数据库表 @Entity @Table(name="student") public class Student { @Id @GeneratedV ...

  7. Collections.synchronizedList与CopyOnWriteArrayList比较

    1.单线程方式 2.多线程版本,不安全的 ArrayList 3.多线程版本,线程安全,CopyOnWriteArrayList()方式 4.多线程版本,线程安全,Collections.synchr ...

  8. git version info & svn version info map(七)

    To generate the same version number as SVN, we can generate the same version number as SVN with the ...

  9. learning java NIO 之 RandomFileChannel

    import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.i ...

  10. 洛谷 P2949 [USACO09OPEN]工作调度Work Scheduling 题解

    P2949 [USACO09OPEN]工作调度Work Scheduling 题目描述 Farmer John has so very many jobs to do! In order to run ...