首页 文章

USQL嵌套查询性能

提问于
浏览
0

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

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

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

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

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

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

有人请帮助我理解(a)发生了什么以及(b)获得我需要的行为的前进道路?

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

所有指针和提示赞赏!非常感谢

Original Base Query:

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

Second Query

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

1 回答

  • 0

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

    Table valued Functions http://www.sqlservercentral.com/articles/U-SQL/146839/

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

    尽管如此,仍有兴趣找到一些关于这个主题的阅读材料 . 来自T-SQL世界,似乎存在一些我仍在绊倒的根本差异 .

相关问题