避免Hasura顺序扫描查询大数组关系

问题描述

如何让Hasura生成使用review.user_id上的索引的SQL?

这里是获得用户评论的显而易见的方法。我提供了Hasura生成的SQL的简化版本,它是一种子查询方法,而不是review上的user表的JOIN:

# SELECT * FROM review 
#   WHERE user_id = (
#     SELECT id FROM "user" WHERE username = 'admin'
#   )
#   LIMIT 50
# This uses a sequential scan on `review` because Postgres
# can't know exactly what the subquery returns.
query ReviewsForUserSlow {
  user(where: { username: { _eq: "admin" } }) {
    reviews(limit: 50) {
      text
    }
  }
}

这是让Hasura生成确实使用review.user_id索引的SQL的一种方法。但是,需要注意的是,我们需要往返于Hasura以获取用户ID才能构建此查询:

# Simplification of the SQL Hasura generates:
# SELECT * FROM review 
#   WHERE user_id = '8f3547e4-c8a9-480f-991f-0798c02f2ba2'
#   LIMIT 50
query ReviewsForUserFast {
  review(
    limit: 50,where: {
      user_id: {
        _eq: "8f3547e4-c8a9-480f-991f-0798c02f2ba2"
      }
    }
  ) {
    text
  }
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)