启用行级别安全性时 Azure SQL 查询性能下降

Azure SQL Query Performance Degradation when Row Level Security is ON

提问人:Serhat Celik 提问时间:11/8/2023 最后编辑:Alberto MorilloSerhat Celik 更新时间:11/12/2023 访问量:173

问:

在 Azure SQL 数据库中,当行级别安全性处于活动状态时,同一查询将在 4 秒内完成,而当行级别安全性处于禁用状态时,将在 1 秒内完成相同的查询。

当我比较查询的执行计划时,我发现当行级别安全性处于活动状态时,优化器无法使用并行性。您可以看到下面的屏幕截图。

Same Query Actual Plan Comparisons when Row Level Security On and Off

我的问题是;

1- 当行级别安全性处于活动状态时,优化器在技术上是否可以使用并行性?

2- 如果可能的话,我应该怎么做才能使优化器在行级别安全性处于活动状态时使用并行性?

优化 azure-sql-database query-optimization row-level-security

评论


答:

2赞 Alberto Morillo 11/8/2023 #1

这是此处记录的已知问题。罪魁祸首可能是安全策略使用的功能的构建方式。为避免这种情况,请尝试使用不涉及复杂计算或与其他表联接的简单且确定性的筛选器谓词。

解决方法可能是尝试使用 MAXDOP 查询提示 (OPTION(MAXDOP 2)),但文章建议该方法和其他方法不起作用。希望此方法适用于你的方案或 Microsoft 支持尝试的解决方法之一。

  • 更新统计信息并重新生成索引。
  • 使用重新编译或授予内存提示
  • 使用最新的兼容性模型
  • 清除缓冲池。
  • 清除过程缓存。
1赞 Serhat Celik 11/12/2023 #2

非常感谢您分享的文档。

文件中的以下评论对理解问题非常有帮助。

“不使用并行性的原因不是行级安全性本身,而是安全策略中使用的特定功能。读者可能认为行级安全性本身会阻止并行性,但事实并非如此。“这里的重要教训是以允许并行的方式编写安全策略。

过了一会儿,我了解到我们通过使用 SESSION_CONTEXT() 的函数来使用行级安全性。

在任何函数中使用 SESSION_CONTEXT 时,Microsoft不允许在 Azure DB 上并行(不限于 RowLevelSecurity)。

希望它对任何面临相同问题的人都非常有用。

亲切问候。