前任
SELECT *
FROM A
JOIN B ON A.idx = B.idx
JOIN C ON A.idx = C.idx
WHERE A.create_dt BETWEEN '2023-05-01' AND '2023-05-31'
OR A.last_dt BETWEEN '2023-05-01' AND '2023-05-31'
OR B.create_dt BETWEEN '2023-05-01' AND '2023-05-31'
OR B.last_dt BETWEEN '2023-05-01' AND '2023-05-31'
OR C.create_dt BETWEEN '2023-05-01' AND '2023-05-31'
OR C.last_dt BETWEEN '2023-05-01' AND '2023-05-31';
它是PostgreSQL DB
在多连接表时,我只希望SELECT
数据,其中每个表的create_dt
或last_dt
是最新的数据。
但是,有一个问题,那就是速度太慢。在这种情况下如何解决?
当我只留下A表WHERE
条件时,性能是好的。
2条答案
按热度按时间kg7wmglp1#
您可以尝试将以下索引添加到这三个表中:
如果使用这些索引,应该可以加快查询中的连接。
xn1cxnb42#
我只想
SELECT
每个表的create_dt
或last_dt
是最新的数据。那么你当然不能在
idx
上连接,因为最新的每个表不会共享相同的idx
值。你的查询并不像你说的那样。这一个是:
所有括号均为必填项。
有点冗长。但它是最快的-如果你有这些索引:
每个表将有两次索引查找,每次直接选择一个合格的行。
我使用无条件的
CROSS JOIN
进行连接,因为每个子查询只返回 * 一 * 行,前提是至少有一个符合条件。如果其中一个子查询未找到行,则结果为空。也许您真的希望
FULL OUTER JOIN
在一个表为空时保留其他表的结果。或者只有3个结果行。再说一次,如果你没有说清楚你真正需要什么我也不会感到惊讶。我的猜测是:你想要这样的东西(每个表中的最新行per idx):
这一次,我列出了每个表的每个idx的最新行:一个用于
create_dt
,一个用于last_dt
。如果在时间范围内每种口味都有一行,则为6行。关于
DISTINCT ON
:假设所有涉及的列都是
NOT NULL
。否则你可能要做更多...匹配指标: