U-SQL - 加入 BETWEEN

U-SQL - Join BETWEEN

在 SQL 服务器中,我只是使用 BETWEEN 语句将时间范围分解为多个间隔记录。查询看起来类似于

SELECT
    a.UltimateID,  
    a.SiteID,
    ProductID,
    b.Date
FROM
    ss_UsageTracking a
    JOIN SELECTServerSchema.ss_fn_CreateDateTable(@StartDate, @EndDate, 1) b ON b.Date BETWEEN a.StartDate AND a.EndDate

这为 StartDate 和 EndDate 之间的每个数据提供了一条记录 我们已经找到了一种使用 UDF 进行爆炸的方法,其中 return 是一个 SQL 数组和一个 CROSS APPLY EXPLODE 语句。

我看到的问题是我们正在计算日期范围数百万次,行集中每行一次。这似乎是非常低效的,并且确实是处理时消耗时间的主要来源。

我已经创建了一种生成上面使用的日期 Table 的方法,并且想试验性能,但是 U-SQL 连接不支持 BETWEEN 语句。

为此应该使用什么方法?从文档中不清楚 CROSS APPLY 是否可以处理此问题。

我尝试在后面的代码中使用 UDF return 如果间隔介于两个日期之间则为真或假,但这只会导致错误 JOIN ON 子句只能在列上而不是 UDF 上

为什么U-SQL不支持BETWEEN(或其他非等值连接)表达式在join的ON子句中的原因在这里解释:https://msdn.microsoft.com/en-us/library/azure/mt621310.aspx。简而言之:我们目前只想在连接语法中公开可优化的连接,并使执行成本在其他情况下更加明显。

您可以使用 CROSS JOIN 执行连接并将 BETWEEN 谓词移动到 WHERE 子句中。

所以不用

@x = SELECT * FROM t JOIN s ON t.a BETWEEN s.beg AND s.end;

你写

@x = SELECT * FROM t CROSS JOIN s WHERE t.a BETWEEN s.beg AND s.end;

或者您可以在连接前的 select 子句中调用 UDF,然后在等值连接中使用 UDF 的列。

所以

@x = SELECT * FROM t JOIN s ON f(t.a) == s.b;

你会写

@t = SELECT *, f(a) AS fa FROM t;
@x = SELECT * FROM @t JOIN s ON t.fa == s.b; // note this includes fa in result

如果您宁愿让 U-SQL 为您重写,但代价是对性能影响的了解较少,请在 http://aka.ms/adlfeedback 提交请求。