大家好,欢迎来到IT知识分享网。
最近遇到一个情况使用oracle查询空间数据非常慢。6条数据查询需要16.406秒。这样的速度几乎造成客户端不能使用。
SELECT SHAPE,OID FROM T_TX_SHAPE T WHERE 1=1 AND YXDW = '17863C81FE020719E05347F3D70AAC91' AND SDO_ANYINTERACT( T.shape, sdo_geometry(2003,NULL,NULL, sdo_elem_info_array(1,1003,3), sdo_ordinate_array( 101.350, 36.2195, 101.23, 36.295))) = 'TRUE'
但是有个非常奇怪的现场是,在PLSQL中第一次耗时16秒,但是在执行一次耗时将会降低至0.75秒。
1、考虑是否在java代码中将过滤条件使用占位符,通过预处理查询来看是否可以提高查询速度。修改后的效果并不明显。几乎没有起到优化效果。
2、考虑将是否是空间函数SDO_ANYINTERACT造成的?后经过替换SDO_FILTER、SDO_RELATE等尝试,也没有根本上的效果,几乎都是10秒之上。
情况分析:
1、首先将查询语句的过滤条件完全去掉,查询速度并不慢。耗时0.282秒。
SELECT count(1) CN FROM T_TX_SHAPE T
2、如果加上空间过滤查询,结果的速度1.25秒也不慢。
SELECT SHAPE,OID FROM T_TX_SHAPE T WHERE 1=1 --AND YXDW = '17863C81FE020719E05347F3D70AAC91' AND SDO_ANYINTERACT(T.shape, sdo_geometry(2003,NULL,NULL, sdo_elem_info_array(1,1003,3), sdo_ordinate_array( 101.350, 36.2195, 101.23, 36.295))) = 'TRUE'
过滤条件增加YXDW,则速度将会变成10+秒。那么可以肯定我们的SQL应该没有走空间索引。所以考虑的方法是强制SQL走空间索引。
SELECT /*+ INDEX(t T_TX_SHAPE_INDEX) +*/ SHAPE,OID FROM T_TX_SHAPE T WHERE 1=1 AND YXDW = '17863C81FE020719E05347F3D70AAC91' AND SDO_ANYINTERACT( T.shape, sdo_geometry(2003, NULL, NULL, sdo_elem_info_array(1,1003,3), sdo_ordinate_array( 101.350, 36.2195, 101.23, 36.295))) = 'TRUE'
加上空间索引之后,速度优化到了0.813秒。
这样也就解决了目前的查询慢的问题,但是为什么会出现加了其他过滤条件之后,就不走空间索引的问题还是没有头绪。希望以后能够明白真正的原因。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/74079.html