<div dir="ltr"><div class="gmail_default" style="font-size:small">As I am working with large polygons, I'm always struggling with performance, and trying to find ways to improve them.</div><div class="gmail_default" style="font-size:small">F.e. I have lots of queries like:</div><div class="gmail_default" style="font-size:small">SELECT ST_Intersection(table1.geom,table2.geom) <br></div><div class="gmail_default" style="font-size:small">FROM table1</div><div class="gmail_default" style="font-size:small">JOIN table2 on ST_Intersects(table1.geom,table2.geom)</div><div class="gmail_default" style="font-size:small"><br></div><div class="gmail_default" style="font-size:small">In case of large polygons this is sometimes a bottleneck, and I have the following suggestion:</div><div class="gmail_default" style="font-size:small">Create a function which returns the relation between 2 polygons (within, intersects or disjunct) so that I can do the following:</div><div class="gmail_default" style="font-size:small"><br></div><div class="gmail_default" style="font-size:small">
<div class="gmail_default" style="font-size:small">SELECT <br></div><div class="gmail_default" style="font-size:small">  CASE</div><div class="gmail_default" style="font-size:small">     WHEN 
ST_Relate(table1.geom,table2.geom)=intersects THEN ST_Intersection(table1.geom,table2.geom) <br></div><div class="gmail_default" style="font-size:small">     ELSE table1.geom</div><div class="gmail_default" style="font-size:small">  END<br></div><div class="gmail_default" style="font-size:small">FROM table1</div><div class="gmail_default" style="font-size:small">JOIN table2 on ST_Relate(table1.geom,table2.geom) IN (intersects,within)<br></div><div class="gmail_default" style="font-size:small"><br></div><div class="gmail_default" style="font-size:small">or (because 
ST_Relate is calculated twice in previous query):</div><div class="gmail_default" style="font-size:small"><br></div><div class="gmail_default" style="font-size:small">
<div class="gmail_default" style="font-size:small">SELECT <br></div><div class="gmail_default" style="font-size:small">  CASE</div><div class="gmail_default" style="font-size:small">     WHEN relate=intersects THEN ST_Intersection(t1geom,t2geom) <br></div><div class="gmail_default" style="font-size:small">     ELSE t1geom</div><div class="gmail_default" style="font-size:small">  END</div><div class="gmail_default" style="font-size:small">FROM (<br></div><div class="gmail_default" style="font-size:small">  SELECT ST_Relate(table1.geom,table2.geom) as relate,table1.geom AS t1geom,table2.geom AS t2geom FROM table1</div><div class="gmail_default" style="font-size:small">  JOIN table2 on table1.geom && table2.geom</div><div class="gmail_default" style="font-size:small">) AS allpolies</div><div class="gmail_default" style="font-size:small">WHERE relate IN 
(intersects,within)

</div><div class="gmail_default" style="font-size:small"><br></div>

</div>

</div></div>