当前位置: 首页 > 知识库问答 >
问题:

查询以获取表1中每一行的结果,其中包含满足表2中条件的N个最大记录的子查询

羊禄
2023-03-14

我正在尝试使用激光雷达卫星数据集计算我所在城市的建筑物高度,但没有成功。

系统规格

  • CPU:核心i7 6700k 4200MHz,4核,8线程
  • 内存:32GB DDR4 3200mhz
  • SSD:1TB三星970 EVO
  • 操作系统:Ubuntu 18.04

Postgres设置

我在PostGIS中使用最新版本的Postgres v12.1数据库,并在不同来源中建议进行以下调整:

 shared_buffers = 256MB 
 maintenance_work_mem = 4GB
 max_parallel_maintenance_workers = 7
 max_parallel_workers = 7
 max_wal_size = 60GB
 min_wal_size = 90MB
 random_page_cost = 1.0

数据库设置

    < li >在激光雷达表中,我有超过30亿行,在建筑物表中有超过15万行。 < li >在激光雷达表中创建了GiST索引:< code >使用GIST (geom)在激光雷达上创建索引lidar _ idx < li >构建表格:| gid | geom | < li >激光雷达表:| z | geom |

高度计算

目前,为了计算建筑物的高度,需要检查30亿个点(行)中的每一个点是否都在每个建筑物的区域内,并计算在建筑物区域内发现的所有点的平均值。

我尝试的查询需要很长时间(可能超过 5 天甚至更长时间),我想简化查询,以便我可以用更少的点获得建筑物的高度,而不必与每次每个建筑物的所有疯狂的 30 亿条记录进行比较。

例如:

  • 对于使用 id1 的建筑,我只想获取在建筑几何区域内找到的前 100 条记录(ST_Within(l.geom,e.geom)),一旦找到这 100 条记录,就传递到下一个建筑。
  • 对于使用 id2 构建,我想要同样的东西,只获取在建筑区域内找到的前 100 条记录。
  • 等等..

我的主要查询是

SELECT e.gid, AVG(l.z) AS height 
FROM lidar l, 
     buildings e 
WHERE ST_Within(l.geom, e.geom) 
GROUP BY e.gid) t

我已经尝试过另一个查询,但无法使其生效。

SELECT e.gid, AVG(l.z), COUNT(1) FILTER (WHERE ST_Within(l.geom, e.geom)) AS gidc
FROM lidar l, buildings e
WHERE gidc < 100
GROUP BY e.gid

共有1个答案

司马腾
2023-03-14

我认为你根本不想这样做。首先,您应该尝试通过处理任意(但不是随机)数据子集来加快正确查询的速度,而不是损害正确性。

但是如果你真的想要,你可以用横向连接。

SELECT e.gid from 
    buildings e cross join lateral 
    (select AVG(l.z) AS height FROM lidar l WHERE ST_Within(l.geom, e.geom) LIMIT 100) 

有必要检查3000万个点(行)中的每一个是否在每个建筑的区域内,并计算在建筑区域内发现的所有点的平均值。

这正是几何索引的用途。你不需要查看每一个点来获取建筑区域内的点。如果没有正确的索引,例如< code > on lidar using gist(geom),那么横向连接查询也会很糟糕。

 类似资料:
  • 问题内容: 我有一个包含大量记录(> 300,000)的表。表格中最相关的字段是: CREATE_DATE MOD_DATE 每次添加或更新记录时,这些记录都会更新。 现在,我需要查询该表以查找上次修改的记录的日期。我目前正在使用 但是我想知道这是否是获得答案的最有效方法。 我尝试添加一个来将日期限制为上个月,但实际上看起来比较慢(并且我需要最新的日期,该日期可能早于上个月)。 我还尝试了我在其他

  • 问题内容: 我需要执行django查询,以检查字段是否包含列表中的所有值。该列表的长度将有所不同 例 问题答案: 对于python 3

  • 问题内容: 我将不胜感激创建此查询的任何帮助。我尝试了好几种方法,但都没有碰到运气。由于我的问题很难表达,因此我将举一个我想做的简单例子。我的数据在结构上类似于以下内容: 如果我有两种特定颜色的ID,我想创建一个查询以返回类型。例如,我想查找所有具有蓝色和红色的ID。然后查询将返回: A和B的返回顺序并不重要。数据集很大,我希望有许多ID可以同时满足这两个条件(也许是50,000个左右)。我要指出

  • 我有用于分页的逻辑,它工作得非常好。这个问题是为了优化/改进我是如何做某事的。 我正在运行两个查询以获得结果集。第一个查询按限制和偏移量获取所有项,第二个查询获取总计数。我需要这个总数来计算表示层中的分页链接。 我想避免运行两个查询,如果可能的话,将它们合并成一个。 例如,如果数据库中有100项,并且我运行下面的查询时为1,为20,那么查询应该返回20个结果和100个计数。我目前在两个单独的查询中

  • 问题内容: 以下是最简单的示例,尽管任何解决方案都应能够扩展到需要n个顶级结果的地方: 给定下面的表格,其中包含“人员”,“组”和“年龄”列,您将如何 获得每个组中 年龄 最大的2个人? (组内的关系不应产生更多结果,而应按字母顺序给出前两个) 所需的结果集: 注意: 这个问题建立在先前的问题上- 获取每组分组的SQL结果的最大值的记录 -用于从每组中获取一个顶行,并且从@Bohemian那里收到

  • 问题内容: 我的数据库表中具有以下格式的数据: 该列将来自该列的数据作为父记录。带有值的表示根项目。我需要编写查询以按以下顺序获取数据: 我需要得到根记录(与记录为0),然后是所有和这根记录,然后获得下根的记录,然后和在这个根记录等等。 问题答案: 我在这里提出的解决方案使用了物化路径的概念。以下是使用样本数据的实例化路径的示例。我希望它可以帮助您理解物化路径的概念: 每个节点都有一个实例化路径,