启用Row Level Security时Azure SQL查询性能下降及并行性问题咨询
Azure SQL数据库RLS启用时的并行执行问题解答
1. 启用Row Level Security时,查询优化器是否技术上可以使用并行性?
可以。Azure SQL数据库的查询优化器在RLS启用的场景下支持并行执行计划,但实际是否生成并行计划取决于多个因素:RLS安全策略中的谓词函数特性、数据库版本、查询本身的复杂度与数据量等。如果RLS函数包含不支持并行的构造(如游标、临时表、非确定性函数),或依赖某些会阻止并行的会话上下文逻辑,优化器会放弃并行选择串行计划。
2. 若可行,需采取哪些操作使优化器在启用Row Level Security时仍能使用并行性?
- 优化RLS谓词函数
- 确保函数使用
SCHEMABINDING绑定架构,且保持确定性(避免使用GETDATE()这类非确定性函数,除非必要)。 - 移除函数中不支持并行的构造:比如游标、临时表、表变量(高开销场景)、以及除
SESSION_CONTEXT()外的会话级变量依赖。
- 确保函数使用
- 升级数据库兼容性级别
将数据库兼容性级别设置为150或更高(当前Azure SQL数据库的推荐级别),新版本对RLS并行执行的支持更完善。 - 验证函数并行兼容性
通过sys.dm_exec_function_stats查看函数的执行属性,确认没有阻止并行的标记;也可临时使用查询提示OPTION (QUERYTRACEON 8649)测试是否能生成并行计划(注意:该跟踪标记为全局级,生产环境需谨慎使用,仅用于测试)。 - 调整查询与数据量
确保查询处理的数据量足够触发并行阈值(优化器默认会评估并行的收益是否大于开销,小数据集通常不会触发并行)。 - 使用查询提示强制并行(可选)
在查询末尾添加OPTION (MAXDOP n)(n为合适的并行度,例如根据服务器CPU核心数设置),强制优化器生成并行计划。但此方法为兜底手段,需先排查函数与数据库配置问题,避免强制并行带来的性能反降。
内容的提问来源于stack exchange,提问作者Serhat Celik
相关产品推荐
相关产品推荐

