在Azure SQL数据库中,当行级安全性处于活动状态时,相同的查询在4秒内完成,当行级安全性处于禁用状态时,在1秒内完成。当我比较查询的执行计划时,我发现当行级安全性处于活动状态时,优化器无法使用并行性。
的数据我的问题是:1-当行级安全性处于活动状态时,优化器在技术上是否可以使用并行性?2-如果可能的话,我应该做些什么来使优化器即使在行级安全性处于活动状态时也使用并行性?
pkwftd7m1#
这是一个已知的问题,文档为here。罪魁祸首可能是安全策略使用的函数的构建方式。要避免这种情况,请尝试使用简单且确定性的过滤器 predicate ,这些 predicate 不涉及复杂的计算或与其他表的联接。解决方法可能是尝试使用MAXDOP查询提示(OPTION(MAXDOP 2)),但文章建议该方法和其他方法不起作用。希望此方法适用于您的场景或Microsoft支持尝试的解决方法之一。
hfyxw5xn2#
非常感谢您发送编修。文件中的以下注解对理解该问题非常有帮助。不使用并行的原因不是行级安全本身,而是安全策略中使用的特定函数。读者可能会认为行级安全本身会阻止并行,但事实并非如此。此处的重要教训是以允许并行的方式编写安全策略。过了一会儿,我了解到我们通过一个使用SESSION_CONTEXT()的函数来使用行级安全性。当在任何函数中使用SESSION_CONTEXT时(不限于RowLevelSecurity),Microsoft不允许在Azure数据库上使用并行性。希望这将是非常有用的任何人谁将面临同样的问题。谨致问候。
2条答案
按热度按时间pkwftd7m1#
这是一个已知的问题,文档为here。罪魁祸首可能是安全策略使用的函数的构建方式。要避免这种情况,请尝试使用简单且确定性的过滤器 predicate ,这些 predicate 不涉及复杂的计算或与其他表的联接。
解决方法可能是尝试使用MAXDOP查询提示(OPTION(MAXDOP 2)),但文章建议该方法和其他方法不起作用。希望此方法适用于您的场景或Microsoft支持尝试的解决方法之一。
hfyxw5xn2#
非常感谢您发送编修。
文件中的以下注解对理解该问题非常有帮助。
不使用并行的原因不是行级安全本身,而是安全策略中使用的特定函数。读者可能会认为行级安全本身会阻止并行,但事实并非如此。此处的重要教训是以允许并行的方式编写安全策略。
过了一会儿,我了解到我们通过一个使用SESSION_CONTEXT()的函数来使用行级安全性。
当在任何函数中使用SESSION_CONTEXT时(不限于RowLevelSecurity),Microsoft不允许在Azure数据库上使用并行性。
希望这将是非常有用的任何人谁将面临同样的问题。
谨致问候。