为了使用索引避免排序,PostgreSQL首先必须扫描
所有的
"reporting_processedamazonsnapshot"
按索引顺序,然后联接
所有的
"offers_boooffer"
使用嵌套循环联接
(以便保留命令)然后加入
所有的
"offers_offersettings"
又一次
使用嵌套循环联接
.
最后,所有与条件不匹配的行
"offers_offersettings"."account_id" = 20
会被扔掉。
PostgreSQL相信——在我看来是正确的——从使用条件尽可能减少行数开始,然后使用最有效的联接方法联接表,然后对
DISTINCT
条款。
我想知道下面的查询是否更快:
SELECT DISTINCT ON (q.offer_id) *
FROM offers_offersettings ofs
JOIN offers_boooffer bo ON bo.id = ofs.offer_id
CROSS JOIN LATERAL
(SELECT *
FROM reporting_processedamazonsnapshot r
WHERE r.offer_id = bo.offer_id
ORDER BY r.scraping_date DESC
LIMIT 1) q
WHERE ofs.account_id = 20
ORDER BY q.offer_id ASC, q.scraping_date DESC;
执行计划与此类似,只是需要从索引中扫描的行更少,这将减少最需要的执行时间。
如果你想加快分拣速度,增加
work_mem
对于该查询(如果您能负担得起的话)约500MB。