SDE ST_Geometry SQL st_intersects查詢很慢的解決方法


環境:服務端 SDE 10.0 oracle 11.2,客戶端 PLSQL 11,oracle 11.2

為了調試方便,以下測試都是把sql提取出來在PLSQL上做

 


 

需求是已知一個多邊形的點坐標,要在一個線圖層里,做關系為intersect的空間查詢,原來的sql是這樣

select LNO
  from HSLINE t
 where sde.st_intersects(t.shape,
                         sde.st_geometry('polygon ((536001.227128728 3646345.3998618745,535967.7465966925 3646245.5819230564,536081.5112751485 3646231.6260272274,536096.174854475 3646337.021285943,536096.174854475 3646337.021285943,536001.227128728 3646345.3998618745))',
                                         t.shape.srid)) = 1

 

可是查詢很慢,要幾分鍾,圖層數據量才幾萬,理論上不應該這么慢

 

后來發現是構建幾何對象(st_geometry)造成的,如果把st_geometry放在一個select里,查詢速度就正常了

select LNO
  from HSLINE t
 where sde.st_intersects(t.shape,
                         (select sde.st_geometry('polygon ((536001.227128728 3646345.3998618745,535967.7465966925 3646245.5819230564,536081.5112751485 3646231.6260272274,536096.174854475 3646337.021285943,536096.174854475 3646337.021285943,536001.227128728 3646345.3998618745))',
                                                 t.shape.srid)
                            from HSLINE where rownum=1)) = 1

 

然而這樣還有個缺陷,萬一表HSLINE一行都沒有就會出錯,后來同事出了注意,最后做成完美版本

select LNO
  from HSLINE t
 where sde.st_intersects(t.shape,
                         (select sde.st_geometry('polygon ((536001.227128728 3646345.3998618745,535967.7465966925 3646245.5819230564,536081.5112751485 3646231.6260272274,536096.174854475 3646337.021285943,536096.174854475 3646337.021285943,536001.227128728 3646345.3998618745))',
                                                 t.shape.srid)
                            from dual)) = 1

 

dual的解釋http://www.cnblogs.com/qiangqiang/archive/2010/10/15/1852229.html

 

最后,這個慢的原因,我覺得是可能每一行做where判斷時,都會執行一次st_geometry生成幾何對象,如果把它放在一個子select里,數據庫就會只做一次子select查詢,然后把結果存起來,主表where判斷時直接用這個對象


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM