2017-09-25 3 views
4

この問題は、Azure Data Lake Analyticsが実行するクエリの最適化に関連していると私は考えています。しかし、見てみよう...USQL TVFとクエリをネストすると、恐ろしい結果が得られます

私は2つの個別のクエリ(TVFs)集計をして、最終的な結果のために一緒に2に参加する最後のクエリがあります。 だから... ...うち全体のロジックをテストする

Table > Header Query 
Table > Detail Query 
Result = Header Query + Detail Query 

は、私は結果をファイルに格納し、フィルタとは別にマイナーなクエリを実行し、最終的に、クエリのソースとしてハードファイルを使用します。これらは合計所要時間(分)です。

Header Query 1.4 (408 rows) 
Detail Query 0.9 (3298 rows) 
Final Query 0.9 (408 rows) 

私は最大で約3.5分で結果を得ることができることを知っています。 しかし、私は本当に新しい仲介ファイルを作成したくありません。 TDFを使用して最終クエリを直接フィードしたいと思います。

最後のクエリでTDFを使用すると、ジョブグラフは約1.5分で約97%の進捗になります。 しかし、すべての地獄は緩んで壊れます! 最後のノードは、計算時間が16分であることを示す2500個の頂点を持つ集約です。 だから私の質問...なぜですか?

Azureの仕組みの基本的な概念を理解していないのですか?

誰もが何が起こっているのか説明できますか? 助けていただければ幸いです。

決勝問合せ:

@Header = 
SELECT [CTNNumber], 
     [CTNCycleNo], 
     [SeqStart], 
     [SeqEnd], 
     [StartUTC], 
     [EndUTC], 
     [StartLoc], 
     [StartType], 
     [EndLoc], 
     [EndType], 
     [Start Step], 
     [Start Ctn Status], 
     [Start Fill Status], 
     [EndStep], 
     [End Ctn Status], 
     [End Fill Status] 
FROM [Play].[getCycles3] 
    ("") AS X; 


@Detail = 
SELECT [CTNNumber], 
     [SeqNo] AS [SeqNo], 
     [LocationType], 
     [LocationID], 
     [BizstepDescription], 
     [ContainerStatus], 
     [FillStatus], 
     [UTCTimeStampforEvent] 
FROM [Play].[getRaw] 
    ("") AS Z; 

@result = 
    SELECT 
     H.[CTNNumber], H.[CTNCycleNo], H.[SeqStart], H.[SeqEnd] 
     ,COUNT([D].[SeqNo]) AS [SeqCount] 
     //, COUNT(DISTINCT [LocationID]) AS [#Locations] 
    FROM 
     @Header AS [H] 
     INNER JOIN 
     @Detail AS [D] 
     ON 
     [H].[CTNNumber] == [D].[CTNNumber] 
    WHERE 
     [D].[SeqNo] >= [H].[SeqStart] AND 
     [D].[SeqNo] <= [H].[SeqEnd] 
    GROUP BY 
     H.[CTNNumber], H.[CTNCycleNo], H.[SeqStart], H.[SeqEnd] 
    ; 

enter image description here

+0

かなり静かな...私はどちらかばかな質問をしたり、それがすべて間違って説明してきたことを意味している:ここで

は、CREATE STATISTICSを取り巻くいくつかのドキュメントです。 興味をそそるために何ができますか? – SimonB

答えて

1

私はMicrosoftのチケットとしてこのチケットを入力しました。 これは私が実装し成功させた彼らの反応です。

から:#######@microsoft.com 件名:RE:########### USQL仕事をここので戻る

問題を奇妙な仕事の計画と実行を表示しますカーディナリティーです。スクリプトが分割されると、U-SQLコンパイラは各中間ステップで作業する新しい入力を持ち、実際のデータサイズとその新しい入力の分布を把握しているため、オプティマイザはリソースを正確に割り当てることができます。

しかし、スクリプトをすべて1つにまとめると、オプティマイザの見積もりは非常に異なります。なぜなら、中間ステップの正確なサイズと分布がわからないからです。したがって、部分的に分割されたスクリプトと1つにまとめられたスクリプトの間には、見積もりにある程度の違いがあることが予想されます。

これらのような最適化の違いを防ぐには、表の列でCREATE STATISTICSを使用することをお勧めします。この場合、CTNNumber列にSTATISTICSを作成して、単一のジョブスクリプトのパフォーマンスを向上させるかどうかを確認する必要があります。 回答のhttps://docs.microsoft.com/en-us/sql/t-sql/statements/create-statistics-transact-sql

1

返事が遅れのために私の謝罪。私は旅行していて、これはちょうどレーダーから滑り落ちた。

問題は、オプティマイザが間違った見積もりを得て、パーティションを超えてしまう可能性があります。ファイルからデータを読み取ると、オプティマイザはコンパイル時に利用可能なより正確な情報を持っています。

より良い計画を得るために、結合の入力を生成しているクエリにOPTION(ROWCOUNT=x)ヒントを追加できますか?

関連する問題