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

前幾日在qq羣,碰到了一個關於pg查詢的問題,本人想出了一些方法,記錄下來,之後可能會用獲得緩存

數據基礎:t_city存儲城市的面數據,數據量346條,xzqhdm存儲行政區劃點數據,數據量:712182條oop

需求:查詢行政區劃數據中,被城市的麪包含的點code

第一種方法:索引

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 10000ci

查詢10000個點用了3.7秒,當只查詢點信息,這種方式是最快的(不輸出面信息)hash

查詢方式和程序中處理比較像:it

外層循環取出一個值與內層循環中的值比較,有一個如何,則將外層的數據加入到一個返回變量中,最後返回這個變量基礎

第二種變量

select * from xzqhdm xz left JOIN t_city as ci on st_intersects(ci.geom,xz.shape) where xz.shape is not null LIMIT 10000select

查詢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()的結果集

相關文章
相關標籤/搜索