SQL 服务器 table 值函数执行的代码
SQL Server table-valued function executed code
基于 Row level security 我创建了一个 table 值函数:
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
?如果是这样,我想它是无效的。如何检查执行 table 值函数时生成的确切代码? SQL Server Profiler 不可用,因为我使用的是 Azure DB。
我正在使用 SQL Server 2016 Management Studio。
最好的方法是查看执行计划,先关闭再打开策略。结果,您会看到它所做的额外工作。您正在添加另一个 table 进行查询,因此它类似于执行联接但可能更有效。
为了回答您的问题,如果您在政策启用时看到计划中添加了嵌套循环,那么是的,它会逐行进行 Nested Loops
也对 DBCC SHOW_STATISTICS 执行相同的操作以查看资源命中率。对于较小的 tables,我从未看到任何明显的性能下降,在类似的实现中小于 100,000 行。
我发现这个 link 在以前接触这个时很有用。
基于 Row level security 我创建了一个 table 值函数:
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
?如果是这样,我想它是无效的。如何检查执行 table 值函数时生成的确切代码? SQL Server Profiler 不可用,因为我使用的是 Azure DB。
我正在使用 SQL Server 2016 Management Studio。
最好的方法是查看执行计划,先关闭再打开策略。结果,您会看到它所做的额外工作。您正在添加另一个 table 进行查询,因此它类似于执行联接但可能更有效。
为了回答您的问题,如果您在政策启用时看到计划中添加了嵌套循环,那么是的,它会逐行进行 Nested Loops
也对 DBCC SHOW_STATISTICS 执行相同的操作以查看资源命中率。对于较小的 tables,我从未看到任何明显的性能下降,在类似的实现中小于 100,000 行。
我发现这个 link 在以前接触这个时很有用。