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判断时直接用这个对象

时间: 2024-07-31 14:25:56

SDE ST_Geometry SQL st_intersects查询很慢的解决方法的相关文章

Microsoft Dynamics CRM 2011 当您在 大型数据集上执行 RetrieveMultiple 查询很慢的解决方法

症状 当您在 Microsoft Dynamics CRM 2011 年大型数据集上执行 RetrieveMultiple 查询时,您会比较慢. 原因 发生此问题是因为大型数据集缓存 RetrieveMultiple 查询 Microsoft SQL 查询计划.RetrieveMultiple 优化的基本的深度,则需要读取权限"本地的深度"和"深层防御"读取权限. 解决方案 重要:此部分. 方法或任务包含一些介绍如何修改注册表的步骤.但是,如果不正确地修改了注册表,

SQL Server2005索引碎片分析和解决方法

SQL Server2005索引碎片分析和解决方法 本文作者(郑贤娴),请您在阅读本文时尊重作者版权. 摘要: SQL Server,为了反应数据的更新,需要维护表上的索引,因而这些索引会形成碎片.根据工作量的特征,这些碎片会影响对应的工作性能.此文帮助决定是否需要整理碎片以改善性能的信息.SQL Serve提供一些命令来实现索引的碎片整理.这里比较其中两个命令:DBCC DBREINDEX 和 DBCC INDEXDEFRAG. 关键词: SQL Server;索引碎片;数据库优化毫无疑问,给

eclipse插件Maven添加依赖查询无结果的解决方法(Select Dependency doesn't work)

在eclipse中用过maven的可能都遇到过这种情况,我以前一直在search.maven里面搜索,然后添加pom信息. 今天在网上搜索时,找到了一个解决方法,在这里分享一下. 第一步,在preferences里面选择maven,选中"Download repository index updates on startup" 第二步,打开Maven仓库 第三步,在全局仓库上右键选择"Full Index Enabled" 选择之后,maven会下载一个近百兆的索引

Word 2010打开大文档时速度很慢的解决方法

这两天终于搞清楚了一个困扰了我很久的问题.我的Word 2010在打开很大的Word文档(如小组的硕士学位论文)时,经常发生速度慢甚至很长时间没有响应的问题.在师弟的提示下,终于找到一个折衷的解决方案: 其实是对中英文混合大文档拼写检查的问题,关闭拼写和语法检查就可以了,设置方法:点击"文件"--"选项"--"校对"--取消"在Word中更新拼写和语法时"下的所有对号.就可以顺利打开Word文档了. 另外,我们在英文的时候需要

HTML5做手机站页面字体显示很小的解决方法

原文:HTML5做手机站页面字体显示很小的解决方法 HTML5做手机站需要加上一部分代码,不然字体会显示很小的,经历了很久的不解才发现的,希望给大家一些帮助 <!DOCTYPE html PUBLIC "-//WAPFORUM//DTD XHTML Mobile 1.0//EN" "http://www.wapforum.org/DTD/xhtml-mobile10.dtd"> <html xmlns="http://www.w3.org

CentOS 6.3 SSH连接时很慢的解决方法

SSH的配置文件,默认开启了DNS反向解析,这使得处于同一个局域网下的终端,在SSH到服务器的时候异常缓慢,如果从是外网SSH到服务器的话,速度则是正常的.我们只需要关闭DNS反向解析即可. 修改/etc/ssh/sshd_config文件 将 #UseDNS YES 修改为 UseDNS no 重启SSHD服务后问题解决. CentOS 6.3 SSH连接时很慢的解决方法

【原】新装SQL Server 2014 遇到问题的解决方法。

[尝试读取或写入受保护的内存.这通常指示其他内存已损坏. (System.Data)] 管理员身份运行 cmd -> 输入 netsh winsock reset 提问者评价 曾经让我重装系统的bug,一句话就就解决了,谢谢你~ 评论 | 2 [原]新装SQL Server 2014 遇到问题的解决方法.

SQL Server查询中特殊字符的处理方法

SQL Server查询中,经常会遇到一些特殊字符,比如单引号"'"等,这些字符的处理方法,是SQL Server用户都应该需要知道的. 我们都知道SQL Server查询过程中,单引号"'"是特殊字符,所以在SQL Server查询的时候要转换成双单引号"''".但这只是特殊字符的一个,在实际项目中,发现对于like操作还有以下特殊字符:下划线"_",百分号"%",方括号"[]"以及尖

dedecms SESSION变量覆盖导致SQL注入common.inc.php的解决方法

漏洞名称:dedecms SESSION变量覆盖导致SQL注入 补丁文件:/include/common.inc.php 补丁来源:阿里云云盾自研 漏洞描述:dedecms的/plus/advancedsearch.php中,直接从SESSION[SESSION[sqlhash]获取值作为$query带入SQL查询,这个漏洞的利用前提是session.auto_start = 1即开始了自动SESSION会话,云盾团队在dedemcs的变量注册入口进行了通用统一防御,禁止SESSION变量的传入