数据仓库服务 GAUSSDB(DWS)-为什么普通用户比dbadmin用户执行的慢?:场景二:执行计划中的or条件对普通用户执行语句逐一判断耗时

时间:2024-04-30 17:23:47

场景二:执行计划中的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的计划。

support.huaweicloud.com/dws_faq/dws_03_2112.html