以下查詢分別在一臺標準機器上進行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