天天看点

PostgreSQL 单列多条件查询优化 - 多个多边形查询4倍提升的技巧

postgresql , postgis , 多边形合并 , 条件合并 , 菜鸟

在某些空间数据查询需求中,有一些这样的请求,例如查找与某些多边形中的任意一个相交的空间对象。

比如在菜鸟、新零售的业务中,查询某几个商场多边形,或者某几个小区多边形内覆盖的点。

sql写法可能是这样的

postgresql支持空间索引,同时支持bitmapand, bitmapor index scan。也就是说只要geo_point字段有索引,不管多少个查询条件,都可以走index scan。

这个查询有什么优化空间么?

在讲这个空间优化前,我们来看另一个例子。

单列组合条件查询与前面提到的需求类似,即一个字段,多个查询条件。是不是类似于一个字段,多个多边形匹配呢?

表结构如下

查询需求如下,id字段上有4个条件,任意条件满足即返回结果。

postgresql根据统计信息,基于cbo成本优化,采用了bitmapor,重复使用了多次单列索引,合并所有条件对应的数据块。最后进行一次recheck得到所要的结果。

bitmapand,bitmapor是postgresql数据库独有的特性,可以在多个查询条件的组合查询中使用多个索引进行数据块的合并和消除扫描,非常赞。

而实际上这4个条件,我们可以在逻辑上合成一个条件。

合成后,走精确索引扫描,性能提升几十倍。

实际上,空间类型的数据,也是一样的,而且合成起来更方便,通过st_union即可。

优化为

性能提升也是非常明显的。

<a href="http://postgis.net/docs/manual-2.3/st_union.html">http://postgis.net/docs/manual-2.3/st_union.html</a>

<a href="https://www.postgresql.org/docs/9.6/static/indexes-bitmap-scans.html">https://www.postgresql.org/docs/9.6/static/indexes-bitmap-scans.html</a>