標籤: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度的跨度,然後得到10053的trc:
分析tddc_ora_8525.trc檔案
範圍變大了,但選擇度仍然為1/100。
我們再次回到前面的例子中,
而DLTB20150705表的記錄數,根據之前的查詢,為:
而14300 = round(1430023 * 0.01)
結論:
1、SDO_ANYINTERACT操作符的選擇度恒定為1/100。其它操作符的選擇度有待驗證。
Oracle spatial空間查詢的選擇度分析