文档首页/ 数据仓库服务 DWS/ 常见问题/ 数据库性能/ 为什么DWS普通用户比dbadmin用户执行的慢?
更新时间:2025-08-26 GMT+08:00
分享

为什么DWS普通用户比dbadmin用户执行的慢?

DWS在使用过程中会出现普通用户比dbadmin用户执行慢的场景主要有以下三种:

场景一:普通用户受资源管理的管控

普通用户在排队:waiting in queue/waiting in global queue/waiting in ccn queue.

  1. 普通用户主要在waiting in queue/waiting in global queue时。

    当前的活跃语句数超过max_active_statements限制导致的普通用户排队,由于管理员用户不受管控所以无需排队。可通过在DWS控制台修改max_active_statements参数值处理:

    1. 登录DWS控制台
    2. 在左侧导航树,单击“集群 > 集群列表”。
    3. 在集群列表中找到所需要的集群,单击集群名称,进入“集群详情”页面。
    4. 单击“参数修改”页签,搜索“max_active_statements”参数,修改其参数值,单击“保存”,确认无误后再单击“保存”

场景二:执行计划中的or条件对普通用户执行语句逐一判断耗时

执行计划中的or条件里有权限相关的判断,此场景多发生在使用系统视图时。例如以下SQL:

1
2
3
4
5
6
7
8
SELECT distinct(dtp.table_name),
 ta.table_catalog,
 ta.table_schema,
 ta.table_name,
 ta.table_type  
from information_schema.tables ta left outer join DBA_TAB_PARTITIONS dtp  
on (dtp.schema = ta.table_schema and dtp.table_name = ta.table_name) 
where ta.table_schema = 'public';

一部分执行计划如下:

可以看到系统视图中的权限判断中多用or条件判断:

1
pg_has_role(c.relowner, 'USAGE'::text) OR has_table_privilege(c.oid, 'SELECT, INSERT, UPDATE, DELETE, TRUNCATE, REFERENCES, TRIGGER'::text) OR has_any_column_privilege(c.oid, 'SELECT, INSERT, UPDATE, REFERENCES'::text)

由于dbadmin用户pg_has_role总能返回true,因此or之后的条件无需继续判断;

而普通用户的or条件需要逐一判断,如果数据库中表个数比较多,最终会导致普通用户比dbadmin需要更长的执行时间。

这种场景如果输出结果集很少,可以考虑尝试设置set enable_hashjoin = off; set enable_seqscan = off; 走index + nestloop的计划。

场景三:普通用户和管理员用户所分配资源池有差异

通过执行如下查询命令,查看用户所对应的资源池是否相同,如果不同,可在界面查看两个资源池上所分配的租户资源是否有差别。

1
SELECt * FROM pg_user;

相关文档