在上一篇中,我用一个案例演示了对于数值或字符串类型的字段,选择度的计算方法。并证明了当字段值的选择度不同时,将会影响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. 深入详解JVM内存模型

    JVM内存结构 由上图可以清楚的看到JVM的内存空间分为3大部分: 堆内存 方法区 栈内存 其中栈内存可以再细分为java虚拟机栈和本地方法栈,堆内存可以划分为新生代和老年代,新生代中还可以再次划分为 ...

  2. Spring源码窥探之:@Profile

    Spring为我们提供的多环境启动 1. 配置类,注入三个不同环境的数据源,并加上注解 /** * description: 以下准备了三套不同环境的数据源 * * @author 70KG * @d ...

  3. eclipse spring MVC maven项目 maven install target下无war包

    1.排查问题 一步步去看,首先查看本地maven是否安装    命令:ctrl+r   cmd   输入  mvn -v  查看maven版本 2.查看  window>preference  ...

  4. 11 open source business models

    https://www.zdnet.com/article/11-open-source-business-models/ Critics are always claiming open sourc ...

  5. c++处理字符串string.find()与string::npos

    1. string s  = “xxx”; int a = s.find(‘x’); 如果没有匹配到,那么a = string::npos;

  6. install_config

    #! /bin/bash REPO='10.10.238.114:4507' zabbix='10.10.238.110' osmaster=`cat /etc/redhat-release |awk ...

  7. VS2017 Asp.Net调式闪退处理

  8. rsync实时同步

    假设有如下需求: 假设两个服务器: 192.168.0.1 源服务器  有目录 /opt/test/ 192.168.0.2 目标服务器  有目录 /opt/bak/test/ 实现的目的就是保持这两 ...

  9. Python调用win32 API绘制正弦波

    Python调用win32 API新建窗口与直接创建窗口的流程相同 流程:注册窗口→创建窗口→显示窗口→更新窗口→消息循环 代码: # -*- coding: utf-8 -*- import win ...

  10. Confd+Consul 动态生成配置文件

    一.Consul安装和配置 1.consul是什么? consul是HashiCorp公司推出的一款工具,主要用于实现分布式系统的服务发现与配置,它提供了以下几个关键特性: 服务发现:Consul客户 ...