以下查询分别在一台标准机器上进行70分钟和1分钟的1百万条记录。可能的原因是什么?在SQL中发现性能差异很大(1小时到1分钟)。你能解释为什么吗?
查询[1点十分00秒]
SELECT *
FROM cdc.fn_cdc_get_net_changes_dbo_PartitionTest(
CASE WHEN sys.fn_cdc_increment_lsn(0x00)<sys.fn_cdc_get_min_lsn('dbo_PartitionTest')
THEN sys.fn_cdc_get_min_lsn('dbo_PartitionTest')
ELSE sys.fn_cdc_increment_lsn(0x00) END
, sys.fn_cdc_get_max_lsn()
, 'all with mask')
WHERE __$operation <> 1
修改的查询[0点01分10秒]
DECLARE @MinLSN binary(10)
DECLARE @MaxLSN binary(10)
SELECT @MaxLSN= sys.fn_cdc_get_max_lsn()
SELECT @MinLSN=CASE WHEN sys.fn_cdc_increment_lsn(0x00)<sys.fn_cdc_get_min_lsn('dbo_PartitionTest')
THEN sys.fn_cdc_get_min_lsn('dbo_PartitionTest')
ELSE sys.fn_cdc_increment_lsn(0x00) END
SELECT *
FROM cdc.fn_cdc_get_net_changes_dbo_PartitionTest(
@MinLSN, @MaxLSN, 'all with mask') WHERE __$operation <> 1
[变形]
我试图重新创建具有相似功能的场景以查看是否针对每行评估参数。
CREATE FUNCTION Fn_Test(@a decimal)RETURNS TABLE
AS
RETURN
(
SELECT @a Parameter, Getdate() Dt, PartitionTest.*
FROM PartitionTest
);
SELECT * FROM Fn_Test(RAND(DATEPART(s,GETDATE())))
但是,对于在38秒内处理的百万条记录,我得到的'Parameter'列值相同。
但重新播种RAND()确保我们获得随机值的权利?通过提供第二个时间价值作为种子,我认为,我确保这一点。 – Faiz 2009-11-30 16:00:56
您没有重寄RAND()。你为它传递一个单值,它返回一个单值,然后这个单值被传递给你的函数。 – 2009-11-30 17:20:47
对不起,当我第一次阅读RAND()的用法时,我以为你是从tbl做SELECT fn(RAND(seed)),这当然和SELECT fn(a_number)FROM tbl是一样的,因为你用相同的价值。在任何情况下,关于标量函数行为的信息都是正确解释你的情况。 – 2009-11-30 17:43:30