GaussDB(DWS)实践系列-行级访问策略优化实践

四叶草 发表于 2021/05/27 23:15:04 2021/05/27
【摘要】 在一些局点的交付过程中,ISV需要使用行级访问策略进行用户访问权限控制,省级用户具有全部查询权限,部分市级用户设置行级访问权限。如果行级访问控制使用不好,会导致影响整体查询的执行效率,例如在业务系统建表的过程中,创建1个行级访问策略并增加case when条件,根据登录用户名(current_user)判断用户属性(省级用户还是市级用户),并进行访问控制,实际测试过程中省级用户查询执行耗时17秒。

行级访问策略优化实践

一、   背景描述

       在一些局点的交付过程中,ISV需要使用行级访问策略进行用户访问权限控制,省级用户具有全部查询权限,部分市级用户设置行级访问权限。如果行级访问控制使用不好,会导致影响整体查询的执行效率,例如在业务系统建表的过程中,创建1个行级访问策略并增加case when条件,根据登录用户名(current_user)判断用户属性(省级用户还是市级用户),并进行访问控制,实际测试过程中省级用户查询执行耗时17,不符合预期,需要进行优化。

      行级访问控制介绍:行级访问控制特性将数据库访问控制精确到数据表行级别,控制表中行级数据可见性,使数据库达到行级访问控制的能力。用户可以在数据表创建行访问控制(Row Level Security)策略,该策略是指针对特定数据库用户、特定SQL操作生效的表达式。当数据库用户对数据表访问时,若SQL满足数据表特定的Row Level Security策略,在查询优化阶段将满足条件的表达式应用到执行计划上。不同用户执行相同的SQL查询操作,读取到的结果是不同的。

二、   优化分析

对应业务表的行级访问策略如下图所示,使用case when进行访问用户区分,省级用户对应的编号为14400000000,市级用户需要根据else分支逻辑判断是否符合权限设置:

实际使用省级用户执行,执行explain analyze select count(1) from kf_bz.hxzg_sb_zys,打印执行计划如下,SQL执行时间需要17S左右:

行级访问权限控制是把权限控制约束作为查询的一个过滤条件,然后整个SQL一起做计划,性能和执行方式跟行访问控制的表达式相关,因为case判断条件均为执行过程中动态生成的,需要先补全分支条件再进行剪枝,PG处理机制类似。行级控制策略中case when中省级用户的行级控制权限逻辑简单,但是else分支的市级用户行级控制权限逻辑相对复杂,执行耗时,拖慢了整体的执行速度。

三、   解决办法

       行级访问控制策略可以绑定用户和角色(rolename),显式拆分省级和市级的用户组替换case when语句,市级的所有用户添加到市级用户组,省级用户添加到省级用户组,例如create row level security POLICY auth_hxzg_sb_zys on kf_bz.hxzg_sb_zys to rolename,在安全策略中指定rolename,并创建两个行级访问策略,一个策略针对省级用户组生效,另一个策略对市级用户组生效。(例如省级role_sj_root,市级role_ds_root),分别对省级和市级两类用户设置行级访问控制)。

调整策略后省级用户执行效率提升到1s内返回,符合预期,执行计划如下:

省级用户查询:

市级用户查询:

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区),文章链接,文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:cloudbbs@huaweicloud.com进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。