我有两个表:一个是包含自然数的 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/