我在键上有一个大表连接。explain plan可以看出大部分时间花在了排序上。
我能做些什么来防止大的排序步骤吗?我可以预先对表格进行排序吗?
在这里查询和计划:https://explain.dalibo.com/plan/15a6a91492g8g935#plan/node/5
两个表都已经在键上有一个索引,就像这样,但似乎没有使用该索引:
CREATE UNIQUE INDEX "stage_fact_revenue_900_idx_a" ON "stage"."stage_fact_revenue_900_add_dims" USING BTREE ("date","billed_relation_id","subject_client_id","identifier","revenue_type");
CREATE UNIQUE INDEX "fact_revenue_idx_a" ON "star"."fact_revenue" USING BTREE ("date","identifier","billed_relation_id","subject_client_id","revenue_type");
如果返回的行不超过大约 10%,则索引会加快搜索速度,否则全表扫描会更快。
Postgresql 选择全扫描是
stage_fact_revenue_900_add_dims
因为它需要选择所有行并且需要索引中不存在的列。出于同样的原因,它认为最好扫描fact_revenue
一次并对结果进行排序,而不是进行 1.77 亿次索引查找。您可以尝试的一些事情:
ORDER BY date, identifier, billed_relation_id, subject_client_id, revenue_type
this 应该向 Postgres 建议使用索引fact_revenue
可以避免排序。像这样: