标量 UDF 强制执行整体串行计划,这是有据可查的。
给定大量行进入管道中必须计算 UDF 的点,为什么引擎不能将它们分配给处理器?如果 UDF 中没有状态,那么顺序应该无关紧要。
有人声称 UDF 是一个必须使用光标的黑匣子。我可以看到,对于在迭代之间维护某些状态但似乎应该可以并行化的情况,用户游标无法在 SP 中并行化。
解释为什么引擎强制整个计划是串行的,而不仅仅是 UDF 计算阶段的额外要点。
对并行 UDF 的支持是一个合理的要求吗?
我正在处理一个项目,其中数据模型中的许多实体没有名称列,而是需要从多个列的串联中构造“名称”。最初我认为这可能是计算列的一个很好的用例,因为它允许我在数据库中定义这个逻辑,并且只定义一次。
但是,对于完全规范化的数据模型,计算列通常需要来自其他表的值。查询其他表可以通过 UDF 来完成,但我在几个地方读到在计算列中使用 UDF 会阻止并行执行(请参阅此处)。
我可以使用视图来处理这些名称的格式,但只想定义一次逻辑,如果逻辑在视图中,它可能会导致嵌套视图,这也会导致性能问题。
我希望有人知道如何在数据库中只定义一次这种格式逻辑而不导致性能问题。
我正在与程序员一起研究数据库解决方案。他们想要添加一个计算列来模拟旧查询、过程和系统的旧键,并为其编制索引。新密钥将是 GUIDS。
为此,他们希望为计算列创建一个函数,该函数创建一个值并将其持久化。它不会让他们保留该列。我对这个想法没有任何热情的模糊,我也无法在网上找到有关该技术的任何信息(它是一种技术吗?)。
我认为他们需要添加触发器。有没有人有任何想法?
该函数将按如下方式运行:
(SELECT [INT Identity field] FROM TABLE WHERE [GUID COLUMN] = @GUIDKEY
Run Code Online (Sandbox Code Playgroud)
它根据 GUID 返回一个 INT 标识字段。
这将在插入相关表时运行。因此,如果表一持有主键,则相关表二将更新(使用传入的 GUID)以从表一中获取键并将其插入到表二中。
我们在具有 8 个套接字和 20 个处理器的 VM 上托管了一个 UAT3 服务器,我们在具有相同配置的同一 VM 上托管了类似的 UAT2 服务器。
我们在两个服务器上运行以下查询
select recid from Table1 where nation='AE'
Run Code Online (Sandbox Code Playgroud)
两个服务器具有相同的数据和相同的结构。
UAT2 和 UAT3 具有默认设置并行度5 和最大并行度的成本阈值0。
IN UAT2 服务器并行处理正在发生。它需要 10 秒才能完成,但 UAT3 串行处理正在发生,因为它需要 3 分 30 秒。
我们比较 UAT2 和 UAT3 服务器配置都相同。不知道为什么 SQL Server 在 UAT2 中选择并行执行而不是在 UAT3 中。
下面是表定义
select recid from Table1 where nation='AE'
Run Code Online (Sandbox Code Playgroud)
下面是视图
CREATE TABLE [dbo].[FKMB_CUSTOMER](
[RECID] [nvarchar](64) NOT NULL,
[XMLRECORD] [xml] NULL,
[ALT_CUSTOMER] AS
([dbo].[IX_CUSTOMER_ALT_CUSTOMER]([XMLRECORD]))
PERSISTED,
[SMS] AS
([dbo].[IX_CUSTOMER_SMS_1]([XMLRECORD])) …Run Code Online (Sandbox Code Playgroud) 我对使用标量 UDF 的列有一个检查约束。我有一个需要对 UDF 进行更改的要求。根据我所知,我需要删除约束,对 UDF 进行更改,然后重新添加约束。在删除约束期间,我担心可能会向表中插入坏数据。有没有办法在不放弃约束的情况下更改 UDF?如果没有,有没有办法防止坏数据进入表中?