在上一篇中,我用一个案例演示了对于数值或字符串类型的字段,选择度的计算方法。并证明了当字段值的选择度不同时,将会影响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. 使用selenium谷歌浏览器驱动配置:

    from selenium import webdriver#导入谷歌浏览器的chrome_driverchrome_driver = r"C:\python36\Lib\site-pack ...

  2. 56、Spark Streaming: transform以及实时黑名单过滤案例实战

    一.transform以及实时黑名单过滤案例实战 1.概述 transform操作,应用在DStream上时,可以用于执行任意的RDD到RDD的转换操作.它可以用于实现,DStream API中所没有 ...

  3. Android入门教程(一)

    Android是什么? Android是基于Linux开发性内核的操作系统,该平台由操作系统,中间件,用户界面和应用软件组成.Android的基本信息:软件类型,APK,发行商:Google,最早版本 ...

  4. GoCN每日新闻(2019-10-24)

    GoCN每日新闻(2019-10-24) GoCN每日新闻(2019-10-24) 1. 学习Golang之服务器框架编写 – CS网络通信 http://1t.click/aJag 2. 如何实现 ...

  5. 图解CRM(客户关系管理)全流程

    https://blog.csdn.net/lylmwt/article/details/84921432

  6. rust结构体

    //Rust 并不允许只将某个字段标记为可变 struct User { email: String, name:String, age:i32, sex:String, active:bool, } ...

  7. how does SELECT TOP works when no order by is specified?

    how does SELECT TOP works when no order by is specified? There is no guarantee which two rows you ge ...

  8. Microsoft SQL Server 2008 R2 安装遇到的问题

    SQL Server 安装过很多次了,第一次遇见这样的问题: TITLE: Microsoft SQL Server 2008 R2 安装程序----------------------------- ...

  9. ip地址掩码和位数对应关系表、子网掩码、网络地址、主机地址-yellowcong

    本文链接:https://blog.csdn.net/yelllowcong/article/details/76736594ip的地址掩码,刚开始感觉特别蒙蔽,网掩码都是每段8位二进制,共32位,子 ...

  10. RFC2119 规范内容

    RFC2119 https://www.ietf.org/rfc/rfc2119.txt Network Working Group S. Bradner Request for Comments: ...