我创建了一个标量值函数,它在传入的秒数中暂停。这个函数不会在生产中使用。如果我向查询添加 UDF,我正在尝试测试 SQL Server 如何评估和创建计划。我对它如何评估我的 3 个查询中的最后一个的差异感到非常困惑。首先是创建测试函数的代码:
CREATE FUNCTION dbo.[sleep](@seconds int)
RETURNS datetime
as
BEGIN
DECLARE @sleepUntil datetime
DECLARE @dummy int
SET @sleepUntil = DATEADD(s, @seconds, getdate())
WHILE getdate() < @sleepUntil
SET @dummy = 0
RETURN getdate()
END
Run Code Online (Sandbox Code Playgroud)
现在创建一个表来测试查询
CREATE TABLE #table (num int)
Run Code Online (Sandbox Code Playgroud)
并插入值
INSERT INTO #table
VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9)
Run Code Online (Sandbox Code Playgroud)
第一个查询需要 2 秒才能运行 - 假设 SQL Server 存储从标量函数返回的值,这是有道理的。
SELECT num
FROM #table t
WHERE dbo.sleep(2)=0
Run Code Online (Sandbox Code Playgroud)
第二个仍然需要 2 秒 - 所以我的假设是它也一样。
SELECT num
FROM #table t
WHERE EXISTS (select TOP 1 …
Run Code Online (Sandbox Code Playgroud)