根据小表中的样本从大表中选择:join、cte 还是静态值?

问题描述 投票:0回答:1

我在Postgres中有2张表,一张大约有200M记录,另一张有几百条记录。 我想从小表中获取10个值,并在长表中找到对应的值。两者均已编入索引。我尝试了不同的方法,只有静态方法让我没时间查询:

1.

with s as (select * from shorttable limit 10)
select * from longtable where col1 in (select * from s)
select * from longtable where col1 in (select * from shorttable limit 10).
with s as (select * from shorttable limit 10) 
select * from longtable join shorttable on longtable.col1=s.col1

我从短表中查询 10 个值得到的唯一好的解决方案是 特别打印以下查询:

select * from longtable where col1 in ('aaa','bbb',.....)

这是获得快速响应的唯一方法吗?

sql postgresql performance subquery common-table-expression
1个回答
0
投票

您的尝试3.就是要走的路。您只是没有真正使用 CTE

WITH s AS (SELECT * FROM shorttable LIMIT 10)
SELECT *
FROM   longtable
JOIN   s USING (col1)  -- not "shorttable"!

在这种情况下,CTE 是可选的。可以简化为:

WITH s AS (SELECT * FROM shorttable LIMIT 10)
SELECT *
FROM   (SELECT * FROM shorttable LIMIT 10) s
JOIN   longtable l USING (col1);

此外,

USING
子句与
SELECT *
结合使用可防止
col1
输出两次。

© www.soinside.com 2019 - 2024. All rights reserved.