使用9.4.20版本。
我正在努力优化查询。我认为在查看EXPLAIN后,问题出现在第二个左连接的子查询中。请注意,我决定……
你的问题是索引扫描中的错误估计 request_questions (289而不是25605)。
request_questions
这导致PostgreSQL错误地选择嵌套循环连接。
如果在两个查询中拆分查询,则可能会得到更好的估计:
一个得到所有的 questions.id
questions.id
一个拿走了 id s作为参数,其余部分。
id
在您根据以上修改的查询是以下部分的另一个错误:
( SELECT DISTINCT ("user_info"->>'gender') as "labelID", ("user_info"->>'gender') as "labelName" FROM "user_demographics" WHERE "iteration_id" = 2 AND "company_id" = 1 LIMIT 8 ) as "labels" LEFT JOIN "user_demographics" as "demographics" on "labels"."labelID" IS NOT DISTINCT FROM ("demographics"."user_info"->>'gender')::text and "demographics"."iteration_id" = 2
看起来应该有一个更简单的方法来写这个,但我不知道数据,所以我不知道如何。更简单的条件可能会导致更好的估计。
如果你无法搞清楚,试着添加一个 OR 条件到不改变结果的连接条件。因此将导致优化器估计更高,因此整体计划可能更好(没有嵌套循环连接)。
OR