针对具有100万条记录的表运行以下SQL会为列Date1和Date2提供相同的值,并且执行需要38秒。这是预期的行为吗?为什么?
CREATE FUNCTION Fn_Test(@a decimal)RETURNS TABLE
AS
RETURN
(
SELECT @a Parameter, Getdate() Date1, PartitionTest.*
FROM PartitionTest
);
SELECT *, GETDATE() Date2 FROM Fn_Test(RAND(DATEPART(s,GETDATE())))
这是某种缓存吗?
答案 0 :(得分:6)
是。 SQL语义不要求不依赖的非确定性函数在每行的当前行上进行。允许对函数进行一次求值,并为所有后续行返回相同的值。
答案 1 :(得分:0)
GETDATE()(和CURRENT_TIMESTAMP)返回事务开始的时间戳
答案 2 :(得分:0)
SqlServer首先执行GETDATE(),然后通过所有行替换该值。