虽然检索全部或大部分行从表中,对于这种类型的查询最快的方法通常是聚合/歧义 第一 和加入 后 :
SELECt *FROM products pJOIN ( SELECt DISTINCT ON (product_id) * FROM meta ORDER BY product_id, id DESC ) m ON m.product_id = p.id;
meta每行中的行越多
products,对性能的影响越大。
当然,您需要
ORDER BY在子查询中添加一个子句,以定义从子查询中的每个集合中选择 哪一
行。@Craig和@Clodoaldo已经告诉过您。我将返回
meta最高的行
id。
SQL提琴。
优化性能
尽管如此,这并不总是最快的解决方案。根据数据分布,还有其他各种查询样式。对于涉及另一个联接的这种简单情况,在带有大表的测试中,该联接的运行速度大大提高:
SELECt p.*, sub.meta_id, m.product_id, m.price, m.flagFROM ( SELECt product_id, max(id) AS meta_id FROM meta GROUP BY 1 ) subJOIN meta m ON m.id = sub.meta_idJOIN products p ON p.id = sub.product_id;
如果您不将非描述性
id名称用作列名,那么我们就不会遇到命名冲突,只需编写即可
SELECT p.*, m.*。(我 从来没有
使用
id的列名。)
如果性能是您的首要要求,请考虑更多选择:
- 如果您的数据没有变化(很多),则其中
MATERIALIZED VIEW
包含来自的预汇总数据meta
。 - 递归CTE,模拟对每个产品有 很多 行的 大 表的 松散索引扫描 (相对而言,很少有不同的)。 这是我知道对整个表的DISTINCT查询使用索引的唯一方法。
meta
product_id



