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