2017-02-03 35 views
1

我處理表「內容」與用戶定義的函數「TrasformData」U型SQL - 如何增加parallelizm一個緩慢的UDF

@result = 
SELECT Id, 
     TrasformData(Data) AS TrasformedData 
FROM Content; 

表「內容」是大(約100M記錄)和「TrasformData」功能很慢。該功能非常複雜,一條記錄大約需要20毫秒。

Azure Data Lake將我的查詢劃分爲25個Vertices爲默認值。這不夠。 25 AU可能需要幾個小時才能完成。我想爲這個過程分配至少200 AU,並儘可能快地完成它。據我瞭解,爲這個查詢分配多於25個AU直到它分成25個頂點是毫無用處的。

我可以以某種方式增加查詢的並行性嗎?有誰能幫我解決這個問題嗎?任何選項都可以接受。

回答

3

您有三種選擇來增加作業的並行性。

第一個是增加Content表的分配桶的數量(假設您使用的是一個關於25個頂點的語句似乎表示的表)。

如果您使用的是HASH分佈,則可以通過添加INTO x子句(其中x是桶的數量,應小於約2000)來指定較大的數字。

其他兩個選項類似:使用提示欺騙系統使用更多節點。

一個是在前一個結果上使用數據提示來聲明它返回的行數非常多。這會欺騙系統重新分區的數據,並擴展未來加工出來(調整的東西你是幸福的號碼):

@content = SELECT * FROM Content OPTION(ROWSIZE=1000000000); 
@result = SELECT id, TransformData(Data) AS TransformData FROM @content; 

另一種是將明確劃分:

@content = 
    SELECT * 
    FROM Content 
    OPTION(PARTITION(id)=(PARTITIONCOUNT=100)); 
@result = SELECT id, TransformData(Data) AS TransformData FROM @content; 

然而,這兩種方法都會給你一個固定的分配,如果你的數據更少,或者數據更多,那麼你的數據會更少或者更低。

+0

謝謝你很快的回答,邁克爾!這正是我所尋找的。 –