我在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',.....)
这是获得快速响应的唯一方法吗?
您的尝试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
输出两次。