zoukankan      html  css  js  c++  java
  • 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度的跨度,然后得到10053trc

     

    分析tddc_ora_8525.trc文件

     

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

     

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

    预计的cardinality为14300,DLTB20150705表的记录数,根据之前的查询,为:

    14300 = round(1430023 * 0.01)

     

    结论:

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

  • 相关阅读:
    兼容python3 小烦
    fstring 和 海象赋值
    Go-gRPC的简单使用
    GO-操作etcd简单示例
    进度报告
    进度报告
    windown 10 安装redis
    在.Net Core中使用T4工具生成实体文件
    python-with关键字,json,pickie序列化与反序列化
    python-文件操作-读,写,追加
  • 原文地址:https://www.cnblogs.com/6yuhang/p/8244620.html
Copyright © 2011-2022 走看看