【问题标题】:SQL Server table-valued function executed codeSQL Server 表值函数执行代码
【发布时间】:2018-01-01 15:15:45
【问题描述】:

基于Row level security我创建了一个表值函数:

CREATE FUNCTION Security.userAccessPredicate(@ValueId int)
RETURNS TABLE
WITH SCHEMABINDING
AS
RETURN
(
    SELECT 1 AS accessResult
    WHERE @ValueId = 
    (
        SELECT Value 
        FROM dbo.Values 
        WHERE UserId = CAST(SESSION_CONTEXT(N'UserId') AS NVARCHAR(50))
    ) OR NULLIF(CAST(SESSION_CONTEXT(N'UserId') AS nvarchar(50)),'') IS NULL
);

CREATE SECURITY POLICY Security.userSecurityPolicy
    ADD FILTER PREDICATE Security.userAccessPredicate(ValueUd) ON dbo.MainTable

假设MainTable 包含数百万行。 userAccessPredicate 是否为每一行独立计算 SELECT Value FROM dbo.Values?如果是这样,我想它是无效的。如何检查执行表值函数时生成的确切代码? SQL Server Profiler 不行,因为我使用的是 Azure DB。

我正在使用 SQL Server 2016 Management Studio。

【问题讨论】:

标签: sql sql-server tsql user-defined-functions row-level-security


【解决方案1】:

最好的方法是在策略关闭然后打开的情况下查看执行计划。因此,您会看到它所做的额外工作。您正在添加另一个表进行查询,因此它类似于进行连接,但可能更有效。

要回答您的问题,如果您在策略启用时看到计划中添加了一个嵌套循环,那么是的,它会逐行运行Nested Loops

也对 DBCC SHOW_STATISTICS 执行相同操作,以查看资源命中。对于较小的表,我从未看到任何明显的性能损失,在类似的实现中

我发现这个链接在之前进入这个时很有用。

https://www.mssqltips.com/sqlservertip/4005/sql-server-2016-row-level-security-limitations-performance-and-troubleshooting/

【讨论】:

    猜你喜欢
    • 2017-03-14
    • 1970-01-01
    • 2011-08-23
    • 2014-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多