2009-11-30 39 views
0

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

回答

2

即使確定性標量函數每行至少被評估一次。如果相同的確定性標量函數在具有相同參數的同一「行」上出現多次,我相信只有這樣纔會評估一次 - 例如,在CASE WHEN fn_X(a, b, c) > 0 THEN fn_X(a, b, c) ELSE 0 END或類似的東西。

我覺得你的問題,RAND是因爲你繼續補種:RAND(中)與 相同的種子值

重複調用返回相同的 結果。

對於一個連接,如果RAND()是 稱爲具有指定種子值, RAND()的所有後續調用基於所接種的RAND() 呼叫 結果。例如,以下查詢 將始終返回數字的相同序列 。

我已經採取了緩存標量函數的結果,正如你所指出的那樣 - 甚至可以預先計算標量函數結果表並加入到它們中。最終必須做一些事情來使標量函數有效。沒錯,最好的選擇是CLR - 顯然這些表現遠超SQL SQL UDF。不幸的是,我不能在我目前的環境中使用它們。

+0

但重新播種RAND()確保我們獲得隨機值的權利?通過提供第二個時間價值作爲種子,我認爲,我確保這一點。 – Faiz 2009-11-30 16:00:56

+0

您沒有重寄RAND()。你爲它傳遞一個單值,它返回一個單值,然後這個單值被傳遞給你的函數。 – 2009-11-30 17:20:47

+0

對不起,當我第一次閱讀RAND()的用法時,我以爲你是從tbl做SELECT fn(RAND(seed)),這當然和SELECT fn(a_number)FROM tbl是一樣的,因爲你用相同的價值。在任何情況下,關於標量函數行爲的信息都是正確解釋你的情況。 – 2009-11-30 17:43:30

6

在您的第一個查詢中,您的fn_cdc_increment_lsnfn_cdc_get_min_lsn會針對每一行執行。在第二個例子中,只有一次。

+0

但它們只是該函數的參數。爲什麼它會針對每一行進行評估。當我第一次觀察這個時,我也這麼想。然後我試着用類似的函數測試這個案例[更新了問題的細節],但是它在兩種情況下都在同一時間完成。 – Faiz 2009-11-30 12:36:20

+0

確實如此,但需要爲輸出中的每一行評估函數。 – Thorsten 2009-11-30 12:42:39

+0

任何人都可以請回答'爲什麼'? – Faiz 2009-11-30 17:14:01

相關問題