Gis 雪花状ST_多边形(对地理(…)而言)效率低下

Gis 雪花状ST_多边形(对地理(…)而言)效率低下,gis,snowflake-cloud-data-platform,Gis,Snowflake Cloud Data Platform,我有一些使用地理空间条件的查询。这些查询运行速度惊人地慢。起初我以为这是地理空间计算本身,但如果把一切都简化为ST_POLYGON(to_GEOGRAPHY(…),速度仍然很慢。如果每一行都有自己的多边形,但条件在查询中使用静态多边形,则这是有意义的: SELECT ST_POLYGON(TO_GEOGRAPHY('LINESTRING(-95.75122850074004 28.793166796020444,-95.68622920563344 30.207416499279063

我有一些使用地理空间条件的查询。这些查询运行速度惊人地慢。起初我以为这是地理空间计算本身,但如果把一切都简化为ST_POLYGON(to_GEOGRAPHY(…),速度仍然很慢。如果每一行都有自己的多边形,但条件在查询中使用静态多边形,则这是有意义的:

SELECT 
    ST_POLYGON(TO_GEOGRAPHY('LINESTRING(-95.75122850074004 28.793166796020444,-95.68622920563344 30.207416499279063,-94.5162418937178 32.56537633083211,-90.94128066286225 34.24734047810797,-88.17881062083825 36.812423897251634,-86.13133282498448 38.15341651409619,-85.28634198860107 38.66275098353796,-84.37635185711038 38.789523129087826,-82.84886842210855 38.4848923369382,-82.32887406125734 37.820427257446994,-82.26387476615074 36.96838022284757,-82.03637723327772 36.00158943485101,-80.99638851157454 35.34155096040939,-78.52641529752944 34.62260477275565,-77.51892622337955 34.005211031324734,-78.26641811710381 31.1020568651834,-80.24889661785029 29.926151366059756,-83.59636031583283 28.793166796020444,-95.75122850074004 28.793166796020444)'))
FROM TABLE(GENERATOR(ROWCOUNT=>1000000))
Snowflake应该能够计算出,对于整个查询,它只需要计算一次这个多边形。然而,添加的行越多,速度就越慢。在x-small上,此查询需要一分钟。其中,此查询:

SELECT 
    'LINESTRING(-95.75122850074004 28.793166796020444,-95.68622920563344 30.207416499279063,-94.5162418937178 32.56537633083211,-90.94128066286225 34.24734047810797,-88.17881062083825 36.812423897251634,-86.13133282498448 38.15341651409619,-85.28634198860107 38.66275098353796,-84.37635185711038 38.789523129087826,-82.84886842210855 38.4848923369382,-82.32887406125734 37.820427257446994,-82.26387476615074 36.96838022284757,-82.03637723327772 36.00158943485101,-80.99638851157454 35.34155096040939,-78.52641529752944 34.62260477275565,-77.51892622337955 34.005211031324734,-78.26641811710381 31.1020568651834,-80.24889661785029 29.926151366059756,-83.59636031583283 28.793166796020444,-95.75122850074004 28.793166796020444)'
FROM TABLE(GENERATOR(ROWCOUNT=>3000000))
(增加了2毫米的行以匹配字节计数)

可以在2秒内完成

我试着自己用
with
语句“预计算”多边形,但SF发现
with
是多余的,于是放弃了它。我还尝试设置一个会话变量,但不能将像这样的复杂值设置为变量


我认为这是一个bug。

地理空间功能目前正在预览中,团队正在努力进行各种优化

对于这种情况,我想指出的是,使多边形成为一个单行表会有所帮助,但我仍然希望团队在测试版中获得更好的性能

让我创建一个包含一行的表,多边形:

创建或替换临时表poly1
像
选择ST_多边形(到线字符串(-95.75122850074004 28.793166796020444,-95.68622920563344 30.207416499279063,-94.5162418937178 32.56537633083211,-90.94128066286225 34.24734047810797,-88.17881062083825 36.812423897251634,-86.13133282498448 38.15341651409619,-85.28634198860107 38.66275098353796,-84.37635185711038 38.789523129087826,-82.84886842210855 38.4848923369382,-82.32887406125734 37.820427257446994,-82.26387476615074 36.96838022284757,-82.03637723327772 36.00158943485101,-80.99638851157454 35.34155096040939,-78.52641529752944 34.62260477275565,-77.51892622337955 34.005211031324734,-78.26641811710381 31.1020568651834,-80.24889661785029 29.926151366059756,-83.59636031583283 28.793166796020444,-95.75122850074004 28.793166796020444)'
))多边形
;
为了看看这是否有帮助,我尝试了一百万行交叉连接:

选择*
从poly1,表(生成器(ROWCOUNT=>1000000));
这需要14秒,在查询分析器中,您可以看到大部分时间都花在内部
TO_对象上​(​获取路径​(​POLY1​.​多边形“U形”​)​​

有趣的是,前面的操作主要涉及多边形的ascii表示。在该多边形上运行操作要快得多:

选择st_区域(多边形)
从poly1,表(生成器(ROWCOUNT=>1000000));
这个查询应该花费更长的时间(查找多边形的区域听起来比选择它更复杂),但结果只花了7秒(大约一半)

感谢您的报告,团队将继续优化此类案例


对于任何对问题中的特定多边形好奇的人来说,这是一颗善良的心:


地理空间功能目前正在预览中,团队正在努力进行各种优化

对于这种情况,我想指出的是,使多边形成为一个单行表会有所帮助,但我仍然希望团队在测试版中获得更好的性能

让我创建一个包含一行的表,多边形:

创建或替换临时表poly1
像
选择ST_多边形(到线字符串(-95.75122850074004 28.793166796020444,-95.68622920563344 30.207416499279063,-94.5162418937178 32.56537633083211,-90.94128066286225 34.24734047810797,-88.17881062083825 36.812423897251634,-86.13133282498448 38.15341651409619,-85.28634198860107 38.66275098353796,-84.37635185711038 38.789523129087826,-82.84886842210855 38.4848923369382,-82.32887406125734 37.820427257446994,-82.26387476615074 36.96838022284757,-82.03637723327772 36.00158943485101,-80.99638851157454 35.34155096040939,-78.52641529752944 34.62260477275565,-77.51892622337955 34.005211031324734,-78.26641811710381 31.1020568651834,-80.24889661785029 29.926151366059756,-83.59636031583283 28.793166796020444,-95.75122850074004 28.793166796020444)'
))多边形
;
为了看看这是否有帮助,我尝试了一百万行交叉连接:

选择*
从poly1,表(生成器(ROWCOUNT=>1000000));
这需要14秒,在查询分析器中,您可以看到大部分时间都花在内部
TO_对象上​(​获取路径​(​POLY1​.​多边形“U形”​)​​

有趣的是,前面的操作主要涉及多边形的ascii表示。在该多边形上运行操作要快得多:

选择st_区域(多边形)
从poly1,表(生成器(ROWCOUNT=>1000000));
这个查询应该花费更长的时间(查找多边形的区域听起来比选择它更复杂),但结果只花了7秒(大约一半)

感谢您的报告,团队将继续优化此类案例


对于任何对问题中的特定多边形好奇的人来说,这是一颗善良的心:


听起来优化器不适合这种情况,我会打开一个支持案例,让他们研究它,并尝试找到一种解决方法来避免这种行为。使用一些方法,我不能强迫优化器不将其视为先做后做。在过去,即使你找到一种模式来欺骗它,其他的更改也不会o SQL可以允许这样做,因此可以再次查看模式,并迫使您返回缓慢状态。如果不在安全视图中加入一些逻辑以强制执行评估,或者通过临时表将SQL分解为步骤。@SimeonPrilgrim我尝试了一个临时表,请参见下面的结果。如果优化器不适用于这种情况,我会