USQL嵌套查询性能
USQL nested query performance
我有一个 USQL 查询,它 运行 单独针对托管 table 中的 400M 记录很好。
但是在开发过程中,我不想一直 运行 它针对所有记录,所以我弹出一个 where 子句, 运行 它用于一小部分数据,它在大约 2分钟(@5 个 AU),将结果写入我的数据湖中的 tsv。
对此很满意。
但是,我现在想将其用作第二次查询和进一步处理的来源。
所以我用原来的 USQL (减去 where 子句)创建了一个视图。
然后测试一个新脚本:
'Select * from MyView WHERE <my original test filter>'.
现在我期待它与原始原始查询大约同时执行。但是我只用了 4 分钟,只完成了计划的 10%,然后取消了——有些不对劲。
没有阅读工作图表的专家,但是...
原始脚本以 2* 'Extract Combine partition' 开始,两者都读取了数百 MB,我在保存的视图上的 select 读取了超过 100GB !!
所以在这个阶段根本没有考虑 where 子句。
显然,这表明我对 DLA 在幕后的工作方式知之甚少!
有人能帮我理解 (a) 发生了什么以及 (b) 获得我需要的行为的前进道路吗?
目前正在尝试使用存储过程将第一个结果存储在 table 中,然后针对该结果调用第二个查询 - 但与 'traditional' SQL 服务器相比似乎太过分了?!?
感谢所有指点和提示!
非常感谢
原始基础查询:
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";
好的,我想我明白了,或者至少部分明白了。
Table 值函数
http://www.sqlservercentral.com/articles/U-SQL/146839/
允许将参数传递给视图并return结果。
仍然有兴趣找到一些有关此主题的阅读材料 material。
来自 T-SQL 的世界,似乎有一些根本的差异我仍然被绊倒。
我有一个 USQL 查询,它 运行 单独针对托管 table 中的 400M 记录很好。 但是在开发过程中,我不想一直 运行 它针对所有记录,所以我弹出一个 where 子句, 运行 它用于一小部分数据,它在大约 2分钟(@5 个 AU),将结果写入我的数据湖中的 tsv。 对此很满意。
但是,我现在想将其用作第二次查询和进一步处理的来源。 所以我用原来的 USQL (减去 where 子句)创建了一个视图。 然后测试一个新脚本:
'Select * from MyView WHERE <my original test filter>'.
现在我期待它与原始原始查询大约同时执行。但是我只用了 4 分钟,只完成了计划的 10%,然后取消了——有些不对劲。
没有阅读工作图表的专家,但是... 原始脚本以 2* 'Extract Combine partition' 开始,两者都读取了数百 MB,我在保存的视图上的 select 读取了超过 100GB !! 所以在这个阶段根本没有考虑 where 子句。
显然,这表明我对 DLA 在幕后的工作方式知之甚少!
有人能帮我理解 (a) 发生了什么以及 (b) 获得我需要的行为的前进道路吗?
目前正在尝试使用存储过程将第一个结果存储在 table 中,然后针对该结果调用第二个查询 - 但与 'traditional' SQL 服务器相比似乎太过分了?!?
感谢所有指点和提示! 非常感谢
原始基础查询:
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";
好的,我想我明白了,或者至少部分明白了。
Table 值函数 http://www.sqlservercentral.com/articles/U-SQL/146839/
允许将参数传递给视图并return结果。
仍然有兴趣找到一些有关此主题的阅读材料 material。 来自 T-SQL 的世界,似乎有一些根本的差异我仍然被绊倒。