Postgresql 大数组关系查询中避免Hasura序列扫描

Postgresql 大数组关系查询中避免Hasura序列扫描,postgresql,hasura,Postgresql,Hasura,如何让Hasura生成使用review.user\u id上的索引的SQL 下面是获得用户评论的一种看似显而易见的方法。我已经包含了Hasura生成的SQL的简化版本,这是一种子查询方法,而不是用户上查看表的连接: # SELECT * FROM review # WHERE user_id = ( # SELECT id FROM "user" WHERE username = 'admin' # ) # LIMIT 50 # This uses a

如何让Hasura生成使用
review.user\u id
上的索引的SQL

下面是获得用户评论的一种看似显而易见的方法。我已经包含了Hasura生成的SQL的简化版本,这是一种子查询方法,而不是
用户
查看
表的连接:

# 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生成SQL的方法,它确实使用了
review.user\u id
索引。但是,需要注意的是,为了构建此查询,我们需要往返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
  }
}

我假设可能有多个用户名为“admin”的用户?否则,在第二个查询中,不是按id进行筛选:
where:{user:{username:{{eq:{admin}}}}
使用
\u aggregate
进行试错,而是无效out@avimoondra好主意!但是,唉,还是一样的顺序扫描。我现在实际上认为这不是Hasura的问题,但可能与数据有关,我们有数百万行,所以可能有些设置不正确。如果我发现了什么,我会更新这个答案。我假设可能有多个用户名为“admin”的用户?否则,在第二个查询中,不是按id进行筛选:
where:{user:{username:{{eq:{admin}}}}
使用
\u aggregate
进行试错,而是无效out@avimoondra好主意!但是,唉,还是一样的顺序扫描。我现在实际上认为这不是Hasura的问题,但可能与数据有关,我们有数百万行,所以可能有些设置不正确。如果我发现了什么,我会更新这个答案。