USQL嵌套查询性能

时间:2017-09-21 09:33:56

标签: query-performance azure-data-lake u-sql

我有一个USQL查询,它可以在托管表中对400M记录自行运行。 但是在开发期间,我不想一直对所有记录运行它,所以我弹出一个where子句,运行它来获取一小部分数据,并在大约2分钟内完成(@ 5 AU),写作在我的数据湖中将结果输出到tsv。 很高兴。

但是,我现在想将它用作第二个查询和进一步处理的源。 所以我使用原始的USQL创建一个视图(减去where子句)。 然后测试一个新脚本:

'Select * from MyView WHERE <my original test filter>'.

现在我希望与原始原始查询大致同时执行。但相反,我得到4分钟,只有10%通过计划,并取消 - 有些事情是不对的。

没有专家阅读工作图,但...... 原始剧本以2 *'Extract Combine partition'开始,两者都读取了几个有人看不见的MB,我保存的View上的选择读取超过100GB !! 所以现阶段根本没有考虑where子句。

显然,这表明我对DLA在幕后工作的方式了解甚少!

有人请帮助我理解(a)发生的事情和(b)前进的道路以获得我需要的行为吗?

目前正在使用存储过程来将第一个结果存储在一个表中然后再针对它调用第二个查询 - 但与“传统”SQL Server相比,这似乎有点过分了吗?!

所有指针&amp;提示赞赏! 非常感谢

原始基本查询:

CREATE VIEW IF NOT EXISTS Play.[M3_CycleStartPoints]
AS

//@BASE = 
SELECT ROW_NUMBER() OVER (PARTITION BY A.[CTNNumber] ORDER BY A.[SeqNo]) AS [CTNCycleNo], A.[CTNNumber], A.[SeqNo], A.[BizstepDescription], A.[ContainerStatus], A.[FillStatus]
FROM 
 [Play].[RawData] AS A
 LEFT OUTER JOIN
     (
        SELECT [CTNNumber],[SeqNo]+1 AS [SeqNo],[FillStatus],[ContainerStatus],[BizstepDescription]
        FROM [Play].[RawData] 
        WHERE    [FillStatus] == "EMPTY" AND [AssetUsage] == "CYLINDER"
     ) AS B
           ON A.[CTNNumber] == B.[CTNNumber] AND A.[SeqNo] == B.[SeqNo]
WHERE (
        (A.[FillStatus] == "FULL" AND 
         A.[AssetUsage] == "CYLINDER" AND 
         B.[CTNNumber] == A.[CTNNumber]
        ) OR (
         A.[SeqNo] == 1 
        )
      );

      //AND A.[CTNNumber] == "BE52XH7";   
      //Only used to test when running script as stand-alone & output to tsv

第二次查询

SELECT *
FROM [Play].[M3_CycleStartPoints]
WHERE [CTNNumber] == "BE52XH7";

1 个答案:

答案 0 :(得分:0)

好的,我想我已经得到了这个,或者至少有一部分。

表值函数 http://www.sqlservercentral.com/articles/U-SQL/146839/

允许将参数传递给视图并返回结果。

仍然有兴趣找到一些关于这个主题的阅读材料。 来自T-SQL世界,似乎我仍有一些根本性的差异。