1. 程式人生 > >Oracle spatial空間查詢的選擇度分析

Oracle spatial空間查詢的選擇度分析

left info ext 字符串類型 計算模型 rom 經緯度 排序 try

在上一篇中,我用一個案例演示了對於數值或字符串類型的字段,選擇度的計算方法。並證明了當字段值的選擇度不同時,將會影響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

8,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空間查詢的選擇度分析