码迷,mamicode.com
首页 > 数据库 > 详细

Oracle spatial空间查询的选择度分析

时间:2018-01-08 21:09:25      阅读:731      评论:0      收藏:0      [点我收藏+]

标签:com   nali   使用   不同的   空间   oracl   image   ext   ati   

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

技术分享图片 

分析tddc_ora_8525.trc文件

技术分享图片 

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

 

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

技术分享图片

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

技术分享图片

14300 = round(1430023 * 0.01)

 

结论:

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

Oracle spatial空间查询的选择度分析

标签:com   nali   使用   不同的   空间   oracl   image   ext   ati   

原文地址:https://www.cnblogs.com/6yuhang/p/8244620.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!