Oracle spatial空间查询的选择度分析
在上一篇中,我用一个案例演示了对于数值或字符串类型的字段,选择度的计算方法。并证明了当字段值的选择度不同时,将会影响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。其它操作符的选择度有待验证。