USQL 嵌套 TVF 和查询给出了可怕的结果
USQL Nesting TVFs and Queries is giving horrendous results
我 'think' 这个问题与 Azure Data Lake Analytics 所做的查询优化有关;但让我们看看...
我有 2 个单独的查询 (TVF) 进行聚合,然后有一个最终查询将这两个查询连接在一起以获得最终结果。
所以...
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% 的进度。
但随后,一切都乱套了!
最后一个节点是一个具有 2,500 个顶点的聚合,表示 16 分钟的计算时间。
所以我的问题...为什么 ??
这是我不了解 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]
;
很抱歉回复晚了。我正在旅行,这只是从雷达上溜走。
问题很可能是优化器得到了错误的估计并决定过度分区。如果您从文件中读取数据,优化器将在编译时提供更精确的信息。
您能否向生成连接输入的查询添加 OPTION(ROWCOUNT=x)
提示以获得更好的计划?
所以我输入了这个作为微软的门票。
这是他们的回应,我实施并取得了成功。
发件人:#######@microsoft.com
主题:回复:########### USQL 作业显示奇怪的作业计划和运行时返回
所以这里的问题是基数。当脚本被分解成多个部分时,U-SQL 编译器在每个中间步骤都有一个新的输入要处理,并且它知道新输入的实际数据大小和分布,因此优化器能够准确地分配资源。
然而,当脚本全部放在一个脚本中时,优化器的估计是非常不同的,因为它不知道那些中间步骤的确切大小和分布是什么。因此,我们预计被分解成多个部分的脚本和一个完整的脚本之间的估计会有一些差异。
防止此类优化差异的最佳方法是在 table 列上创建统计信息。在这种情况下,您应该在 CTNNumber 列上创建统计信息,看看这是否会提高单个作业脚本的性能。
这里有一些关于 CREATE STATISTICS 的文档:
https://docs.microsoft.com/en-us/sql/t-sql/statements/create-statistics-transact-sql
我 'think' 这个问题与 Azure Data Lake Analytics 所做的查询优化有关;但让我们看看...
我有 2 个单独的查询 (TVF) 进行聚合,然后有一个最终查询将这两个查询连接在一起以获得最终结果。 所以...
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% 的进度。 但随后,一切都乱套了! 最后一个节点是一个具有 2,500 个顶点的聚合,表示 16 分钟的计算时间。 所以我的问题...为什么 ??
这是我不了解 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]
;
很抱歉回复晚了。我正在旅行,这只是从雷达上溜走。
问题很可能是优化器得到了错误的估计并决定过度分区。如果您从文件中读取数据,优化器将在编译时提供更精确的信息。
您能否向生成连接输入的查询添加 OPTION(ROWCOUNT=x)
提示以获得更好的计划?
所以我输入了这个作为微软的门票。 这是他们的回应,我实施并取得了成功。
发件人:#######@microsoft.com 主题:回复:########### USQL 作业显示奇怪的作业计划和运行时返回
所以这里的问题是基数。当脚本被分解成多个部分时,U-SQL 编译器在每个中间步骤都有一个新的输入要处理,并且它知道新输入的实际数据大小和分布,因此优化器能够准确地分配资源。
然而,当脚本全部放在一个脚本中时,优化器的估计是非常不同的,因为它不知道那些中间步骤的确切大小和分布是什么。因此,我们预计被分解成多个部分的脚本和一个完整的脚本之间的估计会有一些差异。
防止此类优化差异的最佳方法是在 table 列上创建统计信息。在这种情况下,您应该在 CTNNumber 列上创建统计信息,看看这是否会提高单个作业脚本的性能。
这里有一些关于 CREATE STATISTICS 的文档: https://docs.microsoft.com/en-us/sql/t-sql/statements/create-statistics-transact-sql