postgresql - 在 Postgres 中使用 floor() 从大表中高效地进行选择

标签 postgresql

我有两个表:一个是包含自然数的 x 和 y 列的正方形,另一个是第一个表创建的网格上的点。示例模式:

网格表

id  | x | y
------------  
123 | 1 | 1  
234 | 1 | 2
345 | 2 | 1   
456 | 2 | 2

然后,点表:

id |   x  |  y  
----------------
12 | 1.23 | 1.23
23 | 2.89 | 1.55  

目前,使用这个查询:

SELECT g.* FROM grid as g, points as p  
WHERE p.id=23 AND floor(p.x)=g.x AND floor(p.y)=g.y;

我得到了预期的结果,这是id为23的点所在的网格正方形(id为345的网格);然而,当 grid 表有 10,000,000 行时(我所处的当前情况),此查询难以置信慢,即几秒钟的数量级。

我已经找到了一个解决方法,但它很丑陋:

SELECT g.* FROM grid as g, points as p  
WHERE p.id=23 AND (p.x-.5)::integer=g.x AND (p.y-.5)::integer=g.y;  

我在 11 毫秒内再次获得了预期的结果,但这感觉很糟糕。有没有更清洁的方法来做到这一点?感谢您的帮助!

最佳答案

您可以使用 CTE,因为它只被评估一次。

WITH p2 AS (select floor(p.x) x, 
                   floor(p.y) y 
            from points  p 
            where p.id=23)
SELECT  g.* 
FROM grid g
INNER JOIN  p2
ON p2.x=g.x and p2.y=g.y

关于postgresql - 在 Postgres 中使用 floor() 从大表中高效地进行选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46821460/

相关文章:

sql - 是否可以在同一个查询中执行不同的选择?

PostgreSQL 删除分组依据

java - 如何使用 Spring Boot 在 Postgresql 中插入用户输入的日期

PostgreSQL 错误 : column "i" of relation "inventory" does not exist

postgresql - PostgreSQL 的解释究竟告诉我什么?

java - 使用 hibernate 参数设置 Postgresql 架构

sql - PostgreSQL IS NULL 和长度

postgresql - Postgresql 数据目录中组成 SQL 的原始文本文件

postgresql - Postgres 多列索引(整数、 bool 值和数组)

postgresql - 如何在带有数字的字符串上使用 tsvector?