GaussDB(DWS)实践系列-行级访问策略优化实践
行级访问策略优化实践
一、 背景描述
在一些局点的交付过程中,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内返回,符合预期,执行计划如下:
省级用户查询:
市级用户查询:
- 点赞
- 收藏
- 关注作者
评论(0)