标签:面内 ci postgresql EXISTS exists 数据库 查询 xz 索引
前几日在qq群,碰到了一个关于pg查询的问题,本人想出了一些方法,记录下来,以后可能会用得到
数据基础:t_city存储城市的面数据,数据量346条,xzqhdm存储行政区划点数据,数据量:712182条
需求:查询行政区划数据中,被城市的面包含的点
第一种方法:
SELECT * from xzqhdm as xz where xz.shape is not null and EXISTS (select ci.id from t_city as ci where st_intersects(ci.geom,xz.shape) LIMIT 1) LIMIT 10000
查询10000个点用了3.7秒,当只查询点信息,这种方式是最快的(不输出面信息)
查询方式和程序中处理比较像:
外层循环取出一个值与内层循环中的值比较,有一个如何,则将外层的数据加入到一个返回变量中,最后返回这个变量
第二种
select * from xzqhdm xz left JOIN t_city as ci on st_intersects(ci.geom,xz.shape) where xz.shape is not null LIMIT 10000
查询10000 个点用了13秒,比第一种慢,但是会携带面信息
查询方式,利用左连接,将两张表以包含关系结合然会返回需要的条数
第三种
如果数据变化不大的情况,可以将这种关联关系事先存在一张表中,可以达到毫秒级查询速度,数据变动之后,根据变化的数据更新关系即可
如有更好的方法,评论中留言,感谢
关于EXISTS 和 IN 的索引问题
in 是把外表和内表作hash join,而exists是对外表作loop,每次loop再对内表进行查询;
INT 的执行过程:
在in执行的过程中,用到了外层查询上的连接字段索引,首先执行in语句,然后将结果缓存起来,之后遍历t1表,将满足结果的加入结果集,所以执行次数为t1.length*t2.length次。
EXISTS 的执行过程:
用到了内层查询上的连接字段索引,exists执行次数为t1.length,不缓存exists的结果集
具体需求,具体应用
关于NOT EXISTS 和 NOT IN的索引问题
NOT IN 的执行过程:
因为not in实质上等于
!= and != ···
,因为!=不会使用索引,故not in不会使用索引。NOT EXISTS 的执行过程:
执行过程和exists一样,用到了内层查询上的关联字段索引,exists()执行次数为t1.length,不缓存exists()的结果集
标签:面内,ci,postgresql,EXISTS,exists,数据库,查询,xz,索引 来源: https://www.cnblogs.com/watson-xm/p/11194361.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。