【问题标题】:Hasura querying becomes exponentially slower when two or more permission conditions are added当添加两个或更多权限条件时,Hasura 查询会呈指数级变慢
【发布时间】:2021-09-05 08:20:01
【问题描述】:

通过对选择的自定义检查:

{
"_or": [
    {
        "user": {
            "id": {
                "_eq": "X-Hasura-User-Id"
            }
        }
    },
    {
        "feed_item_access": {
            "community_allowed_view": {
                "_eq": true
            }
        }
    }
]
}

查询需要 8 秒,但是如果我删除 OR 中的两个检查中的任何一个,查询将缩短到 1 秒。

条件检查是什么似乎并不重要,一个很好,一旦有两个它就会停止。

值得注意的是,当有授权标头时,这只会非常缓慢,但即使权限检查不是在寻找 x-hasura-user-id,它似乎也与此无关,它可能很慢。对于管理员查询,这完全没问题。

这似乎主要发生在权限必须查看相关表并且有两个权限时,即使它们正在查看同一个表:

{
    "_or": [
        {
            "feed_item_access": {
                "community_allowed_view": {
                    "_eq": true
                }
            }
        },
        {
            "feed_item_access": {
                "clinicians_allowed_view": {
                    "_eq": true
                }
            }
        }
    ]
}

以上处理需要 5 秒以上,如果我删除其中任何一个条件,它会下降到 1 秒以下。

我还应该在我的本地 docker build 上添加它很好,问题只出现在 hasura 托管环境中。

有什么我可能在这里遗漏的想法吗?

【问题讨论】:

    标签: postgresql authentication permissions hasura


    【解决方案1】:

    您没有指定您的 PostgreSQL 版本,但如果它是 12(或更高版本),请尝试禁用 JIT 模式。

    取决于您运行 PostgreSQL 的方式,但如果您使用的是 Docker Compose,请将以下内容添加到您的 PostgreSQL 服务定义中:

    command: postgres -c jit=off
    

    例子:

    services:
      postgres:
        image: postgres:12
        restart: always
        command: postgres -c jit=off
        ports:
          - "5432:5432"
        volumes:
          - /opt/postgresql/data:/var/lib/postgresql/data
        environment:
          POSTGRES_PASSWORD: Secure
    

    另请参阅GitHub issue

    【讨论】:

      【解决方案2】:

      Hasura 的权限系统会动态地将其他过滤条件添加到针对您的数据库生成和执行的 SQL 语句中。我认为 Hasura 方面没有任何开销会导致多个 OR 条件固有地变慢,除非它会在访问数据库后导致不太理想的查询计划。

      您能否共享此查询的查询配置文件以及打开和关闭权限,以便我们了解添加索引或任何其他数据库性能调整是否有助于缓解问题?

      如果您希望能够分析包含权限的查询,您只需在控制台中添加 x-hasura-role 标头以及在您的权限评估期间考虑的管理员密码和任何其他与会话相关的值。例如:

      然后,当您单击analyze 按钮时,Hasura 的输出将包括生成的完整 SQL,包括权限过滤器以及针对您的数据库的实际查询计划。

      您的本地环境中的数据集是否与 Hasura 云实例管理的数据库中的数据集完全相同?根据所涉及数据的大小,查询计划和性能可能会有很大差异

      【讨论】:

      • 嘿,谢谢您的回答!你说的很有道理,虽然我不明白为什么它在 hasura.io 上这么慢,但在我本地的 docker 中它非常快。我不确定如何创建查询配置文件,我认为这意味着单击 'analyze' 按钮 ongraphiql 并显示它是什么 - 但是只有当管理员密码也被传入时才有效,这似乎否定了权限性能问题.知道我应该怎么做才能得到查询配置文件吗?
      • @meds 更新了我的答案以显示如何分析查询,请使用查询计划的输出更新您的问题。如果您可以从本地环境和云环境中获取查询计划,以查看查询计划者是否在两种环境中做出不同的选择,那就太好了
      • 看起来没有必要 - 我发现,当我查询它的方式是通过相关父对象中更复杂的权限方案时,馈送项目权限非常无害 - 我在完成后发现您建议的分析和查询作为 huuuuuge 结果返回(太大而无法放入 stackoverflow 帖子)。当您帮助我诊断问题时,我正在给您答案(不知道我可以用这样的标题模拟角色),解决方案显然是减少 30,000 多个字符的查询,但这是一个主题不同的问题。
      • @meds 很高兴我能帮上忙!很长一段时间我都没有意识到您可以使用标头来更好地诊断查询模式+权限,但在使用 Hasura 构建时它绝对是一个非常宝贵的工具
      猜你喜欢
      • 1970-01-01
      • 2022-10-15
      • 2022-10-24
      • 2014-12-20
      • 2020-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多