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,11
現在我們的查詢範圍變大了,但是cardinality仍然為14300。而此時返回的真實記錄數是多少呢?
確實比經緯度跨度為1的矩形返回的記錄多,但即使如此,執行計劃的cardinality與之前一致。
到現在為止,我們看到的是結果:不同空間範圍進行空間查詢,其cardinality值不變化。那現在不禁要問,這個值是怎麽計算得到的呢?那就得分析10053事件。
分析tddc_ora_8438.trc文件,發現cardinality的計算方法如下:
從該PLSQL BLOCK中可以發現,空間查詢範圍作為輸入信息代入到代碼段中去,最終得到的選擇率為1/100。單從計算方法上看,似乎查詢範圍會影響到最終的
分析tddc_ora_8525.trc文件
範圍變大了,但選擇度仍然為1/100。
我們再次回到前面的例子中,
而DLTB20150705表的記錄數,根據之前的查詢,為:
而14300 = round(1430023 * 0.01)
結論:
1、SDO_ANYINTERACT操作符的選擇度恒定為1/100。其它操作符的選擇度有待驗證。
Oracle spatial空間查詢的選擇度分析