
# 为什么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控制台](https://console.huaweicloud.com/dws)修改max_active_statements参数值处理：
   1. 登录[DWS控制台](https://console.huaweicloud.com/dws)。
   
   2. 在左侧导航树，单击"集群 \> 集群列表"。
   
   3. 在集群列表中找到所需要的集群，单击集群名称，进入"集群详情"页面。
   
   4. 单击"参数修改"页签，搜索"max_active_statements"参数，修改其参数值，单击"保存"，确认无误后再单击"保存"。
    
 
#### 场景二：执行计划中的or条件对普通用户执行语句逐一判断耗时
执行计划中的or条件里有权限相关的判断，此场景多发生在使用系统视图时。例如以下SQL：
```
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';
```
一部分执行计划如下：
![](https://support.huaweicloud.com/dws_faq/figure/zh-cn_image_0000001533637710.png "点击放大")
可以看到系统视图中的权限判断中多用or条件判断：
```
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的计划。
#### 场景三：普通用户和管理员用户所分配资源池有差异
通过执行如下查询命令，查看用户所对应的资源池是否相同，如果不同，可在界面查看两个资源池上所分配的租户资源是否有差别。
```
SELECT * FROM pg_user;
```
