环境:服务端 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判断时直接用这个对象

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

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

    症状 当您在 Microsoft Dynamics CRM 2011 年大型数据集上执行 RetrieveMultiple 查询时,您会比较慢. 原因 发生此问题是因为大型数据集缓存 Retrieve ...

  2. 浅谈MySQL中优化sql语句查询常用的30种方法 - 转载

    浅谈MySQL中优化sql语句查询常用的30种方法 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中使 ...

  3. SQL Server查询中特殊字符的处理方法 (SQL Server特殊符号的转义处理)

    SQL Server查询中特殊字符的处理方法 (SQL Server特殊符号的转义处理) SQL Server查询中,经常会遇到一些特殊字符,比如单引号'等,这些字符的处理方法,是SQL Server ...

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

    SQL Server2005索引碎片分析和解决方法 本文作者(郑贤娴),请您在阅读本文时尊重作者版权. 摘要: SQL Server,为了反应数据的更新,需要维护表上的索引,因而这些索引会形成碎片.根 ...

  5. 无法打开物理文件xxx.mdf操作系统错误 5:“5(拒绝访问。)” (Microsoft SQL Server,错误: 5120)的解决方法

    无法打开物理文件xxx.mdf操作系统错误 5:“5(拒绝访问.)” (Microsoft SQL Server,错误: 5120)的解决方法   问题描述: 在附加数据库到sql server时,附 ...

  6. SQL Server 2008 允许远程链接 解决方法

    用户在使用SQL Server 2008远程链接时,可能会弹出如下对话框: 在链接SQL服务器时发生网络链接错误或特定实例错误.SQL服务器不存在或者链接不成功.请验证用户名是否正确或SQL服务器是否 ...

  7. SQL Server作业没有执行的解决方法

    SQL Server作业没有执行的解决方法  确保SQL Agent服务启动,并设置为自动启动,否则你的作业不会被执行    设置方法:  我的电脑--控制面板--管理工具--服务--右键 SQLSE ...

  8. 【常见的SQL Server连接失败错误以及解决方法】

    [常见的SQL Server连接失败错误以及解决方法] http://blog.csdn.net/feixianxxx/article/details/5523922 ADO连接SQL Server ...

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

    SQL Server查询中,经常会遇到一些特殊字符,比如单引号“'”等,这些字符的处理方法,是SQL Server用户都应该需要知道的. 我们都知道SQL Server查询过程中,单引号“'”是特殊字 ...

随机推荐

  1. shell | {}和()

    执行 bash -n xx.sh用于检测脚本语法是否有错误 bash -x xx.sh用于追踪执行 ${var} 用于限定变量名称的范围,并且支持通配符 $(cmd) shell会先执行括号的cmd, ...

  2. [SCOI2012] 喵星球上的点名

    Description 给定 \(N\) 个姓名串和 \(M\) 个点名串.询问每个点名串点到了多少姓名和每个姓名串被点到了几次.\(N\leq 5\cdot 10^4,M\leq 10^5\). S ...

  3. .net敏捷开发框架 力软(learun) 让开发变的更简单

    版本:6.1.6.2 体验地址:www.fishcmonkey.com 联系QQ:6539471

  4. Android目录结构及作用

    1.add-ons-->Google API .比如GoogleMaps 2.build-tools-->各版本SDK编译工具. 3.docs-->离线开发者文档Android SD ...

  5. Asp.net Core 打包发布 (Linux+Nginx)

    如果你觉得如下这些文章对你有帮助,请点击链接支持作者原创 http://www.cnblogs.com/savorboard/ .Net Core SDK 命令介绍   前言 本篇主要介绍 asp.n ...

  6. 【ichart】简单的统计图表ichart.js的使用

    1.首先下载,点击下载 2.只需要这一个js,粘贴赋值到自己项目中即可.   3.引入js <script type="text/javascript" src=" ...

  7. Strust2框架笔记01_XML配置_action编写

    目录 1.Struts2概述 1.1 什么是Struts2 1.2 Web层框架基于前端控制器模型设计 2. Struts2入门案例 2.1 Struts2的开发环境 2.2 解压开发包 2.3 创建 ...

  8. kafka结合Spark-streming的直连(Direct)方式

     说明:此程序使用的scala编写 在spark-stream+kafka使用的时候,有两种连接方式一种是Receiver连接方式,一种是Direct连接方式. 两种连接方式简介: Receiver接 ...

  9. √n求单值欧拉函数

    基本定理: 首先看一下核心代码: 核心代码 原理解析: 当初我看不懂这段代码,主要有这么几个问题: 1.定理里面不是一开始写了一个n*xxx么?为什么代码里没有*n? 2.ans不是*(prime[i ...

  10. 图中最短路径的算法--dijiska算法C语言实现

    #include <stdio.h> #include <stdlib.h> #define ERROR_NO_MEM -1 /*内存不足的错误码*/ #define MAX_ ...