postgresql數據庫中,查詢點在面內


前幾日在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()的結果集


免責聲明!

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



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