通过对选择进行自定义检查:
{
"_or": [
{
"user": {
"id": {
"_eq": "X-Hasura-User-Id"
}
}
},
{
"feed_item_access": {
"community_allowed_view": {
"_eq": true
}
}
}
]
}
查询需要 8 秒,但是如果我删除 OR 中的两个检查中的任何一个,查询将减少到 1 秒。
条件检查是什么似乎并不重要,有一个就很好,一旦有两个它就会停止。
值得注意的是,只有在有授权 header 时,这才会非常慢,但它似乎与此无关,即使权限检查不是在寻找 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 托管环境中。
有什么我可能在这里遗漏的想法吗?
最佳答案
Hasura 的权限系统动态地将额外的过滤条件添加到针对您的数据库生成和执行的 SQL 语句中。我不认为在 Hasura 方面有任何开销会导致多个 OR
条件本质上变慢,而不是一旦它到达您的数据库就会导致一个不太理想的查询计划。
您能否在打开和关闭权限的情况下共享此查询的查询配置文件,以便我们了解添加索引或任何其他数据库性能调整是否有助于缓解该问题?
如果您希望能够在包含权限的情况下分析查询,您只需在控制台中添加 x-hasura-role
header 以及管理员密码和任何其他与 session 相关的值在您的权限评估期间考虑的内容。例如:
然后,当您单击analyze
按钮时,Hasura 的输出将包括生成的完整 SQL,包括权限过滤器以及针对您的数据库的实际查询计划。
您本地环境中的数据集是否与您的 Hasura 云实例管理的数据库中的数据集完全相同?根据所涉及数据的大小,查询计划和性能可能会有很大差异
关于postgresql - 当添加两个或更多权限条件时,Hasura 查询变得指数级变慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68071685/