oracle多边形经纬范围筛选_Oracle数据库之Oracle spatial空间查询的选择度分析

本文主要向大家介绍了Oracle数据库之Oracle spatial空间查询的选择度分析,通过具体的内容向大家展现,希望对大家学习Oracle数据库有所帮助。

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

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

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

而14300 = round(1430023 * 0.01)

结论:

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

本文由职坐标整理并发布,希望对同学们学习Oracle有所帮助,更多内容请关注职坐标数据库Oracle数据库频道!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值